From 8f0c6f7a1fd4a012a5c2770d9baf06370eccca74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Sun, 25 Jan 2015 00:56:23 -0300 Subject: [PATCH 001/166] common: function for drawing debug lines --- addons/common/XEH_preInit.sqf | 2 + .../functions/fnc_addLineToDebugDraw.sqf | 48 +++++++++++++++++++ .../fnc_createOrthonormalReference.sqf | 21 ++++++++ 3 files changed, 71 insertions(+) create mode 100644 addons/common/functions/fnc_addLineToDebugDraw.sqf create mode 100644 addons/common/functions/fnc_createOrthonormalReference.sqf diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index f33b3c47fe..498321b857 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -6,6 +6,7 @@ PREP(addActionEventHandler); PREP(addActionMenuEventHandler); PREP(addCameraEventHandler); PREP(addCustomEventHandler); +PREP(addLineToDebugDraw); PREP(addMapMarkerCreatedEventHandler); PREP(addScrollWheelEventHandler); PREP(adminKick); @@ -24,6 +25,7 @@ PREP(closeDialogIfTargetMoves); PREP(codeToLetter); PREP(codeToString); PREP(convertKeyCode); +PREP(createOrthonormalReference); PREP(currentChannel); PREP(disableUserInput); PREP(displayText); diff --git a/addons/common/functions/fnc_addLineToDebugDraw.sqf b/addons/common/functions/fnc_addLineToDebugDraw.sqf new file mode 100644 index 0000000000..cfe45359c9 --- /dev/null +++ b/addons/common/functions/fnc_addLineToDebugDraw.sqf @@ -0,0 +1,48 @@ +/* + * Author: CAA-Picard + * + * Add line to draw on debug + * + * Argument: + * 0: Start point ASL (Array) + * 1: End point ASL (Array) + * 2: Color (Array) + * + * Return value: + * + */ +#include "script_component.hpp" + +if (isNil QGVAR(debugLines)) then { + GVAR(debugLines) = []; + GVAR(debugLinesIndex) = 0; +}; + +if (count GVAR(debugLines) < 100) then { + GVAR(debugLines) pushBack _this; + GVAR(debugLinesIndex) = 0; +} else { + GVAR(debugLines) set [GVAR(debugLinesIndex), _this]; + GVAR(debugLinesIndex) = (GVAR(debugLinesIndex) + 1) mod 100; +}; + +if (isNil QGVAR(debugDrawHandler)) then { + GVAR(debugDrawHandler) = addMissionEventHandler ["Draw3D", { + if (count GVAR(debugLines) == 0) exitWith { + removeMissionEventHandler GVAR(debugDrawHandler); + GVAR(debugDrawHandler) = nil; + }; + + { + _p0 = _x select 0; + if (!surfaceIsWater _p0) then { + _p0 = ASLtoATL _p0; + }; + _p1 = _x select 1; + if (!surfaceIsWater _p1) then { + _p1 = ASLtoATL _p1; + }; + drawLine3D [_p0, _p1, _x select 2]; + } forEach GVAR(debugLines); + }]; +}; \ No newline at end of file diff --git a/addons/common/functions/fnc_createOrthonormalReference.sqf b/addons/common/functions/fnc_createOrthonormalReference.sqf new file mode 100644 index 0000000000..a92464a7f3 --- /dev/null +++ b/addons/common/functions/fnc_createOrthonormalReference.sqf @@ -0,0 +1,21 @@ +/* + * Author: CAA-Picard + * + * Returns a orthonormal system of reference aligned with the supplied vector + * + * Argument: + * Vector to align the coordinate system with (Array) + * + * Return value: + * 0: v1 (Array) + * 1: v2 (Array) + * 2: v3 (Array) + */ +#include "script_component.hpp" + +private ["_v1","_v2","_v3"]; +_v1 = vectorNormalized _this; +_v2 = vectorNormalized (_v1 vectorCrossProduct [0,0,1]); +_v3 = _v2 vectorCrossProduct _v1; + +[_v1,_v2,_v3] From 8d1ee8c2c2989241ee39b886c04f09728bb79c14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Sun, 25 Jan 2015 00:59:20 -0300 Subject: [PATCH 002/166] backblast: overhaul - Replace firedNear by firedBIS XEH - Calculate the origin of the backblast and overpressure zones using the projectile position and direction - Handle all effects for each unit on their local machine - Posibility of drawing effect cone for debug - Simplified angle calculations --- addons/backblast/CfgEventHandlers.hpp | 14 ++- addons/backblast/XEH_postInit.sqf | 4 + addons/backblast/XEH_preInit.sqf | 6 +- .../functions/fnc_backblastDamage.sqf | 67 ++++++++++++++ .../functions/fnc_fireLauncherBackblast.sqf | 91 +++++++++++++++++++ .../functions/fnc_fireOverpressureZone.sqf | 65 +++++++++++++ .../backblast/functions/fnc_getDistance.sqf | 45 +++++---- .../functions/fnc_launcherBackblast.sqf | 72 --------------- .../functions/fnc_overpressureDamage.sqf | 65 +++++++++++++ .../functions/fnc_tankDangerZone.sqf | 54 ----------- 10 files changed, 334 insertions(+), 149 deletions(-) create mode 100644 addons/backblast/XEH_postInit.sqf create mode 100644 addons/backblast/functions/fnc_backblastDamage.sqf create mode 100644 addons/backblast/functions/fnc_fireLauncherBackblast.sqf create mode 100644 addons/backblast/functions/fnc_fireOverpressureZone.sqf delete mode 100644 addons/backblast/functions/fnc_launcherBackblast.sqf create mode 100644 addons/backblast/functions/fnc_overpressureDamage.sqf delete mode 100644 addons/backblast/functions/fnc_tankDangerZone.sqf diff --git a/addons/backblast/CfgEventHandlers.hpp b/addons/backblast/CfgEventHandlers.hpp index a336a5dd41..979a683aeb 100644 --- a/addons/backblast/CfgEventHandlers.hpp +++ b/addons/backblast/CfgEventHandlers.hpp @@ -5,13 +5,21 @@ class Extended_PreInit_EventHandlers { }; }; -class Extended_FiredNear_EventHandlers { +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit) ); + }; +}; + +class Extended_FiredBIS_EventHandlers { class CAManBase { class GVAR(LauncherBackblast) { - FiredNear = QUOTE( if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 3 >> 'ACE_Backblast_Damage') > 0}) then {_this call FUNC(launcherBackblast)} ); + firedBIS = QUOTE( if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> 'ACE_Backblast_Damage') > 0}) then {_this call FUNC(fireLauncherBackblast)} ); }; + }; + class AllVehicles { class GVAR(TankDangerZone) { - FiredNear = QUOTE( if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 3 >> 'ACE_DangerZone_Damage') > 0}) then {_this call FUNC(tankDangerZone)} ); + firedBIS = QUOTE( if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> 'ACE_DangerZone_Damage') > 0}) then {_this call FUNC(fireOverpressureZone)} ); }; }; }; diff --git a/addons/backblast/XEH_postInit.sqf b/addons/backblast/XEH_postInit.sqf new file mode 100644 index 0000000000..72ca42a012 --- /dev/null +++ b/addons/backblast/XEH_postInit.sqf @@ -0,0 +1,4 @@ +#include "script_component.hpp" + +["backblast", FUNC(backblastDamage)] call EFUNC(common,addEventHandler); +["overpressure", FUNC(overpressureDamage)] call EFUNC(common,addEventHandler); diff --git a/addons/backblast/XEH_preInit.sqf b/addons/backblast/XEH_preInit.sqf index 1becf28c05..1927bc850b 100644 --- a/addons/backblast/XEH_preInit.sqf +++ b/addons/backblast/XEH_preInit.sqf @@ -1,5 +1,7 @@ #include "script_component.hpp" +PREP(backblastDamage); +PREP(fireLauncherBackblast); +PREP(fireOverpressureZone); PREP(getDistance); -PREP(launcherBackblast); -PREP(tankDangerZone); +PREP(overpressureDamage); diff --git a/addons/backblast/functions/fnc_backblastDamage.sqf b/addons/backblast/functions/fnc_backblastDamage.sqf new file mode 100644 index 0000000000..21d2e81736 --- /dev/null +++ b/addons/backblast/functions/fnc_backblastDamage.sqf @@ -0,0 +1,67 @@ +/* + * Author: Commy2 and CAA-Picard + * + * 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) + * + * Return value: + * None + */ +#include "script_component.hpp" + +EXPLODE_4_PVT(_this,_firer,_posASL,_direction,_weapon); + +private ["_backblastAngle","_backblastRange","_backblastDamage"]; +_backblastAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Angle") / 2; +_backblastRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Range"); +_backblastDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Damage"); +TRACE_4("Parameters:",_backblastAngle,_backblastRange,_backblastDamage,_weapon); + +_pos = _posASL; +if (!surfaceIsWater _pos) then { + _pos = ASLtoATL _pos; +}; + +_affected = _pos nearEntities ["CAManBase", _backblastRange]; +{ + _unit = _x; + if (local _unit && _unit != _firer && vehicle _unit == _unit) then { + + _targetPositionASL = eyePos _unit; + _relativePosition = _targetPositionASL vectorDiff _posASL; + _axisDistance = _relativePosition vectorDotProduct _direction; + _distance = vectorMagnitude _relativePosition; + _angle = acos (_axisDistance / _distance); + + _line = [_posASL, _targetPositionASL, _firer, _unit]; + _line2 = [_posASL, _targetPositionASL]; + TRACE_4("Affected:",_unit,_axisDistance,_distance,_angle); + if (_angle < _backblastAngle && {_distance < _backblastRange} && {!lineIntersects _line} && {!terrainIntersectASL _line2}) then { + _alpha = sqrt (1 - _distance / _backblastRange); + _beta = sqrt (1 - _angle / _backblastAngle); + + _damage = 2 * _alpha * _beta * _backblastDamage; + + // If the target is the ACE_player + if (_unit == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; + + // TODO: Sort this interaction with medical + if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { + [_unit, "HitBody", ([_unit, "", ((_unit getHitPointDamage "HitBody") + _damage), objNull, objNull] call EFUNC(medical,handleDamage))] call EFUNC(medical,setHitPointDamage); + _unit spawn { + sleep 0.5; + [_this, "", 0, objNull, objNull] call EFUNC(medical,handleDamage); + }; + } else { + _unit setDamage (damage _unit + _damage); + }; + }; + }; +} forEach _affected; + + diff --git a/addons/backblast/functions/fnc_fireLauncherBackblast.sqf b/addons/backblast/functions/fnc_fireLauncherBackblast.sqf new file mode 100644 index 0000000000..5970e7b9c2 --- /dev/null +++ b/addons/backblast/functions/fnc_fireLauncherBackblast.sqf @@ -0,0 +1,91 @@ +/* + * Author: Commy2 and CAA-Picard + * + * 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 + */ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +EXPLODE_7_PVT(_this,_firer,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + +// Prevent AI from causing backblast damage +if !([_firer] call EFUNC(common,isPlayer)) exitWith {}; + +private ["_position","_direction","_distance","_alpha","_beta","_damage","_affected"]; +_position = getPosASL _projectile; +_direction = [0, 0, 0] vectorDiff (vectorDir _projectile); + +private ["_backblastAngle","_backblastRange","_backblastDamage"]; +_backblastAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Angle") / 2; +_backblastRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Range"); +_backblastDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Damage"); + + +// Damage to others +_affected = getPos _projectile nearEntities ["CAManBase", _backblastRange]; +// Let each client handle their own affected units +["backblast", _affected, [_firer,_position,_direction,_weapon]] call EFUNC(common,targetEvent); + + +// Damage to the firer +_distance = [_position, _direction, _backblastRange] call FUNC(getDistance); +TRACE_1("Distance", _distance); + +if (_distance < _backblastRange) then { + + _alpha = sqrt (1 - _distance / _backblastRange); + _beta = sqrt 0.5; + + _damage = 2 * _alpha * _beta * _backblastDamage; + [_damage * 100] call BIS_fnc_bloodEffect; + + // TODO: Sort this interaction with medical + if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { + [_firer, "HitBody", ([_firer, "", ((_firer getHitPointDamage "HitBody") + _damage), objNull, objNull] call EFUNC(medical,handleDamage))] call EFUNC(medical,setHitPointDamage); + } else { + _firer setDamage (damage _firer + _damage); + }; +}; + +// Draw debug lines +#ifdef DEBUG_MODE_FULL + [ _position, + _position vectorAdd (_direction vectorMultiply _backblastRange), + [1,1,0,1] + ] call EFUNC(common,addLineToDebugDraw); + + _ref = _direction call EFUNC(common,createOrthonormalReference); + [ _position, + _position vectorAdd (_direction vectorMultiply _backblastRange) vectorAdd ((_ref select 1) vectorMultiply _backblastRange * tan _backblastAngle), + [1,1,0,1] + ] call EFUNC(common,addLineToDebugDraw); + [ _position, + _position vectorAdd (_direction vectorMultiply _backblastRange) vectorDiff ((_ref select 1) vectorMultiply _backblastRange * tan _backblastAngle), + [1,1,0,1] + ] call EFUNC(common,addLineToDebugDraw); + [ _position, + _position vectorAdd (_direction vectorMultiply _backblastRange) vectorAdd ((_ref select 2) vectorMultiply _backblastRange * tan _backblastAngle), + [1,1,0,1] + ] call EFUNC(common,addLineToDebugDraw); + [ _position, + _position vectorAdd (_direction vectorMultiply _backblastRange) vectorDiff ((_ref select 2) vectorMultiply _backblastRange * tan _backblastAngle), + [1,1,0,1] + ] call EFUNC(common,addLineToDebugDraw); + + [ _position, + _position vectorAdd (_direction vectorMultiply (_distance min _backblastRange)), + [1,0,0,1] + ] call EFUNC(common,addLineToDebugDraw); +#endif \ No newline at end of file diff --git a/addons/backblast/functions/fnc_fireOverpressureZone.sqf b/addons/backblast/functions/fnc_fireOverpressureZone.sqf new file mode 100644 index 0000000000..c638f4ad82 --- /dev/null +++ b/addons/backblast/functions/fnc_fireOverpressureZone.sqf @@ -0,0 +1,65 @@ +/* + * Author: Commy2 and CAA-Picard + * + * 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) + * + * Return value: + * None + *///#define DEBUG_MODE_FULL +#include "script_component.hpp" + +EXPLODE_7_PVT(_this,_firer,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + +// Prevent AI from causing backblast damage +if !([gunner _firer] call EFUNC(common,isPlayer)) exitWith {}; + +private ["_position","_direction","_distance","_alpha","_beta","_damage","_affected"]; +_position = getPosASL _projectile; +_direction = vectorDir _projectile; + +private ["_dangerZoneAngle","_dangerZoneRange","_dangerZoneDamage"]; +_dangerZoneAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Angle") / 2; +_dangerZoneRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Range"); +_dangerZoneDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Damage"); + + +// Damage to others +_affected = getPos _projectile nearEntities ["CAManBase", _dangerZoneRange]; +// Let each client handle their own affected units +["overpressure", _affected, [_firer,_position,_direction,_weapon]] call EFUNC(common,targetEvent); + +// Draw debug lines +#ifdef DEBUG_MODE_FULL + [ _position, + _position vectorAdd (_direction vectorMultiply _dangerZoneRange), + [1,0,0,1] + ] call EFUNC(common,addLineToDebugDraw); + + _ref = _direction call EFUNC(common,createOrthonormalReference); + [ _position, + _position vectorAdd (_direction vectorMultiply _dangerZoneRange) vectorAdd ((_ref select 1) vectorMultiply _dangerZoneRange * tan _dangerZoneAngle), + [1,1,0,1] + ] call EFUNC(common,addLineToDebugDraw); + [ _position, + _position vectorAdd (_direction vectorMultiply _dangerZoneRange) vectorDiff ((_ref select 1) vectorMultiply _dangerZoneRange * tan _dangerZoneAngle), + [1,1,0,1] + ] call EFUNC(common,addLineToDebugDraw); + [ _position, + _position vectorAdd (_direction vectorMultiply _dangerZoneRange) vectorAdd ((_ref select 2) vectorMultiply _dangerZoneRange * tan _dangerZoneAngle), + [1,1,0,1] + ] call EFUNC(common,addLineToDebugDraw); + [ _position, + _position vectorAdd (_direction vectorMultiply _dangerZoneRange) vectorDiff ((_ref select 2) vectorMultiply _dangerZoneRange * tan _dangerZoneAngle), + [1,1,0,1] + ] call EFUNC(common,addLineToDebugDraw); + +#endif \ No newline at end of file diff --git a/addons/backblast/functions/fnc_getDistance.sqf b/addons/backblast/functions/fnc_getDistance.sqf index 83b290e2b0..b6f61548c6 100644 --- a/addons/backblast/functions/fnc_getDistance.sqf +++ b/addons/backblast/functions/fnc_getDistance.sqf @@ -1,31 +1,40 @@ -// by commy2 +/* + * Author: Commy2 and CAA-Picard + * + * 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) + * + * Return value: + * Distance to intersection (+- 0.1 m) + */ #include "script_component.hpp" -private ["_position", "_direction", "_maxDistance", "_distance", "_iteration", "_laser", "_line"]; +private ["_distance", "_interval", "_line", "_line"]; -_position = + _this select 0; -_direction = + _this select 1; -_maxDistance = _this select 2; +EXPLODE_3_PVT(_this,_posASL,_direction,_maxDistance); _distance = _maxDistance; -_iteration = _distance; -_laser = []; -_line = [_position, _laser]; +_interval = _distance; +_line = [_posASL, []]; while { - _iteration > 0.1 + _interval > 0.1 } do { - _iteration = _iteration / 2; + _interval = _interval / 2; - _laser set [0, (_position select 0) - _distance * (_direction select 0)]; - _laser set [1, (_position select 1) - _distance * (_direction select 1)]; - _laser set [2, (_position select 2) - _distance * (_direction select 2)]; + _line set [1, _posASL vectorAdd (_direction vectorMultiply _distance)]; - _intersections = { - _x isKindOf "Static" || {_x isKindOf "AllVehicles"} - } count (lineIntersectsWith _line); + _intersections = { + _x isKindOf "Static" || {_x isKindOf "AllVehicles"} + } count (lineIntersectsWith _line); - _distance = _distance + ([1, -1] select (_intersections > 0)) * _iteration; + _distance = _distance + ([1, -1] select (_intersections > 0 || {terrainIntersectASL _line})) * _interval; + + if (_distance > _maxDistance) exitWith {_distance = 999}; }; -if (_distance > _maxDistance) then {999} else {_distance} +_distance diff --git a/addons/backblast/functions/fnc_launcherBackblast.sqf b/addons/backblast/functions/fnc_launcherBackblast.sqf deleted file mode 100644 index b2cde50c5d..0000000000 --- a/addons/backblast/functions/fnc_launcherBackblast.sqf +++ /dev/null @@ -1,72 +0,0 @@ -// by commy2 -#include "script_component.hpp" - -_unit = _this select 0; -_firer = _this select 1; -_distance = _this select 2; -_weapon = _this select 3; - -if (vehicle _unit != _unit || {!([_firer] call EFUNC(common,isPlayer))}) exitWith {}; - -_backblastAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Angle") / 2; -_backblastRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Range"); -_backblastDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Damage"); - -_position = eyePos _firer; -_direction = _firer weaponDirection currentWeapon _firer; - -if (_unit == _firer) then { - _distance = [_position, _direction, _backblastRange] call FUNC(getDistance); - hint format ["%1", _distance]; - if (_distance < _backblastRange) then { - _alpha = sqrt (1 - _distance / _backblastRange); - _beta = sqrt 0.5; - - _damage = 2 * _alpha * _beta * _backblastDamage; - [_damage * 100] call BIS_fnc_bloodEffect; - - // TODO: Sort this interaction with medical - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { - [_unit, "HitBody", ([_unit, "", ((_unit getHitPointDamage "HitBody") + _damage), objNull, objNull] call EFUNC(medical,handleDamage))] call EFUNC(medical,setHitPointDamage); - } else { - _unit setDamage (damage _unit + _damage); - }; - - }; -} else { - _direction = [0, 0, 0] vectorDiff _direction; - - _azimuth = (_direction select 0) atan2 (_direction select 1); - _inclination = asin (_direction select 2); - - _relativePosition = eyePos _unit; - _relativeDirection = _relativePosition vectorDiff _position; - - _relativeAzimuth = (_relativeDirection select 0) atan2 (_relativeDirection select 1); - _relativeInclination = asin (_relativeDirection select 2); - - _angle = sqrt ((_relativeAzimuth - _azimuth) ^ 2 + (_relativeInclination - _inclination) ^ 2); - _distance = vectorMagnitude _relativeDirection; - - _line = [_position, _relativePosition]; - - if (_angle < _backblastAngle && {_distance < _backblastRange} && {!lineIntersects _line} && {!terrainIntersectASL _line}) then { - _alpha = sqrt (1 - _distance / _backblastRange); - _beta = sqrt (1 - _angle / _backblastAngle); - - _damage = 2 * _alpha * _beta * _backblastDamage; - if (_unit == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; - - // TODO: Sort this interaction with medical - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { - [_unit, "HitBody", ([_unit, "", ((_unit getHitPointDamage "HitBody") + _damage), objNull, objNull] call EFUNC(medical,handleDamage))] call EFUNC(medical,setHitPointDamage); - _unit spawn { - sleep 0.5; - [_this, "", 0, objNull, objNull] call EFUNC(medical,handleDamage); - }; - } else { - _unit setDamage (damage _unit + _damage); - }; - - }; -}; diff --git a/addons/backblast/functions/fnc_overpressureDamage.sqf b/addons/backblast/functions/fnc_overpressureDamage.sqf new file mode 100644 index 0000000000..5dd7447ce8 --- /dev/null +++ b/addons/backblast/functions/fnc_overpressureDamage.sqf @@ -0,0 +1,65 @@ +/* + * Author: Commy2 and CAA-Picard + * + * Calculate and apply overpressure 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) + * + * Return value: + * None + */ +#include "script_component.hpp" + +EXPLODE_4_PVT(_this,_firer,_posASL,_direction,_weapon); + +private ["_dangerZoneAngle","_dangerZoneRange","_dangerZoneDamage"]; +_dangerZoneAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Angle") / 2; +_dangerZoneRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Range"); +_dangerZoneDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Damage"); +TRACE_4("Parameters:",_dangerZoneAngle,_dangerZoneRange,_dangerZoneDamage,_weapon); + +_pos = _posASL; +if (!surfaceIsWater _pos) then { + _pos = ASLtoATL _pos; +}; + +_affected = _pos nearEntities ["CAManBase", _dangerZoneRange]; +{ + _unit = _x; + if (local _unit && _unit != _firer && vehicle _unit == _unit) then { + + _targetPositionASL = eyePos _unit; + _relativePosition = _targetPositionASL vectorDiff _posASL; + _axisDistance = _relativePosition vectorDotProduct _direction; + _distance = vectorMagnitude _relativePosition; + _angle = acos (_axisDistance / _distance); + + _line = [_posASL, _targetPositionASL, _firer, _unit]; + _line2 = [_posASL, _targetPositionASL]; + TRACE_4("Affected:",_unit,_axisDistance,_distance,_angle); + if (_angle < _dangerZoneAngle && {_distance < _dangerZoneRange} && {!lineIntersects _line} && {!terrainIntersectASL _line2}) then { + _alpha = sqrt (1 - _distance / _dangerZoneRange); + _beta = sqrt (1 - _angle / _dangerZoneAngle); + + _damage = 2 * _alpha * _beta * _dangerZoneDamage; + + // If the target is the ACE_player + if (_unit == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; + + // @todo: Sort this interaction with medical + if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { + [_unit, "HitBody", ([_unit, "", ((_unit getHitPointDamage "HitBody") + _damage), objNull, objNull] call EFUNC(medical,handleDamage))] call EFUNC(medical,setHitPointDamage); + _unit spawn { + sleep 0.5; + [_this, "", 0, objNull, objNull] call EFUNC(medical,handleDamage); + }; + } else { + _unit setDamage (damage _unit + _damage); + }; + }; + }; +} forEach _affected; diff --git a/addons/backblast/functions/fnc_tankDangerZone.sqf b/addons/backblast/functions/fnc_tankDangerZone.sqf deleted file mode 100644 index 0371ec9620..0000000000 --- a/addons/backblast/functions/fnc_tankDangerZone.sqf +++ /dev/null @@ -1,54 +0,0 @@ -// by commy2 -#include "script_component.hpp" - -#define BARREL_MUZZLE "usti hlavne" - -_unit = _this select 0; -_vehicle = vehicle (_this select 1); -_distance = _this select 2; -_weapon = _this select 3; - -if (vehicle _unit != _unit || {!([gunner _firer] call EFUNC(common,isPlayer))}) exitWith {}; - -_dangerZoneAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Angle") / 2; -_dangerZoneRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Range"); -_dangerZoneDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Damage"); - -_position = ATLToASL (_vehicle modelToWorld (_vehicle selectionPosition BARREL_MUZZLE)); -_direction = _vehicle weaponDirection _weapon; - -if (_unit != _vehicle) then { - _azimuth = (_direction select 0) atan2 (_direction select 1); - _inclination = asin (_direction select 2); - - _relativePosition = eyePos _unit; - _relativeDirection = _relativePosition vectorDiff _position; - - _relativeAzimuth = (_relativeDirection select 0) atan2 (_relativeDirection select 1); - _relativeInclination = asin (_relativeDirection select 2); - - _angle = sqrt ((_relativeAzimuth - _azimuth) ^ 2 + (_relativeInclination - _inclination) ^ 2); - _distance = vectorMagnitude _relativeDirection; - - _line = [_position, _relativePosition]; - - if (_angle < _dangerZoneAngle && {_distance < _dangerZoneRange} && {!lineIntersects (_line + [_vehicle])} && {!terrainIntersectASL _line}) then { - _alpha = sqrt (1 - _distance / _dangerZoneRange); - _beta = sqrt (1 - _angle / _dangerZoneAngle); - - _damage = 2 * _alpha * _beta * _dangerZoneDamage; - if (_unit == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; - - // TODO: Sort this interaction with medical - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { - [_unit, "HitBody", ([_unit, "", ((_unit getHitPointDamage "HitBody") + _damage), objNull, objNull] call EFUNC(medical,handleDamage))] call EFUNC(medical,setHitPointDamage); - _unit spawn { - sleep 0.5; - [_this, "", 0, objNull, objNull] call EFUNC(medical,handleDamage); - }; - } else { - _unit setDamage (damage _unit + _damage); - }; - - }; -}; From 05d209191cf60d82ac8581a50f0f2fda18079d3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Sun, 25 Jan 2015 01:05:19 -0300 Subject: [PATCH 003/166] common: fixed fnc_addLineToDebugDraw --- addons/common/functions/fnc_addLineToDebugDraw.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/functions/fnc_addLineToDebugDraw.sqf b/addons/common/functions/fnc_addLineToDebugDraw.sqf index cfe45359c9..1c7d5d5cd1 100644 --- a/addons/common/functions/fnc_addLineToDebugDraw.sqf +++ b/addons/common/functions/fnc_addLineToDebugDraw.sqf @@ -29,7 +29,7 @@ if (count GVAR(debugLines) < 100) then { if (isNil QGVAR(debugDrawHandler)) then { GVAR(debugDrawHandler) = addMissionEventHandler ["Draw3D", { if (count GVAR(debugLines) == 0) exitWith { - removeMissionEventHandler GVAR(debugDrawHandler); + removeMissionEventHandler ["Draw3D", GVAR(debugDrawHandler)]; GVAR(debugDrawHandler) = nil; }; From 30cd9a7499eda9287e7ae4815f8a349dd6041206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Sun, 25 Jan 2015 01:16:44 -0300 Subject: [PATCH 004/166] me too --- addons/backblast/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/backblast/config.cpp b/addons/backblast/config.cpp index 88de936cf9..8c59163c54 100644 --- a/addons/backblast/config.cpp +++ b/addons/backblast/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; - author[] = {"commy2", "KoffeinFlummi"}; + author[] = {"commy2", "KoffeinFlummi", "CAA-Picard"}; authorUrl = "https://github.com/commy2/"; VERSION_CONFIG; }; From 38655980956b905f31efe7c0feee27b9d58323d1 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 2 Feb 2015 19:48:33 -0600 Subject: [PATCH 005/166] AGM_Captives --- .../captives}/UI/agm_cabletie_x_ca.paa | Bin .../Captives => addons/captives}/UI/captive_ca.paa | Bin .../Captives => addons/captives}/UI/handcuff_ca.paa | Bin .../Captives => addons/captives}/agm_cabletie.p3d | Bin .../agm/Captives => addons/captives}/clientInit.sqf | 0 .../agm/Captives => addons/captives}/config.cpp | 0 .../captives}/functions/fn_canFriskPerson.sqf | 0 .../captives}/functions/fn_canLoadCaptive.sqf | 0 .../captives}/functions/fn_canUnloadCaptive.sqf | 0 .../captives}/functions/fn_escortCaptive.sqf | 0 .../captives}/functions/fn_handleGetOut.sqf | 0 .../captives}/functions/fn_handleKnockedOut.sqf | 0 .../captives}/functions/fn_handlePlayerChanged.sqf | 0 .../captives}/functions/fn_handleWokeUp.sqf | 0 .../captives}/functions/fn_initPost.sqf | 0 .../captives}/functions/fn_initUnit.sqf | 0 .../captives}/functions/fn_loadCaptive.sqf | 0 .../captives}/functions/fn_openFriskMenu.sqf | 0 .../captives}/functions/fn_setCaptive.sqf | 0 .../captives}/functions/fn_surrender.sqf | 0 .../captives}/functions/fn_unloadCaptive.sqf | 0 .../Captives => addons/captives}/stringtable.xml | 0 22 files changed, 0 insertions(+), 0 deletions(-) rename {TO_MERGE/agm/Captives => addons/captives}/UI/agm_cabletie_x_ca.paa (100%) rename {TO_MERGE/agm/Captives => addons/captives}/UI/captive_ca.paa (100%) rename {TO_MERGE/agm/Captives => addons/captives}/UI/handcuff_ca.paa (100%) rename {TO_MERGE/agm/Captives => addons/captives}/agm_cabletie.p3d (100%) rename {TO_MERGE/agm/Captives => addons/captives}/clientInit.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/config.cpp (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_canFriskPerson.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_canLoadCaptive.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_canUnloadCaptive.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_escortCaptive.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_handleGetOut.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_handleKnockedOut.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_handlePlayerChanged.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_handleWokeUp.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_initPost.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_initUnit.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_loadCaptive.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_openFriskMenu.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_setCaptive.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_surrender.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/functions/fn_unloadCaptive.sqf (100%) rename {TO_MERGE/agm/Captives => addons/captives}/stringtable.xml (100%) diff --git a/TO_MERGE/agm/Captives/UI/agm_cabletie_x_ca.paa b/addons/captives/UI/agm_cabletie_x_ca.paa similarity index 100% rename from TO_MERGE/agm/Captives/UI/agm_cabletie_x_ca.paa rename to addons/captives/UI/agm_cabletie_x_ca.paa diff --git a/TO_MERGE/agm/Captives/UI/captive_ca.paa b/addons/captives/UI/captive_ca.paa similarity index 100% rename from TO_MERGE/agm/Captives/UI/captive_ca.paa rename to addons/captives/UI/captive_ca.paa diff --git a/TO_MERGE/agm/Captives/UI/handcuff_ca.paa b/addons/captives/UI/handcuff_ca.paa similarity index 100% rename from TO_MERGE/agm/Captives/UI/handcuff_ca.paa rename to addons/captives/UI/handcuff_ca.paa diff --git a/TO_MERGE/agm/Captives/agm_cabletie.p3d b/addons/captives/agm_cabletie.p3d similarity index 100% rename from TO_MERGE/agm/Captives/agm_cabletie.p3d rename to addons/captives/agm_cabletie.p3d diff --git a/TO_MERGE/agm/Captives/clientInit.sqf b/addons/captives/clientInit.sqf similarity index 100% rename from TO_MERGE/agm/Captives/clientInit.sqf rename to addons/captives/clientInit.sqf diff --git a/TO_MERGE/agm/Captives/config.cpp b/addons/captives/config.cpp similarity index 100% rename from TO_MERGE/agm/Captives/config.cpp rename to addons/captives/config.cpp diff --git a/TO_MERGE/agm/Captives/functions/fn_canFriskPerson.sqf b/addons/captives/functions/fn_canFriskPerson.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_canFriskPerson.sqf rename to addons/captives/functions/fn_canFriskPerson.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_canLoadCaptive.sqf b/addons/captives/functions/fn_canLoadCaptive.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_canLoadCaptive.sqf rename to addons/captives/functions/fn_canLoadCaptive.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_canUnloadCaptive.sqf b/addons/captives/functions/fn_canUnloadCaptive.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_canUnloadCaptive.sqf rename to addons/captives/functions/fn_canUnloadCaptive.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_escortCaptive.sqf b/addons/captives/functions/fn_escortCaptive.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_escortCaptive.sqf rename to addons/captives/functions/fn_escortCaptive.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_handleGetOut.sqf b/addons/captives/functions/fn_handleGetOut.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_handleGetOut.sqf rename to addons/captives/functions/fn_handleGetOut.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_handleKnockedOut.sqf b/addons/captives/functions/fn_handleKnockedOut.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_handleKnockedOut.sqf rename to addons/captives/functions/fn_handleKnockedOut.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_handlePlayerChanged.sqf b/addons/captives/functions/fn_handlePlayerChanged.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_handlePlayerChanged.sqf rename to addons/captives/functions/fn_handlePlayerChanged.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_handleWokeUp.sqf b/addons/captives/functions/fn_handleWokeUp.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_handleWokeUp.sqf rename to addons/captives/functions/fn_handleWokeUp.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_initPost.sqf b/addons/captives/functions/fn_initPost.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_initPost.sqf rename to addons/captives/functions/fn_initPost.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_initUnit.sqf b/addons/captives/functions/fn_initUnit.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_initUnit.sqf rename to addons/captives/functions/fn_initUnit.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_loadCaptive.sqf b/addons/captives/functions/fn_loadCaptive.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_loadCaptive.sqf rename to addons/captives/functions/fn_loadCaptive.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_openFriskMenu.sqf b/addons/captives/functions/fn_openFriskMenu.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_openFriskMenu.sqf rename to addons/captives/functions/fn_openFriskMenu.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_setCaptive.sqf b/addons/captives/functions/fn_setCaptive.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_setCaptive.sqf rename to addons/captives/functions/fn_setCaptive.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_surrender.sqf b/addons/captives/functions/fn_surrender.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_surrender.sqf rename to addons/captives/functions/fn_surrender.sqf diff --git a/TO_MERGE/agm/Captives/functions/fn_unloadCaptive.sqf b/addons/captives/functions/fn_unloadCaptive.sqf similarity index 100% rename from TO_MERGE/agm/Captives/functions/fn_unloadCaptive.sqf rename to addons/captives/functions/fn_unloadCaptive.sqf diff --git a/TO_MERGE/agm/Captives/stringtable.xml b/addons/captives/stringtable.xml similarity index 100% rename from TO_MERGE/agm/Captives/stringtable.xml rename to addons/captives/stringtable.xml From 982f3b230ad0a2a9d1ccf6c6f3a7f798f87729c8 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 2 Feb 2015 20:04:50 -0600 Subject: [PATCH 006/166] Captives First Pass --- addons/captives/$PBOPREFIX$ | 1 + addons/captives/CfgEventHandlers.hpp | 57 +++ addons/captives/CfgMoves.hpp | 90 +++++ addons/captives/CfgVehicles.hpp | 157 ++++++++ addons/captives/CfgWeapons.hpp | 15 + ..._cabletie_x_ca.paa => ace_cabletie_ca.paa} | Bin addons/captives/XEH_postInitClient.sqf | 3 + addons/captives/XEH_preInit.sqf | 22 + addons/captives/agm_cabletie.p3d | Bin 49251 -> 0 bytes addons/captives/clientInit.sqf | 3 - addons/captives/config.cpp | 381 ++---------------- .../captives/functions/fn_canFriskPerson.sqf | 21 - .../captives/functions/fn_canLoadCaptive.sqf | 35 -- .../functions/fn_canUnloadCaptive.sqf | 23 -- .../captives/functions/fn_escortCaptive.sqf | 43 -- addons/captives/functions/fn_handleGetOut.sqf | 14 - .../functions/fn_handlePlayerChanged.sqf | 12 - addons/captives/functions/fn_handleWokeUp.sqf | 10 - addons/captives/functions/fn_initPost.sqf | 11 - addons/captives/functions/fn_initUnit.sqf | 12 - addons/captives/functions/fn_setCaptive.sqf | 57 --- .../captives/functions/fn_unloadCaptive.sqf | 31 -- .../captives/functions/fnc_canFriskPerson.sqf | 23 ++ .../captives/functions/fnc_canLoadCaptive.sqf | 38 ++ .../functions/fnc_canUnloadCaptive.sqf | 28 ++ .../captives/functions/fnc_escortCaptive.sqf | 55 +++ .../captives/functions/fnc_handleGetOut.sqf | 29 ++ ...nockedOut.sqf => fnc_handleKnockedOut.sqf} | 0 .../functions/fnc_handlePlayerChanged.sqf | 25 ++ .../captives/functions/fnc_handleWokeUp.sqf | 23 ++ addons/captives/functions/fnc_initPost.sqf | 24 ++ addons/captives/functions/fnc_initUnit.sqf | 29 ++ ...fn_loadCaptive.sqf => fnc_loadCaptive.sqf} | 33 +- ...penFriskMenu.sqf => fnc_openFriskMenu.sqf} | 44 +- addons/captives/functions/fnc_setCaptive.sqf | 59 +++ .../{fn_surrender.sqf => fnc_surrender.sqf} | 43 +- .../captives/functions/fnc_unloadCaptive.sqf | 35 ++ .../captives/functions/script_component.hpp | 1 + addons/captives/models/ace_cabletie.p3d | Bin 0 -> 52371 bytes addons/captives/models/ace_default.rvmat | 79 ++++ addons/captives/script_component.hpp | 12 + addons/captives/stringtable.xml | 24 +- 42 files changed, 907 insertions(+), 695 deletions(-) create mode 100644 addons/captives/$PBOPREFIX$ create mode 100644 addons/captives/CfgEventHandlers.hpp create mode 100644 addons/captives/CfgMoves.hpp create mode 100644 addons/captives/CfgVehicles.hpp create mode 100644 addons/captives/CfgWeapons.hpp rename addons/captives/UI/{agm_cabletie_x_ca.paa => ace_cabletie_ca.paa} (100%) create mode 100644 addons/captives/XEH_postInitClient.sqf create mode 100644 addons/captives/XEH_preInit.sqf delete mode 100644 addons/captives/agm_cabletie.p3d delete mode 100644 addons/captives/clientInit.sqf delete mode 100644 addons/captives/functions/fn_canFriskPerson.sqf delete mode 100644 addons/captives/functions/fn_canLoadCaptive.sqf delete mode 100644 addons/captives/functions/fn_canUnloadCaptive.sqf delete mode 100644 addons/captives/functions/fn_escortCaptive.sqf delete mode 100644 addons/captives/functions/fn_handleGetOut.sqf delete mode 100644 addons/captives/functions/fn_handlePlayerChanged.sqf delete mode 100644 addons/captives/functions/fn_handleWokeUp.sqf delete mode 100644 addons/captives/functions/fn_initPost.sqf delete mode 100644 addons/captives/functions/fn_initUnit.sqf delete mode 100644 addons/captives/functions/fn_setCaptive.sqf delete mode 100644 addons/captives/functions/fn_unloadCaptive.sqf create mode 100644 addons/captives/functions/fnc_canFriskPerson.sqf create mode 100644 addons/captives/functions/fnc_canLoadCaptive.sqf create mode 100644 addons/captives/functions/fnc_canUnloadCaptive.sqf create mode 100644 addons/captives/functions/fnc_escortCaptive.sqf create mode 100644 addons/captives/functions/fnc_handleGetOut.sqf rename addons/captives/functions/{fn_handleKnockedOut.sqf => fnc_handleKnockedOut.sqf} (100%) create mode 100644 addons/captives/functions/fnc_handlePlayerChanged.sqf create mode 100644 addons/captives/functions/fnc_handleWokeUp.sqf create mode 100644 addons/captives/functions/fnc_initPost.sqf create mode 100644 addons/captives/functions/fnc_initUnit.sqf rename addons/captives/functions/{fn_loadCaptive.sqf => fnc_loadCaptive.sqf} (52%) rename addons/captives/functions/{fn_openFriskMenu.sqf => fnc_openFriskMenu.sqf} (54%) create mode 100644 addons/captives/functions/fnc_setCaptive.sqf rename addons/captives/functions/{fn_surrender.sqf => fnc_surrender.sqf} (53%) create mode 100644 addons/captives/functions/fnc_unloadCaptive.sqf create mode 100644 addons/captives/functions/script_component.hpp create mode 100644 addons/captives/models/ace_cabletie.p3d create mode 100644 addons/captives/models/ace_default.rvmat create mode 100644 addons/captives/script_component.hpp diff --git a/addons/captives/$PBOPREFIX$ b/addons/captives/$PBOPREFIX$ new file mode 100644 index 0000000000..aac16576c4 --- /dev/null +++ b/addons/captives/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\captives \ No newline at end of file diff --git a/addons/captives/CfgEventHandlers.hpp b/addons/captives/CfgEventHandlers.hpp new file mode 100644 index 0000000000..eb08f7e865 --- /dev/null +++ b/addons/captives/CfgEventHandlers.hpp @@ -0,0 +1,57 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient)); + }; +}; + +//release escorted captive when entering a vehicle +class Extended_GetIn_EventHandlers { + class All { + class GVAR(AutoDetachCaptive) { + getIn = "if (local (_this select 2) && {(_this select 2) getVariable ['ACE_isEscorting', false]}) then {(_this select 2) setVariable ['ACE_isEscorting', false, true]}"; + }; + }; +}; + +//reset captive animation after leaving vehicle +class Extended_GetOut_EventHandlers { + class All { + class GVAR(AutoDetachCaptive) { + getOut = "if (local (_this select 2) && {(_this select 2) getVariable ['ACE_isCaptive', false]}) then {_this call ACE_Captives_fnc_handleGetOut}"; + }; + }; +}; + +//reset captivity and escorting status when getting killed +class Extended_Killed_EventHandlers { + class CAManBase { + class GVAR(AutoDetachCaptive) { + killed = "if ((_this select 0) getVariable ['ACE_isCaptive', false]) then {(_this select 0) setVariable ['ACE_isCaptive', false, true]}; if ((_this select 0) getVariable ['ACE_isEscorting', false]) then {(_this select 0) setVariable ['ACE_isEscorting', false, true]};"; + }; + }; +}; + +//handle captive and unconsciousness state +class Extended_Init_EventHandlers { + class CAManBase { + class GVAR(AutoDetachCaptive) { + init = "_this call ACE_Captives_fnc_initUnit"; + }; + }; +}; + +//mission start +class Extended_InitPost_EventHandlers { + class CAManBase { + class GVAR(InitPost) { + init = "if (local (_this select 0)) then {_this call ACE_Captives_fnc_initPost};"; + }; + }; +}; + diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp new file mode 100644 index 0000000000..da43b21aae --- /dev/null +++ b/addons/captives/CfgMoves.hpp @@ -0,0 +1,90 @@ +class CfgMovesBasic { + class Actions { + class CivilStandActions; + class ACE_CivilStandCaptiveActions: CivilStandActions { + turnL = ""; + turnR = ""; + stop = "ACE_AmovPercMstpScapWnonDnon"; + StopRelaxed = "ACE_AmovPercMstpScapWnonDnon"; + default = "ACE_AmovPercMstpScapWnonDnon"; + getOver = ""; + throwPrepare = ""; + throwGrenade[] = {"","Gesture"}; + }; + }; +}; + +class CfgMovesMaleSdr: CfgMovesBasic { + class StandBase; + class States { + class AmovPercMstpSnonWnonDnon: StandBase { + ConnectTo[] += {"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1}; + }; + + class CutSceneAnimationBase; + class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon: CutSceneAnimationBase { + actions = "ACE_CivilStandCaptiveActions"; + file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_EaseIn"; + speed = 1; + looped = 0; + interpolationRestart = 2; + ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon",0.1}; + InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; + }; + + class ACE_AmovPercMstpScapWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon { + file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_Ease"; + speed = 0; + ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; + InterpolateTo[] = {"Unconscious",0.01}; + looped = 1; + }; + + 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}; + }; + }; +}; + +/* +player playMove "ACE_AmovPercMstpScapWnonDnon"; +player switchMove "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon"; +*/ + +/*class CfgMovesBasic; +class CfgMovesMaleSdr: CfgMovesBasic { + class States { + class CutSceneAnimationBase; + class AmovPercMstpSnonWnonDnon_EaseIn: CutSceneAnimationBase { + head = "headDefault"; + static = 1; + disableWeapons = 0; + forceAim = 0; + InterpolateTo[] = {"AmovPercMstpSnonWnonDnon_EaseOut",0.02,"Unconscious",0.1}; + }; + class AmovPercMstpSnonWnonDnon_Ease: AmovPercMstpSnonWnonDnon_EaseIn { + looped = 1; + InterpolateTo[] = {"Unconscious",0.1}; + }; + class AmovPercMstpSnonWnonDnon_EaseOut: AmovPercMstpSnonWnonDnon_EaseIn { + InterpolateTo[] = {"AmovPercMstpSnonWnonDnon_EaseIn",0.02,"Unconscious",0.1}; + }; + + class AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon: CutSceneAnimationBase { + InterpolateTo[] = {"Unconscious",0.01,"AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; + }; + + class AmovPercMstpSsurWnonDnon: AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { + looped = 1; + InterpolateTo[] = {"Unconscious",0.01}; + }; + + class AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { + InterpolateTo[] = {"Unconscious",0.01,"AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon",0.1}; + }; + }; +};*/ + diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp new file mode 100644 index 0000000000..3036ccf196 --- /dev/null +++ b/addons/captives/CfgVehicles.hpp @@ -0,0 +1,157 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_Actions { + class ACE_SetCaptive { + displayName = "$STR_ACE_Captives_SetCaptive"; + distance = 4; + condition = "'ACE_CableTie' in items _player && {alive _target} && {!(_target getVariable ['ACE_isCaptive', false])}"; + statement = "player removeItem 'ACE_CableTie'; [_target, true] call ACE_Captives_fnc_setCaptive"; + showDisabled = 0; + priority = 2.4; + icon = "\ACE_Captives\UI\handcuff_ca.paa"; + hotkey = "C"; + }; + class ACE_ReleaseCaptive { + displayName = "$STR_ACE_Captives_ReleaseCaptive"; + distance = 4; + condition = "_target getVariable ['ACE_isCaptive', false] && {isNull (attachedTo _target)}"; + statement = "[_target, false] call ACE_Captives_fnc_setCaptive"; + exceptions[] = {"ACE_Interaction_isNotEscorting"}; + showDisabled = 0; + priority = 2.4; + icon = "\ACE_Captives\UI\handcuff_ca.paa"; + hotkey = "R"; + }; + class ACE_EscortCaptive { + displayName = "$STR_ACE_Captives_EscortCaptive"; + distance = 4; + condition = "_target getVariable ['ACE_isCaptive', false] && {isNull (attachedTo _target)} && {alive _target} && {!(_target getVariable ['ACE_isUnconscious', false])}"; + statement = "[_target, true] call ACE_Captives_fnc_escortCaptive"; + exceptions[] = {"ACE_Interaction_isNotEscorting"}; + showDisabled = 0; + icon = "\ACE_Captives\UI\captive_ca.paa"; + priority = 2.3; + hotkey = "E"; + }; + class ACE_StopEscorting { + displayName = "$STR_ACE_Captives_StopEscorting"; + distance = 4; + condition = "_target getVariable ['ACE_isCaptive', false] && {_target in attachedObjects _player}"; + statement = "[_target, false] call ACE_Captives_fnc_escortCaptive"; + exceptions[] = {"ACE_Interaction_isNotEscorting"}; + showDisabled = 0; + icon = "\ACE_Captives\UI\captive_ca.paa"; + priority = 2.3; + hotkey = "E"; + }; + class ACE_LoadCaptive { + displayName = "$STR_ACE_Captives_LoadCaptive"; + distance = 4; + condition = "[_player, _target, objNull] call ACE_Captives_fnc_canLoadCaptive"; + statement = "[_player, _target, objNull] call ACE_Captives_fnc_loadCaptive"; + exceptions[] = {"ACE_Interaction_isNotEscorting"}; + showDisabled = 0; + icon = "\ACE_Captives\UI\captive_ca.paa"; + priority = 2.2; + hotkey = "L"; + }; + class ACE_FriskPerson { + displayName = "$STR_ACE_Captives_FriskPerson"; + distance = 2; + condition = "[_player, _target] call ACE_Captives_fnc_canFriskPerson"; + statement = "[_player, _target] call ACE_Captives_fnc_openFriskMenu"; + showDisabled = 0; + //icon = ""; //@todo + priority = 3; + hotkey = "F"; + }; + }; + + class ACE_SelfActions { + class ACE_StopEscortingSelf { + displayName = "$STR_ACE_Captives_StopEscorting"; + condition = "(_player getVariable ['ACE_escortedUnit', objNull]) getVariable ['ACE_isCaptive', false] && {(_player getVariable ['ACE_escortedUnit', objNull]) in attachedObjects _player}"; + statement = "[_player getVariable ['ACE_escortedUnit', objNull], false] call ACE_Captives_fnc_escortCaptive;"; + exceptions[] = {"ACE_Interaction_isNotEscorting"}; + showDisabled = 0; + priority = 2.3; + hotkey = "C"; + }; + /*class ACE_LoadCaptiveSelf { + displayName = "$STR_ACE_Captives_LoadCaptive"; + condition = "[_player, objNull, objNull] call ACE_Captives_fnc_canLoadCaptiveIntoVehicle"; + statement = "[_player, objNull, objNull] call ACE_Captives_fnc_loadCaptiveIntoVehicle"; + exceptions[] = {"ACE_Interaction_isNotEscorting"}; + showDisabled = 0; + priority = 2.2; + hotkey = "K"; + };*/ + }; + }; + + #define MACRO_LOADUNLOADCAPTIVE \ + class ACE_Actions { \ + class ACE_LoadCaptive { \ + displayName = "$STR_ACE_Captives_LoadCaptive"; \ + distance = 4; \ + condition = "[_player, objNull, _target] call ACE_Captives_fnc_canLoadCaptive"; \ + statement = "[_player, objNull, _target] call ACE_Captives_fnc_loadCaptive"; \ + exceptions[] = {"ACE_Interaction_isNotEscorting"}; \ + showDisabled = 0; \ + priority = 1.2; \ + hotkey = "L"; \ + }; \ + class ACE_UnloadCaptive { \ + displayName = "$STR_ACE_Captives_UnloadCaptive"; \ + distance = 4; \ + condition = "[_player, _target] call ACE_Captives_fnc_canUnloadCaptive"; \ + statement = "[_player, _target] call ACE_Captives_fnc_unloadCaptive"; \ + showDisabled = 0; \ + priority = 1.2; \ + hotkey = "C"; \ + }; \ + }; + + class LandVehicle; + class Car: LandVehicle { + MACRO_LOADUNLOADCAPTIVE + }; + class Tank: LandVehicle { + MACRO_LOADUNLOADCAPTIVE + }; + + class Air; + class Helicopter: Air { + MACRO_LOADUNLOADCAPTIVE + }; + class Plane: Air { + MACRO_LOADUNLOADCAPTIVE + }; + + class Ship; + class Ship_F: Ship { + MACRO_LOADUNLOADCAPTIVE + }; + + class StaticWeapon: LandVehicle { + MACRO_LOADUNLOADCAPTIVE + }; + + class StaticMortar; + class Mortar_01_base_F: StaticMortar { + MACRO_LOADUNLOADCAPTIVE + }; + + #define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ + name = #ITEM; \ + count = COUNT; \ + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_CableTie,12) + }; + }; +}; diff --git a/addons/captives/CfgWeapons.hpp b/addons/captives/CfgWeapons.hpp new file mode 100644 index 0000000000..3005a2fa5c --- /dev/null +++ b/addons/captives/CfgWeapons.hpp @@ -0,0 +1,15 @@ +class CfgWeapons { + class ACE_ItemCore; + class InventoryItem_Base_F; + + class ACE_CableTie: ACE_ItemCore { + displayName = "$STR_ACE_Captives_CableTie"; + descriptionShort = "$STR_ACE_Captives_CableTieDescription"; + model = QUOTE(PATHTOF(models\ace_cabletie.p3d)); + picture = QUOTE(PATHTOF(UI\ace_cabletie_ca.paa)); + scope = 2; + class ItemInfo: InventoryItem_Base_F { + mass = 1; + }; + }; +}; diff --git a/addons/captives/UI/agm_cabletie_x_ca.paa b/addons/captives/UI/ace_cabletie_ca.paa similarity index 100% rename from addons/captives/UI/agm_cabletie_x_ca.paa rename to addons/captives/UI/ace_cabletie_ca.paa diff --git a/addons/captives/XEH_postInitClient.sqf b/addons/captives/XEH_postInitClient.sqf new file mode 100644 index 0000000000..a08c5d4239 --- /dev/null +++ b/addons/captives/XEH_postInitClient.sqf @@ -0,0 +1,3 @@ +// by commy2 + +[missionNamespace, "playerChanged", {_this call ACE_Captives_fnc_handlePlayerChanged}] call ACE_Core_fnc_addCustomEventhandler; diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf new file mode 100644 index 0000000000..5e6f35bc48 --- /dev/null +++ b/addons/captives/XEH_preInit.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(empty); +PREP(canFriskPerson); +PREP(canLoadCaptive); +PREP(canUnloadCaptive); +PREP(escortCaptive); +PREP(handleGetOut); +PREP(handleKnockedOut); +PREP(handlePlayerChanged); +PREP(handleWokeUp); +PREP(initPost); +PREP(initUnit); +PREP(loadCaptive); +PREP(openFriskMenu); +PREP(setCaptive); +PREP(surrender); +PREP(unloadCaptive); + +ADDON = true; diff --git a/addons/captives/agm_cabletie.p3d b/addons/captives/agm_cabletie.p3d deleted file mode 100644 index e0804b8c5ff7324feead360c873d5bd44fec4f6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49251 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 uksC3-KC1Zz{{J8SkOke44;t5%V(5 0} diff --git a/addons/captives/functions/fn_canUnloadCaptive.sqf b/addons/captives/functions/fn_canUnloadCaptive.sqf deleted file mode 100644 index 8c52bac0b0..0000000000 --- a/addons/captives/functions/fn_canUnloadCaptive.sqf +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Author: commy2 - * - * Check if the unit can unload a captive from the vehicle. - * - * Argument: - * 0: Unit that wants to unload a captive (Object) - * 1: Vehicle to unload a captive from. (Object) - * - * Return value: - * Boolean (Bool) - */ - -private ["_unit", "_vehicle", "_cargo"]; - -_unit = _this select 0; -_vehicle = _this select 1; - -_cargo = crew _vehicle; // Can also unload from driver, gunner, commander, turret positions. They shouldn't be there anyway. - -_cargo = [_cargo, {_this getVariable ["AGM_isCaptive", false]}] call AGM_Core_fnc_filter; - -count _cargo > 0 diff --git a/addons/captives/functions/fn_escortCaptive.sqf b/addons/captives/functions/fn_escortCaptive.sqf deleted file mode 100644 index 55244cf2f8..0000000000 --- a/addons/captives/functions/fn_escortCaptive.sqf +++ /dev/null @@ -1,43 +0,0 @@ -//author : Nic547 -//Attaches a Captive to the player - -private ["_unit", "_state"]; - -_unit = _this select 0; -_state = _this select 1; - -if !("AGM_Handcuffed" in ([_unit] call AGM_Core_fnc_getCaptivityStatus)) exitWith { - [localize "STR_AGM_Captives_NoCaptive"] call AGM_Core_fnc_displayTextStructured; -}; - -if (_state) then { - if (player getVariable ["AGM_isEscorting", false]) exitWith {}; - - [player, _unit] call AGM_Core_fnc_claim; - player setVariable ["AGM_isEscorting", true, true]; - - _unit attachTo [player, [0, 1, 0]]; - - player setVariable ["AGM_escortedUnit", _unit, true]; - _actionID = player addAction [format ["%1", localize "STR_AGM_Captives_StopEscorting"], "[player getVariable ['AGM_escortedUnit', objNull], false] call AGM_Captives_fnc_escortCaptive;", nil, 20, false, true, "", "!isNull (player getVariable ['AGM_escortedUnit', objNull])"]; - - [_unit, _actionID] spawn { - _unit = _this select 0; - _actionID = _this select 1; - - while {player getVariable ["AGM_isEscorting", false]} do { - sleep 0.2; - - if (!alive _unit || {!alive player} || {!canStand _unit} || {!canStand player} || {_unit getVariable ["AGM_isUnconscious", false]} || {player getVariable ["AGM_isUnconscious", false]} || {!isNull (attachedTo player)}) then { - player setVariable ["AGM_isEscorting", false, true]; - }; - }; - [objNull, _unit] call AGM_Core_fnc_claim; - - detach _unit; - player removeAction _actionID; - }; -} else { - player setVariable ["AGM_isEscorting", false, true]; - player setVariable ["AGM_escortedUnit", objNull, true]; -}; diff --git a/addons/captives/functions/fn_handleGetOut.sqf b/addons/captives/functions/fn_handleGetOut.sqf deleted file mode 100644 index 0cb88b0a8e..0000000000 --- a/addons/captives/functions/fn_handleGetOut.sqf +++ /dev/null @@ -1,14 +0,0 @@ -// by commy2 - -private ["_vehicle", "_unit", "_cargoIndex"]; - -_vehicle = _this select 0; -_unit = _this select 2; - -_cargoIndex = _unit getVariable ["AGM_Captives_CargoIndex", -1]; - -if (_cargoIndex != -1) exitWith { - _unit moveInCargo [_vehicle, _cargoIndex]; -}; - -[_unit, 'AGM_AmovPercMstpScapWnonDnon', 2] call AGM_Core_fnc_doAnimation; diff --git a/addons/captives/functions/fn_handlePlayerChanged.sqf b/addons/captives/functions/fn_handlePlayerChanged.sqf deleted file mode 100644 index 5bece824f9..0000000000 --- a/addons/captives/functions/fn_handlePlayerChanged.sqf +++ /dev/null @@ -1,12 +0,0 @@ -// by commy2 - -private ["_unit", "_oldUnit"]; - -_unit = _this select 0; -_oldUnit = _this select 1; - -if (_unit getVariable ["AGM_isCaptive", false]) then { - showHUD false; -} else { - showHUD true; -}; diff --git a/addons/captives/functions/fn_handleWokeUp.sqf b/addons/captives/functions/fn_handleWokeUp.sqf deleted file mode 100644 index facbf9b31f..0000000000 --- a/addons/captives/functions/fn_handleWokeUp.sqf +++ /dev/null @@ -1,10 +0,0 @@ -// by commy2 - -private "_unit"; - -_unit = _this select 0; - -if (_unit getVariable ["AGM_isCaptive", false] && {vehicle _unit == _unit}) then { - [_unit] call AGM_Core_fnc_fixLoweredRifleAnimation; - [_unit, "AGM_AmovPercMstpScapWnonDnon", 0] call AGM_Core_fnc_doAnimation; -}; diff --git a/addons/captives/functions/fn_initPost.sqf b/addons/captives/functions/fn_initPost.sqf deleted file mode 100644 index 73c9674f7a..0000000000 --- a/addons/captives/functions/fn_initPost.sqf +++ /dev/null @@ -1,11 +0,0 @@ -// by commy2 - -private "_unit"; - -_unit = _this select 0; - -// reset status on mission start -if (_unit getVariable ["AGM_isCaptive", false]) then { - _unit setVariable ["AGM_isCaptive", false]; - [_unit, true] call AGM_Captives_fnc_setCaptive; -}; diff --git a/addons/captives/functions/fn_initUnit.sqf b/addons/captives/functions/fn_initUnit.sqf deleted file mode 100644 index 76d4671b7f..0000000000 --- a/addons/captives/functions/fn_initUnit.sqf +++ /dev/null @@ -1,12 +0,0 @@ -// by commy2 - -[_this select 0, "knockedOut", { - if (local (_this select 0)) then {_this call AGM_Captives_fnc_handleKnockedOut}; -}] call AGM_Core_fnc_addCustomEventhandler; - -[_this select 0, "wokeUp", { - if (local (_this select 0)) then {_this call AGM_Captives_fnc_handleWokeUp}; -}] call AGM_Core_fnc_addCustomEventhandler; - -// prevent players from throwing grenades -[_this select 0, "Throw", {(_this select 1) getVariable ["AGM_isCaptive", false]}, {}] call AGM_Core_fnc_addActionEventhandler; diff --git a/addons/captives/functions/fn_setCaptive.sqf b/addons/captives/functions/fn_setCaptive.sqf deleted file mode 100644 index a2e4ed7e3e..0000000000 --- a/addons/captives/functions/fn_setCaptive.sqf +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Author: Nic547, commy2 - * - * Makes a civilian unable to move. - * - * Argument: - * 0: Unit (Object) - * 1: True to take captive, false to release captive (Object) - * - * Return value: - * Nothing - */ - -private ["_unit", "_state"]; - -_unit = _this select 0; -_state = _this select 1; - -if (!local _unit) exitWith {[[_unit, _state, true], _fnc_scriptName, _unit] call AGM_Core_fnc_execRemoteFnc}; - -if (_state) then { - if (_unit getVariable ["AGM_isCaptive", false]) exitWith {}; - - _unit setVariable ["AGM_isCaptive", true, true]; - - // fix anim on mission start (should work on dedicated servers) - _unit spawn { - [_this, "AGM_Handcuffed", true] call AGM_Core_fnc_setCaptivityStatus; - - if (_this getVariable ["AGM_isCaptive", false] && {vehicle _this == _this}) then { - [_this] call AGM_Core_fnc_fixLoweredRifleAnimation; - [_this, "AGM_AmovPercMstpScapWnonDnon", 0] spawn AGM_Core_fnc_doAnimation; - }; - }; - - _unit setVariable ["AGM_Captives_CargoIndex", vehicle _unit getCargoIndex _unit, true]; - - if (_unit == AGM_player) then { - showHUD false; - }; -} else { - if !(_unit getVariable ["AGM_isCaptive", false]) exitWith {}; - - _unit setVariable ["AGM_isCaptive", false, true]; - [_unit, "AGM_Handcuffed", false] call AGM_Core_fnc_setCaptivityStatus; - if (vehicle _unit == _unit) then { - [_unit, "AGM_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call AGM_Core_fnc_doAnimation; - }; - - if (_unit getVariable ["AGM_Captives_CargoIndex", -1] != -1) then { - _unit setVariable ["AGM_Captives_CargoIndex", -1, true]; - }; - - if (_unit == AGM_player) then { - showHUD true; - }; -}; diff --git a/addons/captives/functions/fn_unloadCaptive.sqf b/addons/captives/functions/fn_unloadCaptive.sqf deleted file mode 100644 index e7849f1c0e..0000000000 --- a/addons/captives/functions/fn_unloadCaptive.sqf +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Author: commy2 - * - * Unit unloads a captive from a vehicle. - * - * Argument: - * 0: Unit that wants to unload a captive (Object) - * 1: Vehicle to unload a captive from. (Object) - * - * Return value: - * Nothing - */ - -private ["_unit", "_vehicle", "_cargo", "_target"]; - -_unit = _this select 0; -_vehicle = _this select 1; - -_cargo = crew _vehicle; // Can also unload from driver, gunner, commander, turret positions. They shouldn't be there anyway. - -_cargo = [_cargo, {_this getVariable ["AGM_isCaptive", false]}] call AGM_Core_fnc_filter; - -if (count _cargo > 0) then { - _target = _cargo select 0; - - _target setVariable ["AGM_Captives_CargoIndex", -1, true]; - - moveOut _target; - [_target, "AGM_AmovPercMstpScapWnonDnon", 2] call AGM_Core_fnc_doAnimation; - [_target, "{unassignVehicle _this}", _target] call AGM_Core_fnc_execRemoteFnc; -}; diff --git a/addons/captives/functions/fnc_canFriskPerson.sqf b/addons/captives/functions/fnc_canFriskPerson.sqf new file mode 100644 index 0000000000..62d5a06742 --- /dev/null +++ b/addons/captives/functions/fnc_canFriskPerson.sqf @@ -0,0 +1,23 @@ +/* + * Author: bux578 + * Checks the conditions for being able to frisk a unit + * + * Arguments: + * 0: caller (player) + * 1: target + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_target); + +_target getVariable ["ACE_isCaptive", false] +|| {_target getVariable ["ACE_isSearchable", false]} +|| {_target getVariable ["ACE_isUnconscious", false]} diff --git a/addons/captives/functions/fnc_canLoadCaptive.sqf b/addons/captives/functions/fnc_canLoadCaptive.sqf new file mode 100644 index 0000000000..b8021e602f --- /dev/null +++ b/addons/captives/functions/fnc_canLoadCaptive.sqf @@ -0,0 +1,38 @@ +/* + * Author: commy2 + * Check if the unit can load the target object into a vehicle. + * + * Arguments: + * 0: Unit that wants to load a captive + * 1: A captive. ObjNull for the first escorted captive + * 2: Vehicle to load the captive into. ObjNull for the nearest vehicle + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +private ["_objects"]; + +PARAMS_3(_unit,_target,_vehicle); + +if (isNull _target) then { + _objects = attachedObjects _unit; + _objects = [_objects, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); + _target = _objects select 0; +}; + +if (isNull _vehicle) then { + _objects = nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship_F"], 10]; + _vehicle = _objects select 0; +}; + +_unit getVariable ["ACE_isEscorting", false] +&& {!isNil "_target"} +&& {!isNil "_vehicle"} +&& {_vehicle emptyPositions "cargo" > 0} diff --git a/addons/captives/functions/fnc_canUnloadCaptive.sqf b/addons/captives/functions/fnc_canUnloadCaptive.sqf new file mode 100644 index 0000000000..b714ebc8ae --- /dev/null +++ b/addons/captives/functions/fnc_canUnloadCaptive.sqf @@ -0,0 +1,28 @@ +/* + * Author: commy2 + * Check if the unit can unload a captive from the vehicle. + * + * Arguments: + * 0: Unit that wants to unload a captive + * 1: A captive. ObjNull for the first escorted captive + * 2: Vehicle to unload a captive from + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +private ["_cargo"]; + +PARAMS_2(_unit,_vehicle); + +_cargo = crew _vehicle; // Can also unload from driver, gunner, commander, turret positions. They shouldn't be there anyway. + +_cargo = [_cargo, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); + +count _cargo > 0 diff --git a/addons/captives/functions/fnc_escortCaptive.sqf b/addons/captives/functions/fnc_escortCaptive.sqf new file mode 100644 index 0000000000..c3030a9d33 --- /dev/null +++ b/addons/captives/functions/fnc_escortCaptive.sqf @@ -0,0 +1,55 @@ +/* + * Author: Nic547 + * Attaches a Captive to the player + * + * Arguments: + * 0: _unit + * 1: _state + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_state); + +if !("ACE_Handcuffed" in ([_unit] call ACE_Core_fnc_getCaptivityStatus)) exitWith { + [localize "STR_ACE_Captives_NoCaptive"] call EFUNC(common,displayTextStructured); +}; + +if (_state) then { + if (player getVariable ["ACE_isEscorting", false]) exitWith {}; + + [player, _unit] call EFUNC(common,claim); + player setVariable ["ACE_isEscorting", true, true]; + + _unit attachTo [player, [0, 1, 0]]; + + player setVariable ["ACE_escortedUnit", _unit, true]; + _actionID = player addAction [format ["%1", localize "STR_ACE_Captives_StopEscorting"], "[player getVariable ['ACE_escortedUnit', objNull], false] call ACE_Captives_fnc_escortCaptive;", nil, 20, false, true, "", "!isNull (player getVariable ['ACE_escortedUnit', objNull])"]; + + [_unit, _actionID] spawn { + _unit = _this select 0; + _actionID = _this select 1; + + while {player getVariable ["ACE_isEscorting", false]} do { + sleep 0.2; + + if (!alive _unit || {!alive player} || {!canStand _unit} || {!canStand player} || {_unit getVariable ["ACE_isUnconscious", false]} || {player getVariable ["ACE_isUnconscious", false]} || {!isNull (attachedTo player)}) then { + player setVariable ["ACE_isEscorting", false, true]; + }; + }; + [objNull, _unit] call EFUNC(common,claim); + + detach _unit; + player removeAction _actionID; + }; +} else { + player setVariable ["ACE_isEscorting", false, true]; + player setVariable ["ACE_escortedUnit", objNull, true]; +}; diff --git a/addons/captives/functions/fnc_handleGetOut.sqf b/addons/captives/functions/fnc_handleGetOut.sqf new file mode 100644 index 0000000000..7cc1fd6f5c --- /dev/null +++ b/addons/captives/functions/fnc_handleGetOut.sqf @@ -0,0 +1,29 @@ +/* + * Author: commy2 + * X + * + * Arguments: + * 0: _vehicle + * 1: _unit + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_vehicle,_unit); + +private ["_cargoIndex"]; + +_cargoIndex = _unit getVariable ["ACE_Captives_CargoIndex", -1]; + +if (_cargoIndex != -1) exitWith { + _unit moveInCargo [_vehicle, _cargoIndex]; +}; + +[_unit, 'ACE_AmovPercMstpScapWnonDnon', 2] call EFUNC(common,doAnimation); diff --git a/addons/captives/functions/fn_handleKnockedOut.sqf b/addons/captives/functions/fnc_handleKnockedOut.sqf similarity index 100% rename from addons/captives/functions/fn_handleKnockedOut.sqf rename to addons/captives/functions/fnc_handleKnockedOut.sqf diff --git a/addons/captives/functions/fnc_handlePlayerChanged.sqf b/addons/captives/functions/fnc_handlePlayerChanged.sqf new file mode 100644 index 0000000000..fea03cfe16 --- /dev/null +++ b/addons/captives/functions/fnc_handlePlayerChanged.sqf @@ -0,0 +1,25 @@ +/* + * Author: commy2 + * TODO + * + * Arguments: + * 0: _unit + * 1: _oldUnit + * + * Return Value: + * The return value + * + * Example: + * TODO + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_oldUnit); + +if (_unit getVariable ["ACE_isCaptive", false]) then { + showHUD false; +} else { + showHUD true; +}; diff --git a/addons/captives/functions/fnc_handleWokeUp.sqf b/addons/captives/functions/fnc_handleWokeUp.sqf new file mode 100644 index 0000000000..cbcd2a07ae --- /dev/null +++ b/addons/captives/functions/fnc_handleWokeUp.sqf @@ -0,0 +1,23 @@ +/* + * Author: commy2 + * TODO + * + * Arguments: + * 0: _unit + * + * Return Value: + * The return value + * + * Example: + * TODO + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_unit); + +if (_unit getVariable ["ACE_isCaptive", false] && {vehicle _unit == _unit}) then { + [_unit] call EFUNC(common,fixLoweredRifleAnimation); + [_unit, "ACE_AmovPercMstpScapWnonDnon", 0] call EFUNC(common,doAnimation); +}; diff --git a/addons/captives/functions/fnc_initPost.sqf b/addons/captives/functions/fnc_initPost.sqf new file mode 100644 index 0000000000..5c116be417 --- /dev/null +++ b/addons/captives/functions/fnc_initPost.sqf @@ -0,0 +1,24 @@ +/* + * Author: commy2 + * TODO + * + * Arguments: + * 0: _unit + * + * Return Value: + * The return value + * + * Example: + * TODO + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_unit); + +// reset status on mission start +if (_unit getVariable ["ACE_isCaptive", false]) then { + _unit setVariable ["ACE_isCaptive", false]; + [_unit, true] call ACE_Captives_fnc_setCaptive; +}; diff --git a/addons/captives/functions/fnc_initUnit.sqf b/addons/captives/functions/fnc_initUnit.sqf new file mode 100644 index 0000000000..13777dca1d --- /dev/null +++ b/addons/captives/functions/fnc_initUnit.sqf @@ -0,0 +1,29 @@ +/* + * Author: commy2 + * TODO + * + * Arguments: + * 0: _unit + * + * Return Value: + * The return value + * + * Example: + * TODO + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_unit); + +[_unit, "knockedOut", { + if (local (_this select 0)) then {_this call ACE_Captives_fnc_handleKnockedOut}; +}] call ACE_Core_fnc_addCustomEventhandler; + +[_unit, "wokeUp", { + if (local (_this select 0)) then {_this call ACE_Captives_fnc_handleWokeUp}; +}] call ACE_Core_fnc_addCustomEventhandler; + +// prevent players from throwing grenades +[_unit, "Throw", {(_this select 1) getVariable ["ACE_isCaptive", false]}, {}] call ACE_Core_fnc_addActionEventhandler; diff --git a/addons/captives/functions/fn_loadCaptive.sqf b/addons/captives/functions/fnc_loadCaptive.sqf similarity index 52% rename from addons/captives/functions/fn_loadCaptive.sqf rename to addons/captives/functions/fnc_loadCaptive.sqf index 12bcb35f9b..255581a593 100644 --- a/addons/captives/functions/fn_loadCaptive.sqf +++ b/addons/captives/functions/fnc_loadCaptive.sqf @@ -1,26 +1,27 @@ /* * Author: commy2 - * * Unit loads the target object into a vehicle. - * - * Argument: - * 0: Unit that wants to load a captive (Object) - * 1: A captive. ObjNull for the first escorted captive (Object) - * 2: Vehicle to load the captive into. ObjNull for the nearest vehicle (Object) - * - * Return value: + * + * Arguments: + * 0: Unit that wants to load a captive + * 1: A captive. ObjNull for the first escorted captive + * 2: Vehicle to load the captive into. ObjNull for the nearest vehicle + * + * Return Value: * Nothing + * + * Example: + * TODO + * + * Public: No */ +#include "script_component.hpp" -private ["_unit", "_target", "_vehicle", "_objects"]; - -_unit = _this select 0; -_target = _this select 1; -_vehicle = _this select 2; +PARAMS_1(_unit,_target,_vehicle); if (isNull _target) then { _objects = attachedObjects _unit; - _objects = [_objects, {_this getVariable ["AGM_isCaptive", false]}] call AGM_Core_fnc_filter; + _objects = [_objects, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); _target = _objects select 0; }; @@ -30,6 +31,6 @@ if (isNull _vehicle) then { }; if (!isNil "_target" && {!isNil "_vehicle"}) then { - _unit setVariable ["AGM_isEscorting", false]; - [[_target, _vehicle], "{(_this select 0) moveInCargo (_this select 1); (_this select 0) assignAsCargo (_this select 1); (_this select 0) setVariable ['AGM_Captives_CargoIndex', (_this select 1) getCargoIndex (_this select 0), true];}", _target] call AGM_Core_fnc_execRemoteFnc; + _unit setVariable ["ACE_isEscorting", false]; + [[_target, _vehicle], "{(_this select 0) moveInCargo (_this select 1); (_this select 0) assignAsCargo (_this select 1); (_this select 0) setVariable ['ACE_Captives_CargoIndex', (_this select 1) getCargoIndex (_this select 0), true];}", _target] call ACE_Core_fnc_execRemoteFnc; }; diff --git a/addons/captives/functions/fn_openFriskMenu.sqf b/addons/captives/functions/fnc_openFriskMenu.sqf similarity index 54% rename from addons/captives/functions/fn_openFriskMenu.sqf rename to addons/captives/functions/fnc_openFriskMenu.sqf index c7f60ba2e6..42dda4ab66 100644 --- a/addons/captives/functions/fn_openFriskMenu.sqf +++ b/addons/captives/functions/fnc_openFriskMenu.sqf @@ -1,33 +1,33 @@ /* - Name: AGM_Captives_fnc_openFriskMenu - - Author: bux578 - - Description: - Open the select menu with the "personal" items of a frisked unit - It only shows "handgunWeapon", "uniformItems", "vestItems", "backpackItems" and "assignedItems" because every other item is visible on the character - - Parameters: - 0: Object - player unit - 1: Object - unit + * Author: bux578 + * Open the select menu with the "personal" items of a frisked unit. It only shows "handgunWeapon", "uniformItems", "vestItems", "backpackItems" and "assignedItems" because every other item is visible on the character + * + * Arguments: + * 0: player unit + * 1: unit + * + * Return Value: + * Nothing + * + * Example: + * TODO + * + * Public: No + */ +#include "script_component.hpp" - Returns: - Nothing -*/ +private ["_weapon", "_listedItemClasses", "_actions", "_allGear"]; -private ["_player", "_unit", "_weapon", "_listedItemClasses", "_actions", "_allGear"]; - -_player = _this select 0; -_unit = _this select 1; +PARAMS_2(_player,_unit); _weapon = currentWeapon _player; if (_weapon == primaryWeapon _player && {_weapon != ""}) then { - [_player, "AmovPercMstpSlowWrflDnon", 0] call AGM_Core_fnc_doAnimation; + [_player, "AmovPercMstpSlowWrflDnon", 0] call EFUNC(common,doAnimation); }; _listedItemClasses = []; -_actions = [localize "STR_AGM_Captives_FriskMenuHeader", localize "STR_AGM_Captives_CancelSelection"] call AGM_Interaction_fnc_prepareSelectMenu; +_actions = [localize "STR_ACE_Captives_FriskMenuHeader", localize "STR_ACE_Captives_CancelSelection"] call ACE_Interaction_fnc_prepareSelectMenu; _allGear = []; @@ -59,12 +59,12 @@ if (count (assignedItems _unit) > 0) then { if (isNil "_item" || str _item == "") then { //str _item ? _item = configFile >> "CfgWeapons" >> _x; }; - _actions = [_actions, getText(_item >> "displayName"), getText(_item >> "picture"), _x] call AGM_Interaction_fnc_addSelectableItem; + _actions = [_actions, getText(_item >> "displayName"), getText(_item >> "picture"), _x] call ACE_Interaction_fnc_addSelectableItem; _listedItemClasses pushBack _x; }; } forEach (_allGear); -[_actions, {call AGM_Interaction_fnc_hideMenu;}, {call AGM_Interaction_fnc_hideMenu;}] call AGM_Interaction_fnc_openSelectMenu; +[_actions, {call ACE_Interaction_fnc_hideMenu;}, {call ACE_Interaction_fnc_hideMenu;}] call ACE_Interaction_fnc_openSelectMenu; // don't need an "Ok" Button ctrlShow [8860, false]; diff --git a/addons/captives/functions/fnc_setCaptive.sqf b/addons/captives/functions/fnc_setCaptive.sqf new file mode 100644 index 0000000000..38ce997a88 --- /dev/null +++ b/addons/captives/functions/fnc_setCaptive.sqf @@ -0,0 +1,59 @@ +/* + * Author: Nic547, commy2 + * Makes a civilian unable to move. + * + * Arguments: + * 0: Unit + * 1: True to take captive, false to release captive + * + * Return Value: + * Nothing + * + * Example: + * TODO + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_state); + +if (!local _unit) exitWith {[[_unit, _state, true], _fnc_scriptName, _unit] call ACE_Core_fnc_execRemoteFnc}; + +if (_state) then { + if (_unit getVariable ["ACE_isCaptive", false]) exitWith {}; + + _unit setVariable ["ACE_isCaptive", true, true]; + + // fix anim on mission start (should work on dedicated servers) + _unit spawn { + [_this, "ACE_Handcuffed", true] call ACE_Core_fnc_setCaptivityStatus; + + if (_this getVariable ["ACE_isCaptive", false] && {vehicle _this == _this}) then { + [_this] call EFUNC(common,fixLoweredRifleAnimation); + [_this, "ACE_AmovPercMstpScapWnonDnon", 0] spawn EFUNC(common,doAnimation); + }; + }; + + _unit setVariable ["ACE_Captives_CargoIndex", vehicle _unit getCargoIndex _unit, true]; + + if (_unit == ACE_player) then { + showHUD false; + }; +} else { + if !(_unit getVariable ["ACE_isCaptive", false]) exitWith {}; + + _unit setVariable ["ACE_isCaptive", false, true]; + [_unit, "ACE_Handcuffed", false] call ACE_Core_fnc_setCaptivityStatus; + if (vehicle _unit == _unit) then { + [_unit, "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + }; + + if (_unit getVariable ["ACE_Captives_CargoIndex", -1] != -1) then { + _unit setVariable ["ACE_Captives_CargoIndex", -1, true]; + }; + + if (_unit == ACE_player) then { + showHUD true; + }; +}; diff --git a/addons/captives/functions/fn_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf similarity index 53% rename from addons/captives/functions/fn_surrender.sqf rename to addons/captives/functions/fnc_surrender.sqf index 9ba1dbcfc2..b308775040 100644 --- a/addons/captives/functions/fn_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -1,17 +1,30 @@ -// by commy2 +/* + * Author: commy2 + * TODO + * + * Arguments: + * 0: Unit + * 1: State + * + * Return Value: + * Nothing + * + * Example: + * TODO + * + * Public: No + */ +#include "script_component.hpp" -private ["_unit", "_state"]; +PARAMS_2(_unit,_state); -_unit = _this select 0; -_state = _this select 1; - -if (!local _unit) exitWith {[_this, _fnc_scriptName, _unit] call AGM_Core_fnc_execRemoteFnc}; +if (!local _unit) exitWith {[_this, _fnc_scriptName, _unit] call ACE_Core_fnc_execRemoteFnc}; if (_state) then { - if (_unit getVariable ["AGM_isSurrender", false]) exitWith {}; + if (_unit getVariable ["ACE_isSurrender", false]) exitWith {}; - _unit setVariable ["AGM_isSurrender", true, true]; - [_unit, "AGM_Surrendered", true] call AGM_Core_fnc_setCaptivityStatus; + _unit setVariable ["ACE_isSurrender", true, true]; + [_unit, "ACE_Surrendered", true] call ACE_Core_fnc_setCaptivityStatus; _unit spawn { // fix for lowered rifle animation glitch @@ -19,29 +32,29 @@ if (_state) then { _this playMove "amovpercmstpsraswrfldnon"; }; - while {_this getVariable ["AGM_isSurrender", false]} do { + while {_this getVariable ["ACE_isSurrender", false]} do { sleep 0.001; //sleep in UI if (isPlayer _this) then {showHUD false}; - if (!alive _this || {_this getVariable ["AGM_isUnconscious", false]}) then { - _this setVariable ["AGM_isSurrender", false, true]; + if (!alive _this || {_this getVariable ["ACE_isUnconscious", false]}) then { + _this setVariable ["ACE_isSurrender", false, true]; } else { _this playMove "amovpercmstpsnonwnondnon_amovpercmstpssurwnondnon"; }; }; - if !(_this getVariable ["AGM_isUnconscious", false]) then { + if !(_this getVariable ["ACE_isUnconscious", false]) then { _this playMoveNow "AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon"; } else { _this playMoveNow "unconscious"; }; - [_this, "AGM_Surrendered", false] call AGM_Core_fnc_setCaptivityStatus; + [_this, "ACE_Surrendered", false] call ACE_Core_fnc_setCaptivityStatus; if (isPlayer _this) then {showHUD true}; }; } else { - _unit setVariable ["AGM_isSurrender", false, true]; + _unit setVariable ["ACE_isSurrender", false, true]; }; /* diff --git a/addons/captives/functions/fnc_unloadCaptive.sqf b/addons/captives/functions/fnc_unloadCaptive.sqf new file mode 100644 index 0000000000..01e1d48e74 --- /dev/null +++ b/addons/captives/functions/fnc_unloadCaptive.sqf @@ -0,0 +1,35 @@ +/* + * Author: commy2 + * Unit unloads a captive from a vehicle. + * + * Arguments: + * 0: Unit that wants to unload a captive + * 1: Vehicle to unload a captive from. + * + * Return Value: + * Nothing + * + * Example: + * TODO + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_vehicle); + +private ["_cargo", "_target"]; + +_cargo = crew _vehicle; // Can also unload from driver, gunner, commander, turret positions. They shouldn't be there anyway. + +_cargo = [_cargo, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); + +if (count _cargo > 0) then { + _target = _cargo select 0; + + _target setVariable ["ACE_Captives_CargoIndex", -1, true]; + + moveOut _target; + [_target, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); + [_target, "{unassignVehicle _this}", _target] call ACE_Core_fnc_execRemoteFnc; +}; diff --git a/addons/captives/functions/script_component.hpp b/addons/captives/functions/script_component.hpp new file mode 100644 index 0000000000..3cc9111162 --- /dev/null +++ b/addons/captives/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\blank\script_component.hpp" \ No newline at end of file diff --git a/addons/captives/models/ace_cabletie.p3d b/addons/captives/models/ace_cabletie.p3d new file mode 100644 index 0000000000000000000000000000000000000000..72a6facd2bd7aa35487f2e4bd7e05b9f3bc495e7 GIT binary patch literal 52371 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 bTsemCs7wqv23_F!zwdwHYxv5Hf?fX)mwKPg literal 0 HcmV?d00001 diff --git a/addons/captives/models/ace_default.rvmat b/addons/captives/models/ace_default.rvmat new file mode 100644 index 0000000000..c7a241ca38 --- /dev/null +++ b/addons/captives/models/ace_default.rvmat @@ -0,0 +1,79 @@ +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.01,0.01,0.01,1}; //amount of glossiness - the higher the number, the higher the glossiness +specularPower=500; //area of glossiness - the higher the number, the smaller the area +PixelShaderID="Super"; +VertexShaderID="Super"; + +class Stage1 { + texture="#(rgb,1,1,1)color(0.5,0.5,1,1)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 { + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,dt)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0,mc)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage4 { + texture="#(argb,8,8,3)color(1,1,1,1,as)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,1}; + }; +}; +class Stage5 { + texture="#(rgb,1,1,1)color(0.2,0.2,1,1)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 { + texture="#(ai,64,64,1)fresnel(4.7,1.2)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage7 { + texture="a3\data_f\env_land_ca.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/captives/script_component.hpp b/addons/captives/script_component.hpp new file mode 100644 index 0000000000..e68eb19d2f --- /dev/null +++ b/addons/captives/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT captives +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_CAPTIVES + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_CAPTIVES + #define DEBUG_SETTINGS DEBUG_SETTINGS_CAPTIVES +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 060f89d9ec..eaf63b2d41 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -1,8 +1,8 @@  - + - + Take Prisoner Gefangen nehmen Tomar prisionero @@ -14,7 +14,7 @@ Foglyul ejtés Взять в плен - + Free Prisoner Gefangenen freilassen Liberar prisionero @@ -26,7 +26,7 @@ Fogoly szabadon elengedése Освободить пленника - + Escort Prisoner Gefangenen eskortieren Escoltar prisionero @@ -38,7 +38,7 @@ Fogoly kísérése Конвоировать пленника - + Release Prisoner Gefangenen loslassen Soltar prisionero @@ -50,7 +50,7 @@ Fogoly elengedése Прекратить конвоирование - + You need to take him as prisoner first! Du must ihn zuerst gefangen nehmen. Necesitas hacerle prisionero primero! @@ -62,7 +62,7 @@ Először foglyul kell ejtened! Вы должны сначала взять его в плен! - + Load Captive Gefangenen einladen Cargar prisionero @@ -72,7 +72,7 @@ Fogoly berakása Загрузить пленного - + Unload Captive Gefangenen ausladen Descargar prisionero @@ -82,7 +82,7 @@ Fogoly kivevése Выгрузить пленного - + Cable Tie Kabelbinder Opaska zaciskowa @@ -94,7 +94,7 @@ Gyorskötöző Кабельная стяжка - + Cable ties that allow you to restrain prisoners. Kabelbinder ermöglichen es, Gefangene zu fesseln. Opaska zaciskowa pozwala na skrępowanie dłoni u więźnia. @@ -106,7 +106,7 @@ Gyorskötöző emberek fogjulejtéséhez. Кабельные стяжки позволяют связывать пленников. - + Inventory of frisked person Inventar der durchsuchten Person Inventaire de la fouille @@ -116,7 +116,7 @@ Ekwipunek rewidowanej osoby Инвентарь обысканных лиц - + Frisk person Person durchsuchen Fouiller From 4156143ecfd5f5c8aa6f983838052a4ee3a76455 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 3 Feb 2015 00:42:34 -0600 Subject: [PATCH 007/166] Captives Progress --- addons/captives/CfgEventHandlers.hpp | 2 +- addons/captives/CfgVehicles.hpp | 46 +++++++++---------- addons/captives/XEH_preInit.sqf | 3 +- addons/captives/config.cpp | 3 ++ .../captives/functions/fnc_handleGetOut.sqf | 11 +++-- addons/captives/functions/fnc_loadCaptive.sqf | 6 +-- .../captives/functions/fnc_unloadCaptive.sqf | 10 ++-- .../captives/functions/script_component.hpp | 2 +- 8 files changed, 45 insertions(+), 38 deletions(-) diff --git a/addons/captives/CfgEventHandlers.hpp b/addons/captives/CfgEventHandlers.hpp index eb08f7e865..b8c182d1f6 100644 --- a/addons/captives/CfgEventHandlers.hpp +++ b/addons/captives/CfgEventHandlers.hpp @@ -23,7 +23,7 @@ class Extended_GetIn_EventHandlers { class Extended_GetOut_EventHandlers { class All { class GVAR(AutoDetachCaptive) { - getOut = "if (local (_this select 2) && {(_this select 2) getVariable ['ACE_isCaptive', false]}) then {_this call ACE_Captives_fnc_handleGetOut}"; + getOut = QUOTE(_this call FUNC(handleGetOut)); }; }; }; diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 3036ccf196..8758788b2a 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -5,62 +5,62 @@ class CfgVehicles { class ACE_SetCaptive { displayName = "$STR_ACE_Captives_SetCaptive"; distance = 4; - condition = "'ACE_CableTie' in items _player && {alive _target} && {!(_target getVariable ['ACE_isCaptive', false])}"; - statement = "player removeItem 'ACE_CableTie'; [_target, true] call ACE_Captives_fnc_setCaptive"; + condition = QUOTE(('ACE_CableTie' in (items _player)) && {alive _target} && {!(_target getVariable ['ACE_isCaptive', false])}); + statement = QUOTE(_player removeItem 'ACE_CableTie'; [ARR_2(_target, true)] call FUNC(setCaptive);); showDisabled = 0; priority = 2.4; - icon = "\ACE_Captives\UI\handcuff_ca.paa"; + icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); hotkey = "C"; }; class ACE_ReleaseCaptive { displayName = "$STR_ACE_Captives_ReleaseCaptive"; distance = 4; - condition = "_target getVariable ['ACE_isCaptive', false] && {isNull (attachedTo _target)}"; - statement = "[_target, false] call ACE_Captives_fnc_setCaptive"; + condition = QUOTE(_target getVariable ['ACE_isCaptive', false] && {isNull (attachedTo _target)}); + statement = QUOTE([ARR_2(_target, false)] call FUNC(setCaptive)); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; priority = 2.4; - icon = "\ACE_Captives\UI\handcuff_ca.paa"; + icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); hotkey = "R"; }; class ACE_EscortCaptive { displayName = "$STR_ACE_Captives_EscortCaptive"; distance = 4; - condition = "_target getVariable ['ACE_isCaptive', false] && {isNull (attachedTo _target)} && {alive _target} && {!(_target getVariable ['ACE_isUnconscious', false])}"; - statement = "[_target, true] call ACE_Captives_fnc_escortCaptive"; + condition = QUOTE((_target getVariable ['ACE_isCaptive', false]) && {isNull (attachedTo _target)} && {alive _target} && {!(_target getVariable ['ACE_isUnconscious', false])}); + statement = QUOTE([ARR_2(_target, true)] call FUNC(escortCaptive)); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; - icon = "\ACE_Captives\UI\captive_ca.paa"; + icon = QUOTE(PATHTOF(UI\captive_ca.paa)); priority = 2.3; hotkey = "E"; }; class ACE_StopEscorting { displayName = "$STR_ACE_Captives_StopEscorting"; distance = 4; - condition = "_target getVariable ['ACE_isCaptive', false] && {_target in attachedObjects _player}"; - statement = "[_target, false] call ACE_Captives_fnc_escortCaptive"; + condition = QUOTE((_target getVariable ['ACE_isCaptive', false]) && {_target in (attachedObjects _player)}); + statement = QUOTE([ARR_2(_target, false)] call FUNC(escortCaptive)); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; - icon = "\ACE_Captives\UI\captive_ca.paa"; + icon = QUOTE(PATHTOF(UI\captive_ca.paa)); priority = 2.3; hotkey = "E"; }; class ACE_LoadCaptive { displayName = "$STR_ACE_Captives_LoadCaptive"; distance = 4; - condition = "[_player, _target, objNull] call ACE_Captives_fnc_canLoadCaptive"; - statement = "[_player, _target, objNull] call ACE_Captives_fnc_loadCaptive"; + condition = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(canLoadCaptive)); + statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(loadCaptive)); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; - icon = "\ACE_Captives\UI\captive_ca.paa"; + icon = QUOTE(PATHTOF(UI\captive_ca.paa)); priority = 2.2; hotkey = "L"; }; class ACE_FriskPerson { displayName = "$STR_ACE_Captives_FriskPerson"; distance = 2; - condition = "[_player, _target] call ACE_Captives_fnc_canFriskPerson"; - statement = "[_player, _target] call ACE_Captives_fnc_openFriskMenu"; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canFriskPerson)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(openFriskMenu)); showDisabled = 0; //icon = ""; //@todo priority = 3; @@ -71,8 +71,8 @@ class CfgVehicles { class ACE_SelfActions { class ACE_StopEscortingSelf { displayName = "$STR_ACE_Captives_StopEscorting"; - condition = "(_player getVariable ['ACE_escortedUnit', objNull]) getVariable ['ACE_isCaptive', false] && {(_player getVariable ['ACE_escortedUnit', objNull]) in attachedObjects _player}"; - statement = "[_player getVariable ['ACE_escortedUnit', objNull], false] call ACE_Captives_fnc_escortCaptive;"; + condition = QUOTE(((_player getVariable ['ACE_escortedUnit', objNull]) getVariable ['ACE_isCaptive', false]) && {(_player getVariable ['ACE_escortedUnit', objNull]) in attachedObjects _player}); + statement = QUOTE([ARR_2((_player getVariable ['ACE_escortedUnit', objNull]), false)] call FUNC(_escortCaptive);); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; priority = 2.3; @@ -95,8 +95,8 @@ class CfgVehicles { class ACE_LoadCaptive { \ displayName = "$STR_ACE_Captives_LoadCaptive"; \ distance = 4; \ - condition = "[_player, objNull, _target] call ACE_Captives_fnc_canLoadCaptive"; \ - statement = "[_player, objNull, _target] call ACE_Captives_fnc_loadCaptive"; \ + condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \ + statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(loadCaptive)); \ exceptions[] = {"ACE_Interaction_isNotEscorting"}; \ showDisabled = 0; \ priority = 1.2; \ @@ -105,8 +105,8 @@ class CfgVehicles { class ACE_UnloadCaptive { \ displayName = "$STR_ACE_Captives_UnloadCaptive"; \ distance = 4; \ - condition = "[_player, _target] call ACE_Captives_fnc_canUnloadCaptive"; \ - statement = "[_player, _target] call ACE_Captives_fnc_unloadCaptive"; \ + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive)); \ + statement = QUOTE([ARR_2(_player, _target)] call FUNC(unloadCaptive)); \ showDisabled = 0; \ priority = 1.2; \ hotkey = "C"; \ diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 5e6f35bc48..7f83ce4fad 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -1,8 +1,7 @@ #include "script_component.hpp" ADDON = false; - -PREP(empty); + PREP(canFriskPerson); PREP(canLoadCaptive); PREP(canUnloadCaptive); diff --git a/addons/captives/config.cpp b/addons/captives/config.cpp index 7aaa310183..7e5c3382bb 100644 --- a/addons/captives/config.cpp +++ b/addons/captives/config.cpp @@ -13,6 +13,9 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" +#include "CfgMoves.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" class ACE_Core_canInteractConditions { diff --git a/addons/captives/functions/fnc_handleGetOut.sqf b/addons/captives/functions/fnc_handleGetOut.sqf index 7cc1fd6f5c..f734fa0177 100644 --- a/addons/captives/functions/fnc_handleGetOut.sqf +++ b/addons/captives/functions/fnc_handleGetOut.sqf @@ -1,9 +1,10 @@ /* * Author: commy2 - * X + * Handles when a captive unit gets out of a vehicle. * * Arguments: * 0: _vehicle + * 2: dunno * 1: _unit * * Return Value: @@ -16,14 +17,18 @@ */ #include "script_component.hpp" -PARAMS_2(_vehicle,_unit); +PARAMS_3(_vehicle,_dontcare,_unit); + +if (!local _unit) exitWith {}; +if (!(_unit getVariable ["ACE_isCaptive", false])) exitWith {}; private ["_cargoIndex"]; _cargoIndex = _unit getVariable ["ACE_Captives_CargoIndex", -1]; +//If captive was not "unloaded", then move them back into the vehicle. if (_cargoIndex != -1) exitWith { _unit moveInCargo [_vehicle, _cargoIndex]; }; -[_unit, 'ACE_AmovPercMstpScapWnonDnon', 2] call EFUNC(common,doAnimation); +[_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); diff --git a/addons/captives/functions/fnc_loadCaptive.sqf b/addons/captives/functions/fnc_loadCaptive.sqf index 255581a593..f2b1a9a0c1 100644 --- a/addons/captives/functions/fnc_loadCaptive.sqf +++ b/addons/captives/functions/fnc_loadCaptive.sqf @@ -20,9 +20,9 @@ PARAMS_1(_unit,_target,_vehicle); if (isNull _target) then { - _objects = attachedObjects _unit; - _objects = [_objects, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); - _target = _objects select 0; + // _objects = attachedObjects _unit; + // _objects = [_objects, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); + // _target = _objects select 0; }; if (isNull _vehicle) then { diff --git a/addons/captives/functions/fnc_unloadCaptive.sqf b/addons/captives/functions/fnc_unloadCaptive.sqf index 01e1d48e74..e6eb4b24a5 100644 --- a/addons/captives/functions/fnc_unloadCaptive.sqf +++ b/addons/captives/functions/fnc_unloadCaptive.sqf @@ -25,11 +25,11 @@ _cargo = crew _vehicle; // Can also unload from driver, gunner, commander, turr _cargo = [_cargo, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); if (count _cargo > 0) then { - _target = _cargo select 0; + _target = _cargo select 0; - _target setVariable ["ACE_Captives_CargoIndex", -1, true]; + _target setVariable ["ACE_Captives_CargoIndex", -1, true]; - moveOut _target; - [_target, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); - [_target, "{unassignVehicle _this}", _target] call ACE_Core_fnc_execRemoteFnc; + moveOut _target; + [_target, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); + [_target, "{unassignVehicle _this}", _target] call ACE_Core_fnc_execRemoteFnc; }; diff --git a/addons/captives/functions/script_component.hpp b/addons/captives/functions/script_component.hpp index 3cc9111162..e91d5c843b 100644 --- a/addons/captives/functions/script_component.hpp +++ b/addons/captives/functions/script_component.hpp @@ -1 +1 @@ -#include "\z\ace\addons\blank\script_component.hpp" \ No newline at end of file +#include "\z\ace\addons\captives\script_component.hpp" \ No newline at end of file From 357927902dd893bc5361b7845087aaccbe00d79d Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Wed, 4 Feb 2015 02:14:55 +0200 Subject: [PATCH 008/166] Fixed incorrect variable getting in openPlaceUI function. --- addons/explosives/functions/fnc_openPlaceUI.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/explosives/functions/fnc_openPlaceUI.sqf b/addons/explosives/functions/fnc_openPlaceUI.sqf index 1bb78248d2..5ad79381b1 100644 --- a/addons/explosives/functions/fnc_openPlaceUI.sqf +++ b/addons/explosives/functions/fnc_openPlaceUI.sqf @@ -51,7 +51,7 @@ _actions = [localize "STR_ACE_Explosives_PlaceMenu", localize "STR_ACE_Explosive }, { call EFUNC(interaction,hideMenu); - if !(profileNamespace getVariable [EGVAR(interaction,AutoCloseMenu), false]) then { + if !(profileNamespace getVariable [QUOTE(EGVAR(interaction,AutoCloseMenu)), false]) then { "ACE_Explosives" call EFUNC(interaction,openMenuSelf); }; } From f2ef53168bc25801dfaca7e19221b05be67d6635 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Wed, 4 Feb 2015 02:15:31 +0200 Subject: [PATCH 009/166] Added the cellphone as a item. --- addons/explosives/CfgWeapons.hpp | 14 ++++++++++++++ addons/explosives/Data/UI/Cellphone_UI.paa | Bin 0 -> 34032 bytes addons/explosives/config.cpp | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 addons/explosives/Data/UI/Cellphone_UI.paa diff --git a/addons/explosives/CfgWeapons.hpp b/addons/explosives/CfgWeapons.hpp index e239ed8841..fd142019e8 100644 --- a/addons/explosives/CfgWeapons.hpp +++ b/addons/explosives/CfgWeapons.hpp @@ -47,6 +47,20 @@ class CfgWeapons { ACE_Range = 100; ACE_Detonator = 1; + class ItemInfo: ACE_ExplosiveItem { + mass = 2; + uniformModel = "\A3\weapons_F\ammo\mag_univ.p3d"; + }; + }; + class ACE_Cellphone: ACE_ItemCore { + scope = 2; + displayName = $STR_ACE_Explosives_cellphone_displayName; + descriptionShort = $STR_ACE_Explosives_cellphone_description; + picture = PATHTOF(Data\UI\Cellphone_UI.paa); + model = "\A3\weapons_F\ammo\mag_univ.p3d"; + ACE_Range = 15000; + ACE_Detonator = 1; + class ItemInfo: ACE_ExplosiveItem { mass = 2; uniformModel = "\A3\weapons_F\ammo\mag_univ.p3d"; diff --git a/addons/explosives/Data/UI/Cellphone_UI.paa b/addons/explosives/Data/UI/Cellphone_UI.paa new file mode 100644 index 0000000000000000000000000000000000000000..38360ee4da26acbb2eb7a66449043e60a5049491 GIT binary patch literal 34032 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%0A&PpcZ=TY-uM>c!6a8ZU25}nEh-SZ$XM1!r4In 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 literal 0 HcmV?d00001 diff --git a/addons/explosives/config.cpp b/addons/explosives/config.cpp index 8bf463c9f4..5f2264c620 100644 --- a/addons/explosives/config.cpp +++ b/addons/explosives/config.cpp @@ -3,7 +3,7 @@ class CfgPatches { class ADDON { units[] = {}; - weapons[] = {"ACE_Clacker", "ACE_DefusalKit", "ACE_M26_Clacker", "ACE_DeadManSwitch"}; + weapons[] = {"ACE_Clacker", "ACE_DefusalKit", "ACE_M26_Clacker", "ACE_DeadManSwitch", "ACE_Cellphone"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common", "ace_interaction"}; author[] = {"Garth 'L-H' de Wet"}; From 749d068d2df21efe4df9b9236a1177aacb1cae41 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Wed, 4 Feb 2015 02:16:47 +0200 Subject: [PATCH 010/166] Added IED handling (for the player and support for AI). Can dial an IED and it will ring before exploding. --- addons/explosives/CfgACE_Triggers.hpp | 6 + addons/explosives/CfgMagazines.hpp | 29 +++ addons/explosives/CfgVehicles.hpp | 33 +++ .../explosives/Data/Audio/Cellphone_Ring.wss | Bin 0 -> 87338 bytes addons/explosives/Data/Audio/DialTone.wss | Bin 0 -> 88158 bytes .../Data/UI/Cellphone_Background.paa | Bin 0 -> 258205 bytes addons/explosives/ExplosivesUI.hpp | 226 +++++++++++++++++- addons/explosives/XEH_postInit.sqf | 1 + addons/explosives/XEH_preInit.sqf | 6 + .../functions/fnc_addCellphoneIED.sqf | 47 ++++ .../functions/fnc_addToSpeedDial.sqf | 37 +++ addons/explosives/functions/fnc_dialPhone.sqf | 68 ++++++ .../functions/fnc_getSpeedDialExplosive.sqf | 28 +++ .../functions/fnc_removeFromSpeedDial.sqf | 26 ++ .../explosives/functions/fnc_setSpeedDial.sqf | 28 +++ 15 files changed, 529 insertions(+), 6 deletions(-) create mode 100644 addons/explosives/Data/Audio/Cellphone_Ring.wss create mode 100644 addons/explosives/Data/Audio/DialTone.wss create mode 100644 addons/explosives/Data/UI/Cellphone_Background.paa create mode 100644 addons/explosives/functions/fnc_addCellphoneIED.sqf create mode 100644 addons/explosives/functions/fnc_addToSpeedDial.sqf create mode 100644 addons/explosives/functions/fnc_dialPhone.sqf create mode 100644 addons/explosives/functions/fnc_getSpeedDialExplosive.sqf create mode 100644 addons/explosives/functions/fnc_removeFromSpeedDial.sqf create mode 100644 addons/explosives/functions/fnc_setSpeedDial.sqf diff --git a/addons/explosives/CfgACE_Triggers.hpp b/addons/explosives/CfgACE_Triggers.hpp index 1b686d6092..789786bb4f 100644 --- a/addons/explosives/CfgACE_Triggers.hpp +++ b/addons/explosives/CfgACE_Triggers.hpp @@ -24,6 +24,12 @@ class CfgACE_Triggers { picture = PATHTOF(Data\UI\DeadmanSwitch.paa); requires[] = {"ACE_DeadManSwitch"}; }; + class Cellphone:Command { + displayName = $STR_ACE_Explosives_cellphone_displayName; + picture = PATHTOF(Data\UI\Cellphone_UI.paa); + onPlace = QUOTE(_this call FUNC(addCellphoneIED);false); + requires[] = {"ACE_Cellphone"}; + }; class PressurePlate { displayName = $STR_ACE_Explosives_PressurePlate; picture = PATHTOF(Data\UI\PressurePlate.paa); diff --git a/addons/explosives/CfgMagazines.hpp b/addons/explosives/CfgMagazines.hpp index 7cc1c8a8bd..51c85e607f 100644 --- a/addons/explosives/CfgMagazines.hpp +++ b/addons/explosives/CfgMagazines.hpp @@ -95,4 +95,33 @@ class CfgMagazines { }; }; }; + + class IEDUrbanBig_Remote_Mag: DemoCharge_Remote_Mag { + ACE_SetupObject = "ACE_Explosives_Place_IEDUrbanBig"; + class ACE_Triggers { + SupportedTriggers[] = {"Command","DeadmanSwitch", "Cellphone"}; + class Command { + FuseTime = 0.5; + }; + class DeadmanSwitch:Command{}; + class Cellphone:Command{}; + }; + }; + class IEDLandBig_Remote_Mag: IEDUrbanBig_Remote_Mag{ + ACE_SetupObject = "ACE_Explosives_Place_IEDLandBig"; + }; + class IEDUrbanSmall_Remote_Mag: DemoCharge_Remote_Mag { + ACE_SetupObject = "ACE_Explosives_Place_IEDUrbanSmall"; + class ACE_Triggers { + SupportedTriggers[] = {"Command","DeadmanSwitch", "Cellphone"}; + class Command { + FuseTime = 0.5; + }; + class DeadmanSwitch:Command{}; + class Cellphone:Command{}; + }; + }; + class IEDLandSmall_Remote_Mag: IEDUrbanSmall_Remote_Mag { + ACE_SetupObject = "ACE_Explosives_Place_IEDLandSmall"; + }; }; diff --git a/addons/explosives/CfgVehicles.hpp b/addons/explosives/CfgVehicles.hpp index 73477ddce5..983bc0972a 100644 --- a/addons/explosives/CfgVehicles.hpp +++ b/addons/explosives/CfgVehicles.hpp @@ -49,6 +49,15 @@ class CfgVehicles { priority = 0.8; hotkey = "F"; }; + class ACE_Cellphone { + displayName = $STR_ACE_Explosives_cellphone_displayName; + condition = "('ACE_Cellphone' in (items ace_player))"; + statement = "closeDialog 0;createDialog 'Rsc_ACE_PhoneInterface';"; + exceptions[] = {"ACE_Interaction_isNotSwimming"}; + showDisabled = 0; + icon = PATHTOF(Data\UI\Cellphone_UI.paa); + priority = 0.8; + }; }; }; }; @@ -105,6 +114,27 @@ class CfgVehicles { model = "\A3\Weapons_F\Explosives\mine_SLAM_directional"; }; + // IEDs + class ACE_Explosives_Place_IEDUrbanBig:ACE_Explosives_Place { + displayName = "IED Urban Big"; + model = "\A3\Weapons_F\Explosives\IED_urban_big"; + }; + + class ACE_Explosives_Place_IEDLandBig:ACE_Explosives_Place { + displayName = "IED Land Big"; + model = "\A3\Weapons_F\Explosives\IED_land_big"; + }; + + class ACE_Explosives_Place_IEDUrbanSmall:ACE_Explosives_Place { + displayName = "IED Urban Small"; + model = "\A3\Weapons_F\Explosives\IED_urban_small"; + }; + + class ACE_Explosives_Place_IEDLandSmall:ACE_Explosives_Place { + displayName = "IED Land Small"; + model = "\A3\Weapons_F\Explosives\IED_land_small"; + }; + class NATO_Box_Base; class EAST_Box_Base; class IND_Box_Base; @@ -133,6 +163,7 @@ class CfgVehicles { MACRO_ADDITEM(ACE_M26_Clacker,6) MACRO_ADDITEM(ACE_DefusalKit,12) MACRO_ADDITEM(ACE_Deadmanswitch,2) + MACRO_ADDITEM(ACE_Cellphone,3) }; }; @@ -142,6 +173,7 @@ class CfgVehicles { MACRO_ADDITEM(ACE_M26_Clacker,2) MACRO_ADDITEM(ACE_DefusalKit,2) MACRO_ADDITEM(ACE_Deadmanswitch,1) + MACRO_ADDITEM(ACE_Cellphone,2) }; }; @@ -151,6 +183,7 @@ class CfgVehicles { MACRO_ADDITEM(ACE_M26_Clacker,6) MACRO_ADDITEM(ACE_DefusalKit,12) MACRO_ADDITEM(ACE_Deadmanswitch,6) + MACRO_ADDITEM(ACE_Cellphone,10) }; }; diff --git a/addons/explosives/Data/Audio/Cellphone_Ring.wss b/addons/explosives/Data/Audio/Cellphone_Ring.wss new file mode 100644 index 0000000000000000000000000000000000000000..bafdf7596a9ca9e26d14a5daba6935887f79b505 GIT binary patch literal 87338 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

^*r4RY<=DJnI_HV6Kkq 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 literal 0 HcmV?d00001 diff --git a/addons/explosives/Data/UI/Cellphone_Background.paa b/addons/explosives/Data/UI/Cellphone_Background.paa new file mode 100644 index 0000000000000000000000000000000000000000..9cafe97af830d77d6d80293fba5ea24bd9483562 GIT binary patch literal 258205 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%0A#z#y(9ncxELCU~_D#0Z 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 z zNKfu6fDmxk={EP_tgK8hO?-j!?M&rnze|Gqlrx*Lk9}d^d&vrfR`E?G|n%K8CX?K9X*f>+l>*9+uL|M9(MW8 zR>t~L21vS1`~XI&p;GX3smnekXm0Rk)Ha=%VjoX~7FU{as9XRrG|%h3wzE0J&!v*B zr&i$cPf6LtC`8y1pBJG~+y{mSJQ@S!tl^(8Xq>K2JElXQ&`RaK$x;TS?Q5l*ib_ta zyRi(GKLgQw_7e@yKZs&p3ivshB#>pPT zF59qdl(9S$?<$&Fu)MwV02cU_;j*B-&pt2k7j^KsUN3rc7^OEh+7}9IP{a2@ds<0~ zYa&a8McCH1oRWM}?uaJOAzlbSrTwhCOZfM(lV8X2QD$c&Yx!DDHX@^|fYkG? z5qPk!$AIE($?1hkPMLCQ+!aA6RU=lm?P3)hXiGF{;pL#cO}HrYlq=LEH~Wjbf?AGp zw*e<7>azA>F!?5sHy(tYm-BZXG&_k2=nJepO;c>^$#pU zP-KC*vLcIhjlYT!CsPyG)*V0kz=Kc5X19dIaazDGTK5`wH}y3^sUc} zP+*6Q_UecVB>x3!(o`oTNp)ajO3G<4tGr zRFFs249q}vOaaV!@^9AJvJ6;Tmh zBz=dzbpi>r$LJK^YWA(uGGJO))0aML`VmW_r6iwG z{4AcPzdzT@WQqY7lM47^#&k@%Q=-23jfu&bPynG~FS@=&$tv_F2M0HS)s%{kq=jcK zYu%>lr)c*B!*VJ=3v9NFZ_oeX+o)SdeeHaFf%{}(hKHXEUgjs^ zf#4nN)+`-2msrC($4`S)>Q`-nF(%fz@0jM>dkM*mVbjl&d}5{M3&ybl(vu#qW_9%d z!ctN-vWQ6yOwPVJ_uOCZ8BS)R>BMt>A|e5M<$n;sc(IJos77(6w7rxE0HydhZQbQ! zqlh3QX;zJ(nB7beZ1nRWTiCgWHLYxP%rgDE#GvreHdmRBnhwLHo2(tQufw9Gs&1U3 zpsW&O5Tn`&74!^hC$=8ru!^cyl_#&lu~Jj~G2^T}0g1Mrnp>C;gJi^Kefh$fXxun; zlCU#3MV6#tVQ*NwMta7y2gkK@(+Dqo@>WScMxvql1k<$gyNJ#*f0V1UKG6jTA~ln?ZNbT!`Ei`gQk4 zY(jl7G6>)37b=~(1GGX(HgcTxue)CuhWTV^@{eZ5 z7CLpaq~#~RA5m=rO7-Sc3~7Loejp&i7d3z*P~@{*pP<ULQgVU#k%q8qugmbI_y>mbA=ES5*L59n`SSkY|#XN0c*x zaR#;dh*ExUfZ0l$^(q}bhlmg&&1svfOL%f-b6uryL!aHwTq>;l$L%~OcvC-k<6Y$P zyD=jCN$)@xXG~Swe`a3v5v!`cEi$v)vRG%7k9w#Y!~-cXNK=eZ^6+4d(H|9ghj_k@)SaMww4r7m%Zjeu+$XcY*SD%tjy>GBitw;8O5)p6Z=ZPp zH@<8H~0U)n54xYx$36qOk%CC2W~7sL2Mf76Mz6xyCluLP0W-6rp|b zUIeY|yzPQIuyj3be=;jOfw6dt!;>z?9ldh+4RBPD=UW+!qvuv^@X7Y9jXbpV7XQQ! zW#NA%d;dS0-aH_xy8j-Zdk16_VMxQF6fQ3J&P7DZy@46w$r3dc9YK~El1dU46iI~H z1ad*tGPeqZFcLwatZ{)^P@mK!!Hh&%TNa+l7{$0f0(&j$Ib-54wG4Oqw4p}%#DsG`u0KdU-X~9RS7GD9?}OEG75bYH zacHZBH8PJ#-TALMn*kqTV_}LwKw{EOKF&~NK~yb(yq@7#T0!VpjU_hMor!o&0!aiL_HK}h*x8dvhl8}Ha$#O#97YhX5o{%3s{Wir zAq#heU63I#Qlbm;0{av@g^M_k+)t?~qDEf{f+J;&Nuq5hoIfw@%P0tX9sod$;sPq% z8HN+oWV8@RNWSE%$;dS*VxfqR-}Tn*0aO$~XzJ9>EWoC|7ePQzw8W{3x~Z(%Mr;#* z{W>;Ab#+6uc1J%n6aoXSysulXt%Wfe)c|i}TB-tZrv}IhUPVGid04NY#aP@Um)Ooj z%S@H_9RK&b{tp>jq;kyDKE@R2Es9JcbCC;6!EX%^1fmoV6|LIV0tD*s`n|Mz5%v5- z(UozmQ3b!rR)Z{rkw)PwRk6whiQ1ox{yD+%UmR!fgcUJO5{`@Ll|j;2G}HiHfNyQ( zj8Vt)8;=K1^CwnRgDa1Sa_T@$>L)juu=Czxp|NAvE(tu7_a?_Js_$ToBZ{M2Ez1fGu6l?-CVrhXRv6*jiOHQ1TmO@&k+0B>v9%eZ^JVTh zrF}Uni57DP+3RyT6=PFUXX>JcTfB)pKR8rC*L2(`)mOcQ_9~LGzx|K5Q{IG|hCP%T zv=YH&%KkP2iGT{9l%tRs=LKT5*eLMH>sC|-AZa8Dt!$W}-_xs368?^%d6dvmDp9`! zHAED>XME&U-oo<&h0podh8Y?8yl8>9(*?iJ3%w!}xgK1j*M!~k6fss5Re{3GlG*{4 zp3#WAJ-@ayvOoKCE_ucWp_jQTiuleQm5{sBit66D9z6-=%c%;*N;+&5N;z=72PL-o z;M%Ti2n6#vFSsR(Hci}5g@0O6iD+lRtZ+&)TgKP}n-gA&!j78wlbCwjE(t(iH{c$? z2b%sIlSaFOe@ev3(n=m=dZRJ}h{iWP4s2IP;I<9*-LZpX73i2>na!A;TqE3%XCdl% zA=;N(8B@?mQAB^Kjm%nK1>TS_zzvy$MS9)d7ikY>rrn#}UKI1vW@y4AiQrPfn zHJD{-xFCOxO~@MZ6%fw1OjjfWrVtOttQX}c)|N7kZK3%I=PIBigL4CR7! z09}j?%I~lut|KB>WHzxjY$F;z!TLvuAom?O%br#R4^_dDT0jAq%^Y&jn(3RNNd+i* z&s#jY;qmnjNK_|1uy{x~^WKbf&*T`!C>2hY=#ygaFk!E~?Ijzib!T+sl{ugby*8WD zRwxD;nZVav{GZ4Tw zJoF3#>L|eIN2hb_V~jN3HT};gS*&pvG4M2fn6=O`X*+1!t3Ht~%X0RDHvn?Zj|Z|J zm*MKXi`b^CEatEmffp3P*b*G5>LSPU13zKw7vaG{kTaGsJ5^hO^6Z z-7sLB5EhUCD1dnS^C~!3p=mF}9t7!mst9GnCP&8>R{cKF5fF&1B`=2-w|!lxYB+V^ z7h1X)00o)TUs(w$DStBOr14f8%lQj?u#MqC+3u1V0pC|@kzLmdO8+guk4s7`8O@TB z;=Gbh61y`Z)A6Xcu@46tL!7V7h{!3BAXRln)EnLW_6qHswdS`AJKArX!fVfW& z9;6+`E6YcmoiT=&Uj#&-^*Fr?JX@HxWuaX7P%AQh* z_RTe+2@vp0Aa;i0^8Bl6d0FDlR=41rqT;X63u!Re4+>or$}Ao^3VwhUa9PQV122Mb zL2j+B$1=Ad{jrU9gdVK+3c1y11X6~Gqvc$^$%x`UaVzfJ>YffPr4mDeandIb!DO~cDe06E+H zuzFX*-vWI_Fr?xhHoa2tj^ zkT5_%yZ3geGAaAFMyuJ z{-5Bx>tn0G1N2LgQxqgk-V ztE4*{k53@n5vpu4A;f}V<|bsZe7oKdBr&~Xa=A0m3vUeSP{RAfgo^?n-T`iOv2}Rx zB!e1!bnz?3bcp#2;(PW%P0Z<&>V2tlJxQx4kV{hk>y5fK;?(ByQ6aU}$ctL%W?n#Y zd3^=+LkKLZl<@3)l9Zdj?%P;&Ezle5{)!yzJ^6kx}I;5BQJFepzN~ z6RG`f99zo|+i{6per!LTTz~rg*D?)!*7=FjE%kr(C~fz?MR9XBt$j*s)|lh3@;SVk=ZqVn^@-XKeQyEV>N{+5q$i_M0$E-ydfI+~t|04n6T z(FcV>M%v}fal`E~D|uf-x$xZ0L|yYCUcw>vlC`59^kBbFp31;I;YT8y8oj2$r7+F$ z7i|o~0UKSs76DiXf#x3%#OQhg7>DnKz~hRC8G1s zSlTw*`N+*f)e4mZlRDiQa~5rE^?`}i;4Hu#P=ig>EN{lAB`Yoc8ySBEw&UKU_DXD> ze)8WWwo_!z-vLQUSk3;BY#&@S7n9b8Q+NY)HJ^|-OYMDnjK_@X9yBwoOm2~BQGz4JWNCATSY3DV(<4}- z^%15x?if)rW93SB$KKC_u5HI%idgQ%vClx4%kha^khx;em$=j#$eqakRKnw6unw%H z8Do^n*3l-hQatD!={`fIJ0S|h( z1)d_~|0=sD!NYCNIN6)>lrdgHw5%(ugg~W8j>c$kz`=5wt}g~@b-vFyzliAXF9bjrz&{b_?~bnRD}gtZzoljdWBM~g#RUhm3@6(eDyNJG zJmt1p`>hhqt@n}zg6QbDxc~Js%PM{3NyPh5Dpqj^4~}7Ft*4Jb0RNRU2_F(&5$ESI z#;H(&G1uL>!>Gp!PnTD@oxo_!?6sK<^XwPrtuOw%ht?#7h%Z)s2|}5))2TVbV|i@+ zCM*tx3Fk|~kKWGWrL&);x_M5Tf!CIh1x|0QTJ%#4!S$?ukCn>B#Gm^hVW7x zhm)*vx^ZBQWKs)ysO2yju8_D14Xo{3!qHu}i_Pe-5Y5btI6O0m+`*30Ma z(Z!AX_I(HRH7zyqXE_r-a|E@DXkZ*p?sF;oB?JD)S2stxFj8kgcUzmx+`S$Aydn0I zqw-igW1A!V@@CA+rvr@IS-7<+QTO&B9Bm_dRJ73#o&>F?yreSdYX@k`LTKAy!V|K5 z=gxu`Xl2M-Usn+Bn`Rw&{~kD~GV@Mdrk4oK+R52@SCt z@sZ0Amea&2UEBv4&EzefUhe42TMa9f&H~_7SIFXq?>oc(SIhnE;6CIpbY``=>g)f* zFtFz~mXKc`Yj*k7tBRw;PMoG}?-2j2=pVsyegT2awC3$W)xx!Fb+r0j{H5K|4Jh08 zkbgA28#)7Hv6sdDUi&&9Cn1J8d&A&ug@1X{7puk z;r?u8!YBS3?H+&lB;t-Zw*$07Gk09#(;y@64xSkoXykm(TUPvQC5jv~l@!$8l1oJI z2@V=4bvQu0SLW%F5!yupUn13b>lPG?o*(d#Xu^FdE)&9ZY_&xE1rIA7{?ZGZ z%S|u)kZ=cy-neER0~=kB_{n0Zc#|D*m%M~QFm$*0wR3YsyB3kY#H$YMPi%=B!hrj= z2QCv2*Vgzp_&6u@kG;g@*lS!Oz_p#2i&4&yhguUox)New{c}sVx#I{ka&qp_Qo}8wBM}ob&jZiUgk+@e?9|Uv+ z>XvpW&+}hJ0TpM)fPj1S9Y|Y&x}?93gWZqzsJu2u-hfS5%90r!QGk5@CIEz;k{O29 zRwzGGvKZ1Mm_aF7ck@AE7DlJxNH8%`*PI#S8eE!7{nvt7n-js#@?%)bq!qf=v`KuM z(#ciFzopf*)0a2Te!4m-1*3PTTjg6m1SC(ZKXy8t8JlR6JpNKet5r@}AI2*Bde5TZMk{pF`m!GV!q&x(#zbYGFEw-Mzn zcWqd!Ur&xMzLNXB#P)zxlpliXHz}wgHx`yw0#=YuB6ftPXEEAUN18@m^u(5Wm~+B| z$2lok*;pv@CmIj87+6QK@isoTk(8+|M{L@a1%s{9O!qcaF8N>-Hwr5?OiiAuUbwkvBmJrc=inornxY zVi>Dkl)+msmV##Vyhz!YYy>n$1eEbojiz$zC3B&H9uM z|5c=RaVifEqji@>>NT(Ba)Mjp=`UQJ<$`EzT4J+`A2q)3@PFe=@%85;tou0MOY2h; zlpuGA)S|FbH_$$z)E)3RiwS@I_d;|4@~kF6mO~hBo)Rujer{9g7-=YmEp37cZIIC= zrX)9~Vepl{feOFnureBI9|gwDtfRgSp9qikzo8bov5pK)zgVjCC1+~-DV^TYoz5@m zcQxF?j4SSCP9y9A>co-PyN;oY4cyv9$(9Qm(iv%_aHmACRAAS3+*OIY1bp<^OVA(> zg5WWvl?*k5TV#BgRg`D1O>$+_=ZHnADgVym_8-^w(j|M8mVkYuRuJksNq(0&T%5@=Y9qBdg)B~FDrRHuN|tMqJD>9Nm-2Sia4su*|Iq*%SJzdSz&&WM zy<_IJ`VSqN0lC&v;!w{&iF_ZGb`6fZDA39(E3q~2kJV3oXBH3{7yPbu%p^}n?TK!a z)PqByW&nsKtc+3c(T%f5y<~OV+U&C+ntD^Zk{-zxY{+Bu^HHckK8n%GCsVO@AXzn4 z(N01}^UEqqJ%zaU*nzp?heXGRA7K3Z>AK0i{^a(tmnhxDggz|uO(05Zs%uzXYHQXN zTDRk1b&4{rQ^_CusJRU7DKQ>HWsqRjfNAPamUo#8e_~8NGe%u5?vR*eeQ_gaF&5c- z8UGcL9V-#;oXAU|!IB`_B>Y?)`9(quG(mm^Qn01?nHJDBE{R#T8`ou$cxIkGjK<7z zU;M~;Zqh8%SfO4f3^7#Ka@|J=0TJ*dry}&$ojb4p=TqoYo?hSf)g=}8Kc$!V@kvk< zhe~|pa-Rr6X(EqI?_PaB7VENRo~Y+vw+%ed)@apkR|ET)xVj2pt;f zW}&q`TRD^@fxy^JOf2?SPn8?y+Cy zuxdHD0gZD6LN{limXu|)GB%x6Pbaw6Eh|w&j<9USn%+TCE{VnVF!L*vwk@+2D+6yk z?ai1ZX^l;S{G0RO&#rHH1RF4AaM}oIwIFmR{&>|@jl5X?hiG~3ZSCV2`}kNd7wTRY zKQfwq>0@2>HU2mbX0w5sDxe)UGahS>9AlaK{m_dN6CU_Q+2!u!v#(rn`O7d?5n0UpJsAe|uVMWerf z^vPp?)~o^hiZZ@M9P8@ef%n#H*ZQ7+{j@0We3_oVdXt66=jc1FO2+sSS0tu&h9{3X zcqY36A|H2<;;zZl6RjNU9sPKWu8EvB(WV6UJh*q zW{NTvF|^u))WhMEXz1L8Y?MzV_a&@gjsArCS_yKpkmwtd53yX(ue~k44b^_~k*fqr zO!%_-l-mT}I+6CfpgTB&4}7&5gg_ubefhQ7N}EQVNr1CVOG^hUn`bfwp?MJ=GEAmA z(;0OxsD*!x<^R$oaBUXF_vR+yj;q8T$~z~gVx%Q|u=NIQ^!L+85T9k$Ll{aH{AdSl zoF_sZ7Dorupm)9@mOm8+dxiw-|M1Jxz0}oG(r*drPe1(>;9JCxDCao*y>dlzxp;5s z)+TS42>AxSNe#4>;NKV-ZT3Xx3pbM{FEz@oZMtcqi&MY<9<4wq0J9J+hhmH;RouUf zci1orEArW!?qOG}j*`7pDbpF_UKFwPnRYyiIO4r{A-Dzvy6CqaXuCVFvc|bYkF@78 ztDCDm+AcAEjqac^DsBlcl6Ig%vhwEdzca=+v8+Ml0q6kDzt!MTWvBsCFwmm(6=3kz zMpoB2W+KSW#xaYrC;m&PI#hkVuC9ZTj)B(IQ0_iPx4b4}E!@q~R|G{(@@>UyQHpm* z!pj0xnx4qGS(MB3$i5gl+lBn#`xBD>IV!v}HA$jArzR--Eg-#b3+GceW5M3By(HF1 zJgS-SfO9v!XwsvWc1*IiQ=BTW%FbVrtxXrreb|F_K9iMAOJ^b#jlI-0T!jG1)20)y z+BB^0yO`}$X_KT*C5(^5dcqulDx2zSt^&5KARercBgd8yCF2=C*5aI7iUT5s26Jh+ zt3_g*4@|(lVDvw%?9bDs2@+cz0BEgaF6w^)@ho9eG&FOr5YRHA{DkX!Dk{(+=ZkXL z(r$@#5oNJjwa8;0!tD}e>p@hQBZ!aZy1Anvd7P7Y4Cx|ZN z1^G|uu)=2Xg*yU0K9(jFb2~!Y4R|xextmQHtVV_oGnMG7zZuKlgZHbBJ!fUkNxhge zI{{(I3qLcJH9xqCI3sx9DYLq7wLmWi$uSE8Jf`>ek58-95y6_&q2W!&iH5#53pko#G1ybsA#?!{iO&@+DE>mT2=6VVBr zfVAv+)bGBCd#2+C{IMhzp*Yww1{Y(a!~bf#NG=fXl~1qsc8);LIO41)lI=L3yyq!d zsIXrlziL{h4#o&B;Msw6D7(Rlww>3+O#+me#Dus7l(LD zmAjUc&8%8LG-`7|pqUq|zC{~f#cD`lR6+t{n#GCFJ1v$A?8Fe*mud$#dOPv-iqGf} z&HVq?g5utKkWyz8A-!$8!TJvh3#b<5sTE4Fh(;6hCHPe%SWj_>Jxn)ocbzkCT&nutbs* z2!2}EaAGTzt%kSQfC9`oe%QA`OiA0xa`}a_t4MX=2Q@b#fYR+9v^v`-_v1Zon97?@ zi!Oe2b?Q~x=z?*}sRN}I!-!d~i$uBKSXF%5{W!X`2SWc5E=m}z?lGZ#3^k@_UY;_f!Lbt#JN z$$dGjk)X^E%qgDx23X^6Vu5N{!x|?LZ%!G7G$A9p9JXv$rYm&B(zbjb!EVAWxt2y+ zTW_5LH!*aKJ0+Li0^Yzj=hM|Q%G(lEEBLzC;s?{OFhP(& zN*hasW6I}K7@b>2E>6CPRs{Gy2*Vj8<2^1!$T23y0b9!*MIA^+y|fkqbr%V%BCJ)x z=rdoibYn&Vgd|MW|T+)MilBEz1Sv!pj-m~cf-h9Z{a-oY09{X1;8_8n3gXIVI2O}c9)^f)tH5T z;ry&oJ$a zlhG2TQ-M-3s3g)Q`UvU8${miucn{ zm%~Ux~ztip&phDeFvSvYdcmzsFfgG2z!>4gFoltdXmOFdK-kP-evvT%VBh=j)i zt1@}GaQ^|)y|R@tk2nS2s)+Nm!5OWrV6@{8R{P}sr$z+{V-fLj8SaAjkZ66aGhx@LwHY`4JdpTBpkyvTT znh42|cOPaE%vrHsCF&+cZmd-WbR+1BLW;8 z<|zS(MZ&O2^el-qL=+h?#Ort`;e(qoE95Y5w>xM`PEE~Wj9-JZy)M?q0K-ostZ8YJ zc+uuvy^G&wE&jP@z#SNmt($=1w;)>Q>2#{FH(IOWKpOi3ia~NclIv^EukM*d1se=# zsj`L3!E1J##H-(~Oc>5)b!|_-GSjwglw;1Nz0SaR0KWQ~wU4~^u(Hu1(w|Vc&B18S zYu51~RyHTQ`zK%Gz-*O$TRB`ZZcv+zWO-$7nU-;k_J&*K7UD+H+9;NrWxXk(j0VPb zO88pGAwxRe*qc7*OO>86qxjdJd@?(Wl?D(T*Yb=Fm(Oj54BKzh%Ux2s)~3@^C%-&F zK}Z5^TkVtAFv8pJEBKC@*_NLqalCl5Se%!y?G!N5PbXyw_JP37_ga<6m7YkpOR%UuTk%^UN ziD~?UQ7)BMNm%%Hd>xh!*Cjhq0=;8^vH!Be%Vo6!aw1R(3hjw8;RAsaOZb4r9dlvQ zHDaL3U1EHYIPA`Z8=n=8_+FoYEu4kRL>D^aG8ki>&&BWs!aJw}ET+DGTDsatXxBP0 z_!!}HQ5)BGf>w(my>VquXZn$ujKec3YSr5yd~RR8I-9ZmOxenbnEDOx@wdotlRNA+ zJWl-f5RY~gD!XMWO$^441w-I1bWyeiMAv;wCK!=T6{AqtXC^EoPNe*|01udgufs7Yb<~R<47vpGIkQ+{6Hg;+v=t1 zEN8yg2yM=0DDU=0Cn{ERjIG2Xl36B+RFYcIx*(Cc53%dwjtKB$J^ ziwvqmUg}x2>?mWrivy|2f})O0)SThKmvGbIWV%_WW9-%Wl*{6dmse5GgZ?$?ZYHWv zBYu~tyL%GydXzak5k$<0{>ErZla+z)qA}|J*juqlos6RsV4$T`-9JEu&lb8dwpGH| zCgra~708K1jiVmL%~r!OEYU~|P+CoKwqYGB{gQapyd{U_Mq90qBrwBxRus^EI|g+Q zxhPfNna$5;Hx)7wohYT%?~~@WQ3tCTlYgBk_tRY$QGsL*QkJc@%xsA|PV5nG&BkP^ zp_J(E8|(ldFLxoLR42YAw@-MVFJjpC>K<12XKVj|V5#gUm`B{vH0Q7~!hFj?+n)Ie z1s-K*X=xT#ul5%f%-%0Cegk@0Yp0%{IuaX_V;nf|SYQl_S2zGr`7{&}3SA}gM3@S~ z64HCbrBFp5QUsB4JX8^+79>0aOT$b3ou`YL4I>`lPe62u(r+|WRa|O%$2A=Aj>n~;)?j=y}M_o8Qbi) zYDnMnYlkR@S$l)|{Z*dCT>e#JE^IgDQ>sDnop4BWaiKdL+l@-68RfL3GYi{F4d01K znSnq3(7W&;a=}?@#8LlURRZNbS$~z)SDylvl#$CbGS}lFF9RGEv+8ji>Jv-eYLmY_ z*(XB3T)~80U##K`)yHUi?i0%P1|=w?&C^AjU&~V^jXjBf|55VbwQVXeEd`rkZ7Nvs znbU%=zWuUk3a_?Rydia#@2fMR|5G$p*r3Cn=i{9357bFPj)BJUi4%-T|3Z|vDIo!6 zy4)|XsU>x~mNknsR5P8d#JH8REbF$a zc=%;!Cn)ERaDg5V5B)|#w7vqy?Wkl6BEXn4renwM<0#cZ3`*51qB5$QW$d%FD6{-L z76E_qX_!N#KU9KSF{ZDsf;N(VFb!GVV@10^hL~vGBp2TQ6xKEio- z%Q}5YDzlop{7h#y!gp2H<%tQtSgco)2P%@-I-K0X-gAs`I8YW)`Jz!`+ycAu3%jc7 zP)A#juc5UdR(c6fI)6jkMvL|DlLumJY!)CSNs7EmS|fcXj#Raj?u0nWsRJ%M(*&-x zno<$@_d(wb^UF(8bf{^&+YOa4r^8Ci=G-U>b@_HMy98!egm?bc(~RBql-A$X0w@|W__QNwI>c2rugU+Ja{91?T;s-rY7*zvUx^O3fHL}Elh1F;- zqKMvM$7R+evpT2o3zBVBs88gr_$jx{tqT4E4V8?-YOt&}2)=e7`;fAdTgaBeL;N<# znH+HoAMoPGxrVb2|4LU>`xb?WoTu+(Y-Xp_=)VGDUmWId!`qS*9wh2ce=LJEBos9w zDTF`VO>1&D{A+J^w|OyGM`@aczVi1dV+R@4aw6astLxbOLQ5NINS=Niu|K4WMQwb! zvIk3%B1)H0ZM4vqWg_)MKfTKNI@3}z?$%G^CcOS35x;yT@3ghi?hme)pTIrPt{Q_n zv)1S0*+YklfM|A}DrD6b^cuwGqwQaT{*t9AM(hw!v%*q&H{#s!UYorxkGsDPI#Lj* z4+#cEZLCk;l-9guojx%{?7x`bT*w6p+(V|XNQwfylbWBUw8R;6Q%x19E- zE{KRxfWS$>A4oo_HI5JO8}sK=WRL-NTcgWI4GK_q2u_pFiae6_m|Hr1UdTl0Q92tB zLKmx4r3hle<}C2?H|%zY!yvgXd4LN-7_AdFrFxQp_-reP(mFfGO3x8<2NUaA^^Zi) zv2ZA^Sk|Opp*12y!f|3lMuCO3sGjl`I};R0;=+Eg>o|X78(jWI_~~Ut?F$P)GQrR} zEbh+%H?HWttABt{Ilkwm1Nbuf`2MYF{V05i-R8J*P$1~qFlfMmWq3%p3EDLNXU^(q zvtxQOW(@BA*g8UCrcA6m1SEhPybA~xO+|WsfOu^jO;AsqP1LSrV30Oxf-e zk5jZO`O4@q8`a55qlldoJ$UBZofiO-CsNW9vbyfGE-U{PUf=e6VGSy4Wg4w^_(ZaO zRx~wHnF&jXJF5GCv)qFHS8IdtwhL=dPiBn;grW}wc%8?rR;)IM_%uXPXD>j>_v-zC zELg!1>yuZzveLZ3@M&pT05Jk}vdUB&uMoUAdF1l;fnkSfosU@CQ6kr0wtRg^e0_S4V3;g87_ml4Tri{_{zW>g)2bAVwy*5_( z5pdI;Cit;%$+{IQSN#8w?7tK9xn|Kwk+W?dm(bsou@awbp(wK9KvEYIUi_>`yzR$u zMtYY#*Yx`VbUOYp1M*VG#%7`GO#>V|hF{NFUo<$XaRtb;6#T8?gD&HKy#aKst>X{$ z9lnnVzlL)~wzOhDWMWH|@r=KlpWu%9My-`|6T?J!<*6v)LwnxAiy$C0<3c}*q zA0zvS)Hk7Q;OrQ5i%{6Bz;^p-WIW1<3xlGF421^*yvXCj(h66^-vIV&NXsSr$vX&r z#jG-xJ5bis0}*)M^XbppEDMiHb?siy;gs4RZyoCdcQ4=D191qQL);70!AZjBMgQEp z!V|u0B!GielyM~?duTV|KHNR@3mrzRfG~OO_tt9Gku*>YB9fo5;q)Ll=cHd`=|DXc zJ;#hz*-IVR4R;a?8i=CdUmjoxO(A`RAAo;6PW-6@a|0J`z`=5x@)a#TBo^q%!p}y) zGtS~~{q77;c3f6yvv%M$%I-W$<~N5o7M{Ew3ON*iNMNvL)P{SaW*RsHGrHgisY&rFQ5bP%Ny5iJV|SI z*HE06D?#UK7Ln$`awd!n7UP=78!IY#O#!R|KlSFAQDv6`F&|622-13_J!{WB@*SC!>Uh=`p6^a1g1b$kv z0E9)s9axzT?Xx{A^2Tu7dB`-q*t#hh&TKM5J#^;|ZCSMS(r-9P4P;i+(tNeVl(b(Y zN5oUz*@6&}dFw1R&HeI3bLad_oBSWEUY03$)5e?x*v#%}+L6L?NzZl`(%NY6e5bz% zjcGB4paJbxP{9ex_!Al5GWg5^Ru{QAUXjrOGhe4snP(`@ ztGkmAXpv1bf8zhUp{wU9Yf}+RB=yK5Dx%@emC<|w^;OB-Q7q1vPNC_B$4)@kxgfON z_JzBavNi!RsNj~eT3Op_nA1UF=FxFlI^9oSLNKK#U+1ZZxd$%?@cBY`Fb~q@{sgo1 zLLtK2n+NwF(1i^k8_8Q=Kw4K`2+NdIa3*3hZ?|#bu{u#GUSWV4NOdEV3!d!Nl+23N->O=~ipC_`%&L zC(tHAmPj8?2(HIHLL@M+8)mp*!(=g)1(~Q(&c`K_#GR|m{g53ZcTk=!EfQlhU>8@9 zT>_-68CCF|d3Z=fT!=w)6U9)U>ELr_Cn6|ME05V#k!XsE!L`{>c00+^V*yMN-w1B(N&&n(EpZD{Yflm>4s+biW$0rk!( zPu}{zzy2;vz{j>9p|Nw`L|JBfPIY4(Z%hLhQLv4At{_tr1`fM0>I{Ifc@Hgj80@PD z$Loa!C=AHt`v>pN;$0A?#Mf0qbw~HU;@W^j+Kl;yM@0_`d;vKn-n_jO328cnj@ymq z9KH)(lw7H}W06?AljRNI=1g#2oLcUk-C3$9d57UzhAS`{t*&}-VO)Wz!eEkh$mLtvmjYOHoQDgKJ;v%!`h~c z^?wpZOTCG|RkJ!?JB(ho6U4}ENpDiN0K!~#<{`hLr%+bzLPd4WKA%=g{g6K#x~^XS zHC2pdyYVwVIa^8FZp)BR>Ro3#$d#QlfJ)C^azZD5U7zcal$D%b9;&%c>E_YBM;TXq} zndPa`(5_n>DCLNyPudIk6S~lP??0^6LRi*o-)6Ofs%MZfZ_g}m3_{p`oCoMc-3WpB ziBzk>6Y0%KT^VHxnOes~E;?B|)ZiUnBbSc|Q6>cG%$4Ec5@R?Sr|T%#%%I=zjjr7B zVK^un;|bNkFnqyf)!+)LC;ACX4%>%8b`;AwGUEHrTF_7Z!COD(RXxlb33x95(mZ_z zAQOM#8AEk&WTBR`clf}hj$ziN1knG>0G$7i#-;>rteajBoy0N4=kX6?8$&$KSUSX; z>TYd%oa*7>fnlQ0Mo|NHZqLVkPC-pV7e$ACv60g01~xo{Fy$8)@xKugxz1oQmt9!+uywS<>6;cSCL2OC0&;v$>75 z@wEgInLM!m&HnGg5pG3gP zR5V~Elx*O^(QJSDA3hDE38iJ&%AXHyRaF^(j!*603+a)P5rO7^>)lVt;#n^BXa4<) zO(_sP;Y9-)^kh&e&oNJ4pt0j`NW03g=t((jBorGbzbTRvgr?B=fKME!a^1G` z-#dP1*IT#@Rmsj0wH>pAhLXT8#O$h}v%d1b(KwR%9{b!+qeVEaMzuW-RXLf@E(zJm zhs(-#+j!QJq~go0*Zmr_#9Oot60H6?7kZF)JBZZ1XZEtj5<=VEC1dTScIR&gP&^Pn z4r>AGbP!9cBJbcw@6k-ArB{3|j$gMFs9=Kwq|<_{t5-Al0l&<_SU3E2j&tcu9|GCH zlX8(Y(pVNeN*b)aM+E?5+!lCz0!ufMAc&aLkaP^7^^@Aepwx z0YF1Q+&r0(&1cnCNW8OZGf_}b7R5NW?~cMBI(<>NT{47mvZj5K(q0|Jv#EAPnS#m+ z5bKC3@o~2pjq`fS7*5pwbFhz)YGtFmj#B zZOfS$I&9f`3{$fmVRYDcdsNO_`en2>*jw#Gmah0jV$_q-KUkXU8MTTSxxD&QXa|ZK zO1x5oJ={+Gf=#DivFQ{7%K5whGH5?XU|(9@lx9~#a|cmg_+#P4ZF$gu8w+`z_F2ky zCVbOxg{uw+GhuJ;4>WaRn3Mqxi>{{_H^A63IJqLYD;F*2?ZqnE7!P}#_3rl+2E6x1GMc2zsO@MXervflwXRo@xfS}ujjl?O&SxUWE^8gV6{G?nm@7agW68M zBINF^#VUhf_P2?+4aX9OHNM2`o8ULBxU0a$myyMJRWBhI;NO1sbdZrFIQ7%Re6)&K z+dlcB|AF4S18-FGH>Lh>4a(m-;@>he&O>qx0Th2BA z%M~giqW*a{$ba3Jq-6?T!0i>lSc{yWLB%kljsR>Si+sA4Ha_&rPX;VO1DzUqW^q# z*7HaFXO^XVl*a#x<{2gBEZW+P9g?m$Jo5SZ~ZkpLaE5;mBVJol& zUbKfOuHUt?8!ZrJkVUf^^L5dMaYHCafV)ZV8W>X}AHxk6me#IsO7;4!G%1ZXjt9v; z+F`i}Kuvb*tbjJM;)Zc#bbZ&I3JH*nxHVecc>eC^==!gq-Tk!K3?;E(kcBl(dtr9h zNf_?yATUoD_B;YOH4*|o1+_i2-D5EfFps@tOjE!vJs;vl1DXsKHGJw8T>j`&-G8wJ ztFvG9$y!RRT?=o5{}I|9-o)pQ^7FC??HN+5u-u|7(@Q;O@c0D;x4^Y zR-xa;F9BwjCyhVt?WFf7&d&M-6j0yF%3)}zWB(}C*3O@vh<&HF@#W6Z`k_<&tNv{` z2OS^6Zruee68RHPD$l|icRaB@?`jQ?L~Ko-`xgIo+B0=8SgpMO1cq(5N0&P-CGPZO z&&I`Hzr;ym+lG!8n&nphZd|tY%*6pZ5`@Y#>=jDgKs;(Gy3Wch+4^;~X8bb>W7rNy z0oI=ViIN_xB}i9tJuwr29MQ3_(hFZly_gN29D1hwdnc?t5~GS#x7-MCgH+$|anZDT zq+cXAJTwY|FYRPTYsbkZoS2T=M`+tiKuv7K(N|x66=5FMV1VCqal^XrSP;M`Q9I22 zSt{6v=k{7b5c1KN5%H?1ZdSU0FrN&;RR||8zW8Y-Uit9fOQ7otrep=__YdNL55Eoz;{qyxJ{~4$H6Q1trULN-Rr^?_7P1HZgk> zA7(nW;Y3VP4z|s~O&zrddY&yS)md1&tepzE#p^zi-W)XY!@T;H&MOoc1?$kuM6OM7Hjrnhg)=0GoPEt>|LF-Aurem;LfeW>ufT1nmv6zGTG9hYK_- z&&h0;mE4AS6&Dq?7L`0gJi!UvKKod(+1nL#yG{Aq@<6z1a2kEkTb&Xci{>a(#d%7g zaqF|caIA3N-2IfLID2g;c+sl<{w9m>w%}z6y@Y+u;0-88w5*4AS^(Ar7bRcqbuC~y zRZ#U#c-M;a+TuAZ49{EgIS)>7GVE>Y=7rsA;cd;=CmSsx1B^OJEVL^9eW9EGyFy3X zV!=ENPIf%DVv?NuUTQMHlPAb2YOWU$MFjbARCfAVa2BC8Gl_};{_#E@>wIw#q?~+i z8cvEfPV>M*uk)*?73JI(-A-0oN-U3=u4ko5#J#+9_$|v;TF=vA&rVYgnO(=I@2KmE zYTnzPlhv6gNTlPTTU*+7G)Pzach7A`(^-r~XT?f2$dY<(4jW`VN^tRaW7#lyfZMxf zNmxUn`;xd07Feb0$$vud##tYToHPLA`6v3lOjageFO2jhK6s{l+11Y2kNrRymBetn z7g!{GU5`RX++Ziwf%>^gJhu1ZSuGk78R7N)>gW6o)5UI90v12IHVMt~G8__CSbLwp znuC>U9>N;cv<~N1+)z)Z`ukNLXUs<*&JlqjM#_81FK>1xrPG>szY=fDFLGXf2sKO( z1YTfC<15O`vzkxSn%BpQ^b3f3t`V11Mr_tW6-1|%dRNlY3ZJ|Wc2=V9^f)ahy(@YE zm9UsQxJGn>-hWh>yggLQnP~MA^kEO??SW#u8M$3aglxB3S(!cQtT{+}l+XkBT?8u=as&(quc&JVcBS*++5TgcQ_BjGVw} zUuw|8#)V?7&VCu@8C<_Wpi9#&31I#oqGNHY`k$@SR9u2VgO7R@w@t#8WPp{8#KY@t z@*iMBV0dZPTE->|#Qg8}bdf<(2t){)!8*jmMr z@1Ll}N`j2o?KPd?JJ`y<;Onu%jXcog6jXseG`1_ySO2h8c=w{%Zng4eeKU$74S?b!RMg*c~UxS6{e z5p4E!8LzXoVfC6D6bP26mZ$>gSRT%d!ileykNPVLi*ZvO{{NRTmGeKFm5vILH1~UN zu145j58Cq6q7(*9KTtOJrs_V)NaH=C_ayJTugGLh(YKz_ZeAEu2MZ=>`D1vA!EiEz}6P$J%65ny@+jPf8aZb zoNM4Yp&kNx&gMfpQ!(0ZWQq&KWJ+SdmQkQVoO?mw!Kgt~n7m4W`_Pb6Q%O6{9xNB- zHMEuW;Udo^hI_xB&Eg2ZIN81%n=6&W(X{O~pFDXxS5IrUFNYKyQDs)3ND3f+uk->I zC>TtDV0r_jQV7MmIGjuwVHcJT;p)r`Df4y`$cdreAG^FJxNKlmYDOj7qk40twCI_`Eo zHX}Pk5i+Kc4v*h>KpZ)~VO-8RwrYV`KdEajLG zM)Ued9*3(zp)(cH7Af$b<@aetZta7o~ ze*@=KBn*!V0a+v!M5M+jn_ahs=RX>`mp|fzQfar->h;cx;(v{P`O#aYtXa@}3J>hs zV!SQy8q^UYp7j=gH!%cyT%NdsgQ`<${EpW@Q8^tU-!V1;3BPiSlGX?|i1Y+8c+ixI zygTMNX5%+Jrp8BISp9BO-wyj97W=J0hfKv2NxuLvS&MRB6w!H;w=6$XEo!KjW6JcZ zc-zJl1`8RtZ-%NRJW1$C)BXb~S?Tyg@PAUTBx$4gRq*%Xr;I9hmq?Xle4XsUC#*D# zC@K@aVkcIp+G4iMpzWd`c-?8ug6c#R651Q6?v_mB$KjIR+EYA2zCw|Su7x1>4z7K{ z+Vn(0yQ3X9`PwxFV@pzTcRMt`f@MB=~CG6f#*CscHo|Ct5j)Fx9)2T@R!bQQGSQl%TYkaT(A=+#@zu!-hf= zu$lTvPub-LM4OQn#k6f6c7U(uc8+xt5~ohzgjCLEbSOGm7kbd79~07WoRf&Xr`pV{ zwseUVuFGm65wq{fwIE%^@L|8I{OVylMid$4s z(L zfa%uw%k~r$-FsAo?FF#A2~DcrtX8-&aL5T^IXO_ua_D5?;4b(GJ04uCrA?Ris>UdE zvuK;ZX;Jd8QC;jX1N|Q%aqf^M7!N+>ML!+pG6mWH3Iq?XBnqP_qN|qy-gz?mGj=Cr zQ}m=~{5cc$)Cl({IiupQMnuSUKku`*xeIDDyk|6&;N-8uthS(L<_73IJqW>vX}F#t z&wtp|o4gL@Dl8kz$>e~eOscfB~-cwfozrd*5TxdC0{ zSRqM37*(AH3dBe2wjjyYpfoRpsug1#L+Rv}Y{dLm5%c@3IoQh_i>$G+cOa3K$(8*d z(e}V)DrcR>LfgK8YjA20_gff}$H!a=ZGUS&B~=mjm>4KB<`G8~36OIjno+Hqrqzh@ z9=F~>O&aENG17h&^Uy4`4l7#}SZo`EN2Tiwtdpt)_Xh2 z-zP3+r(R>#0;0dAPR1Wg^Qk@H#`qJr+WN3Xulg$f)L1g|;{L*~-F$0U={7=@ZMggI z@qMaW&EN2n8#N~Wa-@FMKZp;Qcu_Nqg{k%%b#08DC>QO%o0*vS|FQJ#0ZrBY|L2^s zl$$WrV3@)|@mvs*(hwYMj;utj1Sbe%Bk5w2N+OD|u>od^nq9=wFbN}Zh?IsG92-ih zX^)zQm?)4wCW4Bo2*S4Wd!6U|>!0uf!a1MI`~7;qE}-{Q>-vW7Vd~I9hD|Ag;#z>GhbKnB z93O#LTls}y`OaVzYd^?7O{k+Ne-OfSA zM*6OjN#?cK=VNDByjL)duYIcb{`W>M)97^`dp+k5n2(w&rs?pL?#5BhQ{5MNTkt=i zMxS`^Q(7tfd#fKsx2)+i@;=)L7WNyYX2qK(46u?rz|@i=ao(c-uJ|Cv3&E7SX85KG z*4j)92V-j^*tjX)Niw@#J$L=cle@2OUHE>Y=$7#%u*=szJG}hyaH3JD3ZP~Z4?`Tv zFf4GRGLJQVv2tB)n9FpjoOjs8@$g&PY_$1f$~nyll%C% z5Zy<>B$sRNll_@b)3KNT+VyXcib4ZRB?_heuvoBCsY8nsy2YxjV$*wezHr}behcMrdxxKyoPobdH0&Z{~ht`%!bBzu18($8N^Kh%>iFMqsXGCHTme{+h8SXa>0 zD%puksUWWT9s>zf8E9@Jv-9953;^T7TNyiftCbuWxcd-Z24QyOvS;J04~jVVCu=w| z>%SV-ZqBVb5MnGuGuxEgHxJksD4&o12Cd&$GP3MEOs#oE2R`M_P+}SftE^06@b6mQ zPW_Q?0wvSUuq7+L4^Za+4(O8}br(P-rqbFid>C(vj~KFHwyAZeax}>w%;Ow?Q)!P) zLr$^%6M8R z2p!^JVqWGevvi;mO`v)b?u@Xo4vkw@X@c%(*9M>ok#u7)4#Ys%073Zz$CsMKSLKcA zE)0vWhRS6{!XQjJhzK}-uPaDLDpwr+(PqCBh@prjF2NUruvlRCacT4LusFq~&D#4| zg#u!0XT!~v_`F;iAUR2NMSDxSS=TVb9dC&Z&SucO{}5?LWG?Zkmef3UA_zfVLUgq_ zS%ZQ)9hs+T0erkeroP!&gQa;BM{qIiyIkuiR zq>@h`RQ``fv74{l!&_eoz~=_rVqjKr;_Z-exuj}6>}^YNYsN%4;W+CGQCjKpkxfM z($<+&LgW3(C@{yuNN+~q*_+}K(2!*Vgb_q$J&wO6ZuQo0q9=;~ANcT1rRd+hJN*&J zdbIF#eVE|{Ib&!|8NfXMQ`Oh02S}`8`#o zCZ^8Q3tNp>{UpJu|2x#b5R^$@Jv9n<@H-z@RfRe2MVxc@NXTSFfs0Zr;CE8w&C{}% zEJ5%n;_5GCwYDIzxM>Uukkpg~{XDX`|1QukLNl~}@FeT_nHF?TO*&&}r=6x^TBKmT}}uS8kh|_UuOgMG+s&tcf*%XHQg;ngx9= zydi{a>zL%l+tqE47P8jAX=U;J^jv&JSijBEXu?dLyX)c^!$?{PPMQ)7#hdy8t-Lj; z0f%Wkt*r0uM=x&>%@UIYr`>}WiZjodnAoX5(T*b2T20K_jI~YyFxCwN+w34+4tmm*uN#PzWa#~u0 zxwzQV(IX_qW>$!uMZ+M@ETBI^iZ?30SlX_AF}DV-86e3S3psQoISr-cjg<#*Ajp2qF5 z@8V4_WPA;>XfOzoH$G`gXN=xp7Sp7qx8|&P{9WtLoWU!c73YuFxUQph8{QV@CGQfsDwy1mfa9%K7E=NX? zK18@)c+~(%L`HzqQ+w!Ht%wMHnicr<&Yd_L$z_?3)6oZRC2JDcO|0XwbXk@qu}K#T zaRlfJ8fRrCZ+qT|ve^HCUvYL%u~_w{cEBmrnKHt!`GV$x*mRIJiJLl5Y`XaxJk!Ej zOrn@DV%?;)p%%?n-lb9=WeaDF+T}Gyb3?-^GO4ttqZYK~QL%%Q8AGny7n|p08uf-S z)X^UfeR}|p<~S_o6v=w>`Vf+J3{$imd8s!Y+12CrKWXzX9`(iM5hLFyz!vVO<8onb z?O28M-ZW=LsRwJ2;IwbaJr5uvp3KcPzJsk-J~$)u!u>49~k&E2E? z!hO8qIr4f-;|^YUA?=tcprSJq-u133MPLo&?*=qg=-t^5;ehAbvu@OyJ zzSUXBDZfpP`;ax53;Qb%u?lBkytc%n8;&Qm{dG&FowXM0z4x0j<{B$`p3BFwW=BYZsB}g%2j;_Wj{O zH4|H0rz;XJv9Y0ZVc$IIO@HFn$oQE9dPE1jo%|;ntL3yKW4^bEMdeL3g+*{K<%bFI zTMeeS0?80#tiN^zRU8D|d3bsM({L0n1C5b}5}@e8vg2RpWDkJ-CLBAzGQy#xo%V+S zZ^67>y?P06j}HIO7GCiJnK|gl=NyR;`vf-)ri#vx2#&7*jx&HWv$JCG2y2MI!y@`C z0qYY~X+pKog5@-swx{$bUqM1$=kTFE&frIzQa)Xy7sb1KIgs^?tTOg=WHlGN=zv_3 zM-ayuM}*syb%-6`V8>Al@=);x2!8D2((BA1+~`|1>39ti%&dA68(Id7`MApKEo`j) zAPqX?Mb4UuH<+qx+ap#rLoIhBc*A0nJvd`JphVs)2(mg~l%ezWCL?;}zT;a^9@ptF z=eEZApNR3*%j{438Drjgz2t9wfykttlxB3al)-|X%G7j~FMtIAm9*4zzXx8*P+t<< zkr12w^7UjBXGo#E(!Pv17G|AJo@p!Y5Y1h7E9(RvL5X|6F4ptbugRJpW^`bs9iIWS zlXpg6Y4HU^cUkdyQj%VjYvfI{xV7z^fkZKVEH3+* zc-Dn9+ys6}lTnWauuaK{Yf(`)Jjj2{SW^R=Qs+zH)}o@)wxr*M_AG2b-z9=)sRzz_ zmOMF>|%=k`09#REN4+4RnFw*zBpA*2xGWCye1hcG}N}D2q}sTfrtLHyK$Y z>Fzgk^BT@DOPk9o-=CDZH~sx;NOB98Sv0IwNt>1smSomQtVi~-jVmP9!{+Infg#5o z{N^^VkdX%)l}E&$dyQ+ALu}Id6<6{AB04~zSNPFbjR`+r`|N+*IeSZlofk~u)1t6- zQFJGUIP}BD$8UB1^@;J?zXc&Kd#V_Kh=Ho~8-%ilA(wr!!!9E;*6~jLW!k08M&~dy zXf5qBg?S^!xijy4;E9R>Ankw3B%KQuqD=C4wO@zq_X6#jGBALqa;3B`hf{YP39W*W z8?pf&!Q7ZQBwcihi)n#*CF`Kcd084e0CPCCEzd+0bR3a#N-GJACBhM7FdUnx497J@ zdWFRFQ(ohdcboFGo(n^hvY_g2w5B6~RFRU$-=B`uB(tu93#fTD=wLvhJQG=yoD2>3 zC`iMj@%fE@XXHis2%nuHr=}t&$P|4pwZff@}M;mg>;UVNBE6Ef3VAD*vozJl(8haa<##i5zORi{yTTF}3 z79E}5z&c(vwJzFF%rxdL*Z-|Cf!RJ@Ht;%?xG0~1A=qD3YE|+;1q*xIbBSA9phUOg zeA^J^s^slf;ZHrUXroenHXKC(JZ{7f)&67whBvE(0ev7Tn61w313h`>`?E)!*3_|u zUb{X4cj-MSKfQ-J@uJA>wX@Ze41{il0I|He$*_Wr8qDjiJ5sZD-#e#DtLG6=(p)2)?^IFcj@lKP7wS4Xj$_jM~Pa~W`Uxqn@UXqur z$p=%Waa4oWiIx-5tr=YdoCAZRoS_0;CvP{pkZj@@={6~I*o&QA@Vj}FoE_s0@#Z|q znAW?|Eqz#+mr2E)sgPbZU2-$_9=meK1VBoAOShv-4PjLsq(O^}rzRt>GF9f~kML;AC z2cH8ureMUdxE-$d%1o{%I4AuHxo>!JvTA-LBCZ*9BtRkV=evJ?`j8#uhjYS@DM|uqk zFXYgy!2E5Tta(B;Ocq@;dQ$b0-enkK4C%=R4a?hJ^XP>)d)3@DT6ndzPZJh5k-(ib zUMC?C`!1QC{#!BQ99!!*Gu4c|T)Fd8FSs;8=zatqb`y0P##dmAP~oQ|-IJW0;kI0| z&I!AGr~3!me_7yL^|kj>dFQ0Vf#xvIItdKgk2bfMEoL;hGwthdg8<>z{PqU@1AvTh zTOPG*HZom5 z#MpvXSNRp4&)}?Kl3BF3bXq-Y_!l-3%(NpY&0nKkB|0r{T}<9^4*tYBCQu2Lt9rUb z+-9lTgQ9DAL1^@eU}F6)0xtAXt1^P3F+$pE{OeggLFki2sO1a6zO(M-LgCI~- z=^e^6CS}vYZlOJ&Q-r?S{X-3B?F8}ot(ewOv1vN@=08}rxkT^)z{t7!zbiTmL4z94 z`MlTChYU{nQrZ>e^k5xS`Z?I*%CEq6K_gI{bv$iS)KNrOp zecBq$T3@4l*S*IHDmT^;BKgIa2!&Uj2H?}u zFPF%A(;qO_1pLmX&jO^)D(BuG80!aqL?&q(P?~_)9Q!oUpNPP+w^;W06G1Su+?thP zM&7&hKZ*Yh@ZY`-VznQ!-mO0mb#RXLRHimBCB;`_ZX(N8wIh0A;)(%ih8{vUyD4!p zS5txGQWYL?jBy+wr2iKDo|vIltLeF)82{SpymkX#J4t%IFF_n6Gp@usl=6a=zC|9@97%0V5U&eyO**0O9M`gEUP(q4a8Hzj@)DGNVh24%FTJ58-QsPVzIaC zQp7XvZgfTEo+8e0g33(Lt=6-S)#xQh-wJDIt!)?wo^^FE5oa%Fq6hNZ#{r&pS7Sgh zb0G}MPS1X2xcGzl+xilIzs4$-;D$2aygwiK2>jGGm`lHfVfOEi4MFAt?PaQ#$||Vg z(O`G~=k75cM$3DDJn)%_>eOlqt6|b6v7Xr~PROD_|LXOx>E&IdQOg#l_cx9h#v-G! z$Pl1+|5uO7BX2FFO)Ztnr(FM4vK9Lv6q0U!-GOfxdvn5%F zqy(vt;Z9@)>>GJk;qDIBQ50g@v!-tvXT6R-V^ROPpWvYfV6v+_9~ykAjC?yBY?jWz zX8Vt;m-|b&>8B>kPJ))gy2g9HC?$CqQ15#)6VE#=L=i@6M%VZ80$)&L!x6S1ovMBF z@ZtObNy(hqyALr|4?oojvZ4JO0CNOsxz9`%`9n#@bdZ#S_M--mJsTizDuS3%;}lWG z=KJ0Z#_C}k!KVz)mBnYB4KK%KAW{lj2}Yl9_z@MPV<2EUFC0x>3fV@TAEJN@#ah>s7E*dXI1c~?J7ZD|5>%w^ z{bTN=3~1qBsDusky|;?-wS(}{hNI~lQN2(R>r^VUzsf*>Y*qBp>WS&Tk4)0MX4P`UQv}9`KGx)7k_GeBu6&qO-Ily?XK6wUNI0sPz@{Cf^V(IYFW$ZP zpo_7N3M6im+yA@fD2|KDZQ}L46MJLe%<@d!3}p9AqLX!OKqA3!9D(+x2y&Kg5ElaT z7KEMJEmcqlu#$X;<{2m9q8|Hh}PzfEogMwUSJ5(cgZ{74)H(tB) z+=jbF|lWjB8TfsS(3qsO{J-@jrEG+mh@s zM+cR4@!R~RFs_Kx#R1J~+Jb1j{5*u;I95}qIfvXd=`w|F<2qyt$Tqf!u0#z z`AfXwdD6M~b~10(kSkc74%f$w6(%umv%kJ3bxB5NCo3pF;X+mCSx1gvabS(1o}3u<|Xrrs$}VnHyMJpdh$SkXt{&@MBDe+biUcgD#N&-CX|+W300R%{$4h zQCFbwbo<5yg%RPl4Z)C9;ob2Q;<`fo{^VD4tf{V9G$*Qh2AJtxhyj>q&K*es=Im z*WeKtCmh4;T~mhCh3DG)-KLU>saNyh4xhakVu4=sjv_87=!)f}VxbQE7TDlPHew#z-66)(GV@dzHx#$G=$Pn!lS zWW=LiyON!8vzd1(Yt5`tIYUq0-ntsLljN8V*ozB(mp9J|2TN)Csk1lpwu-O3zTVPv zfl*9%d)hch-MN4fYnqo&O^PWK0ht0ShLCsiEG*m`b6I0 zT0J+h%g!5ONO%eN@yfJ((-FpS+s}NP{N*C?DX*Mp)Ldsw(YduX#y>LH!qABvE{cw9 zndEJQwve;-$l|HV4DCX#sGYi;ylpQI*1VEtJ>?U7>7ifhX|3 z%_vmx13eSDU|}9(@~W@jOBaULm!bMem^bw@W14ZeK8&{Qfq8%7C$G^SFBzd+0~D}G z;DDQF`Pj`V3xVkUh72hvAw^%?>PT}FYkTc-x%}jJ;bp8tM=L_1_+E|EN>5(e-I^x$ zE{%;>QRFJ!eWo+kLbM0(b4Xpbc^}AwnB8SctTzUzB7Tf9gFQ)B%R*0pDjnWD^B8KPn?B`TsMC=evRq z*H3oppM*K}Q)QG&s|%2r6QLtgMoZ~P#^SPJ7>++Mnw2D_p1&KB2OOlt%s1g#_h8?@${8{L>1*I+z4y!{r^FP|A zQe`mqv7@#mgyDu5b7%Ug69tWcKSwXmN>U>T=hLUK zZWi_Fud4<@d3vSX0vy4^FMdSAnQE~Xt%+IB`G575KW9Blm2vK{!L$Y;;9=X;mtW>= z!I21jGE-RDY>YbzuNV5s$0T={sRt@PT(X3_nw<|o+6&aerCFJCSfRZ-(wl3{F4GT% z97HyOG}kSe`hKu<1ID&N_%7B-i=f(g|B_2XCHn|E4Gs{d0&Nd*2A!1+E)=A%p1NT z2ljQ1;0@*E;4=G2R7oZ=oHBSiYN@O&wTNzBD40l>mzSfEl-wL)!}0W-pCm}K<~&T{ z!Od8iHUvW#w|@&}CyWXDma~OE*(M`dh!B4Ts5Rv%oLF41tlR+lVw&5vD=FvmKg@R;JomyQhrL#HLxhV!O$)d~>;D86ZAEAD@hJt7H&Y@DV*f^W`NowIr z))o4DV#;mC=GoTn7EDfb+ym;dFK_8B5O{GJ%hmzex6OH4KO(9Lr_9Ho*q-L#u8bA9 zl&bw;*^1XO2)N5V7eDGcYa4qvQacSZ(Yukn%?DA{J@uhc3__K1tHRS}lc}8Yl>~JL zClpmxi?y&Joa_<~pX0$I4d1bH4sQzW+tm_O^xSrEpgo2cBa@B#a`P-s>q`~;`WSrb zHkRyR9GqXt#jKn}4Bs&7aAqX~R#ieqwbOPJTTvDt|Lx)L(OOD=Pqg;iozNFhNlN8` z2&^mZ7_IQ!geRYjZL1&Kb`^$UX~_%4@V*_+pj<%xqj2>4QNa!!8>?T7)+A+gB1;H=vT-5N&PX}(Mew4-eKYuz#h(o{lqI*|7_X_cxM7Y{~s+o z8+hdjef@IAC|^ViFJC!w5V&{>ZCFh@Yb=v_q2NaAaev9p{>IZm-7mPZ3K{Hnex z9OuPzs}?5X3kAv4?|~U)e8GoSR=k}HX%G=7agQ0u%jn{)p`_Z=(}#6d3C|hehvD2l z1ZDnW^QRbJ;3HMrl~veE2%0IE@sL$aL|sftkbq*J70HCMg>Sdi z`wZKDJq5rn@Fvd~jG(NrO*l@nM{8(&{)!%*zv^w&RhPDvTFz#$Mz2u$$s3UMTSHNX z6iFbF6@tRY)-Z-ZKPvUk5Nq8lH;5Qx%5DMP!($wEuA|cRGU(M+m#8?)pf? zeDvgnoOUg%*cnJv(8uQ0u!VsiZC)hc#+e4DO`HIbt?^R%us>%Au%~N!LJR%>l zndEGOF2B11Mp=@s=vG}Gp!GK-U6BK>)*V&Q_C1>luAPM(xppmtiiJH^oy~n)G;hP!i4Lk3VOyoZ~XW4OTB@ zVmlr3;z0~wZ0244K5tf-MaXW@YYx?Dsa_1qn*`|2aLbZMIMvAF)V6LM^q&rO!mEsi znxV1&er+YMbhCfuWQ@PA)sxEyN;&+j3u@cDExd@0J{@tim3LLW2k48~M^D{LRq4(i zWyQ3Vsa1?SONa(D7nBQGUhwF*z(Da7+`2nlpFM(B0&Qk+h>*XZY9jgOvVQamss{rN9CjF|9+#Ro$SOX@i=sf3cAYp? zM>lq0wj6|Bl%Oga(ckgpoS`im-ugXx-ID*K2#tSbivXeZ7xG3+f07uU7vZWr$y+U? zw!^Xy3*C9VlCfT=6~6%QIq*pW=Xi(O2LIT6));zGR;o3F8y)KHbHqFd2LQFo3{fKW zo@||W??aSNCuB3@)oxI>6fNGOf9Aaj&1(d0{3B_EU`pbZzdn38gEdsi%@ldZo&m!) zrIK%8lsCPSEIyK-OFMXI@aqSC?7T}jQsqlZzPOmPc|5KI$qQSJZATh~q~T#W@-5Dw z09ky*+aLYSKpHi2m+z{Sivd?~nn*5huC3c&%fUc)^U-WTDd|WYoRoC*dbb01&%lo( z3N6Pt$O<#BwrJMk+*B4UJ;^i%yd^U)q+^2tYs1B*wXoaF+cSb=!6rQMqx%R+a4AX` zSvF#w0l5y zatuI2oTf+WEs4B=pdCMlSrPG5{(+j0BmOM+YbwUSx>hn=9o!A_gjGVaF%`hi$*6gB z+(7$Y)_O~(`kqQ~rznb3JR>vn-upDnE*~+mRHWDICAWrL{!KZ4s#nR5%N>8<7}cdT z1H;-bd6&!Ysy4F*HExNBM!2zA$H__*;vzxVy%u^;DO#DSRTY)UXO&)S_qP>v+v@-C z0yD-=^A@e>pM2fb%|nQO{p`6OKKAeDy`ioHxZUF1JsG#!qIO5niQ#KSxZBiW2T5kk z3TFi4d;fN8S@8YjqJtNE?kYy>!=hF&42E6o! z9)IU8IDS6p#1s`)(iN3WMhvP6?@U?&b1jZ~SgS`EOP+Ptu!ny*(wEHLQVK^}d=gj#a#fnt5;_+rY-AZjn>^WEdDWAGxx7 zBcm7<*qq*iycwJKd$p;U=;P>tv}EZbzVn5tjHyJVJNpk^t4#S7D$Sfg&4 z{`2&ZV9eP3;*)caRtKF327~kD)BWPbLv2hL3>nTCqo6Y5d5}5(Jr9$43zW^2c@g## zRo!u1oS@l*^}KP zZN#PW5%CoQDoxYnX13< z0WOpY-2BjnVJ~w!b@!o?>ebfJ|hZRDBJ4TUm2)MFJ*wx953G5^Yg$vjq2siy3h&Okj2iPaIlC?(xe-J z<;VC@H?V#UFZ)5>sQJiWB@c{`(>iZ3))d(ZW0w4cah9lnS@WwNbl`8UwO|Ch!;kta zD~okyud0&?{7U=JsjW?y3@~=D)QckA^L2 zzv~RfTfX{XkMtMNqR2>9n#Y_*I8Q~B9k#*G0DLC@hzJT2qGc||G+2!n7KnN{xd6-{ zXh+mx8c{p?wk-Y#Wde~P07(rS2v4lMPxZ%d*f9TWGNGQ+b%liBR9&JGa3~hGRQ0lu zu^q^{6KU@YLuF4wdU{oF8O~b$C3hl|TPzi9tg%Z*;3PTmlRSP%BPj8#mr@_7TRaF{ z5^k9r)isnEuyCkkc0#qqTxpZiL&J( z3GJ3rygu+Wjboj#_w$s+6BjOgia+~>%=tI%FOdnlw!;)5ibRBn$?#(HFhM!n=m8c! zmn>8=<)xNKMD4ZeF=8)K!XyDTTJIEO`TG7>0Vt)rYJMG-R)(*4O?u zDw`dX>sZHIw6ZfiJOW%?51HZj#3dO^GX&!G;t8)4A@#5SUo!Ac_#C@-*FQ!BgLIv- zsM{{&3^cKZdPKcl-n?()#(k`#9%dBTOTcwNgSjm0c&q+8FYL(8M@rtRK=oKB>M)`W zLO-|Rhkl3g8=OGw%Mvgf`uzOIaDjSD*8J=!ka%lO;K{KnfmKBNH4Tu3y%C7j_^fQ` zCYFd3B!ZOh4(8)0?JWQgai_dF=#PFBkE)-@4<6qTc+*eGjboX{u?S!ZX|4a0F;1AG z?IXj4UEu0Ejm9L#urjbIhdgrpXC+1y9X()J z=r6{&^Mb78_#W=#*~1)%K4G^Y2K z!tv#1I@|a@)=_9!vdF?)O$(_V_Gz3gK4CyQ=S3_UYNI+v)6apHQ<`AXdlIbSIodw) zZoiUqG*Sumn>J7)Vfku9<^l8v#&ma-yKeaYb8m-&!YO{^4MX=~wli+}E!51Ywtn5; z`aTMayxkZb-1CbkBw=5&hFA4}9kuKi4fDOyrZtVo2LY<`@*fyWEB%U#hPGle()zYT z!cGwrO?_~%0Xq1Z|4By6Lu{b#rG7OTy4kx@*j*;@lN%bu0e51uQ6I(Ih8->kqlqFKzLN;m(>0b-73a!0MB^=G$5yBTrx5B2qOZuxCAUujU)x z?vb9H&sgW{gHrErVHJ1%N=~gni`wWhPv`Rm)V)n}q~Vzsb@zrXILc;03P=S9i_`#F z$=L{}ja6jIB^gmlbcVls?@w5~IHU92HH45JF}7{ZF$!V@V{zz1ol4BqO~~&^ZNGvr z77g`yvpY#L$j`abIAvWn=1((YBDJ?j!{F8Zyfe_wDUt%4$4q|&$pG*lvhnKmw|To_ z_&^$?xGE=JuJpaEQhyJ#ToPT&3xAf*YScTJWFgzlBzo3FSwbSnU)VJonc51;6p8=aNAru_->^ zOeMTDytr;)6`tC=;NGU9de`gwDm5zXp^Y-?`*%-siVqMSa%Zcn z4#NXPApkGdM|23_>`3v|gM@w;?;2Nl4}e?cE{R1Q*I;TzTt{gF^%}(ZcBRL%7S`~#-urkm z=Bo<1YB81IY8fno-NV-O8B8OwTrUxlt3|jm{*|qq{o@GwIYv z>zcB&@#s~{wOYmz7$~vVAfP3duG6m_yt$Z(eenPtXSiuX^Q;foZw!^NfS|QoXh#`q z9N9~|RydQu@g8rVzR<4)~4R;F3f z^-z%@A(HT58%Hk-EY2fpSeGKF%f~aA2b?JbslsM1Mg$5a@yz^yHS@fU?lZBCu|MfM zlo}J~cpFEYeeyI=sD8!bUULeUez5LYEX>j>L8HsZS+JsT_VaU zq;hWwP9n43xFVK|E$z~+;KN~5K-;U%DeF1IhjR7Og?XGJgPuIU8wOBIagU|-xX$t> zH^H@raVC1{h2Xm=8txzhfJ%y}tE&azC4=MeV$@`3u{ zKwdtp_z_J;ROm*`|AJ}z7rL*ocaG|hw}ivV+)4HpKt`bW0!X3HI!y(-tSReo8D5P# zl`gFo*U0iLO*d|3nM9wd8RTtGEWiLug8gl*uUnIg%&mPF;x*#)ZL{Pj^AXJuXIjrK zXhjcxEoaxe#}wntdPxk{)OQ^PoIGCWK#37>K>sUs z#37D*6sgplGaff!!=#>SD`uUl3$!hDG7csGkhqtJV*wT?M;LUiN>J{{(Wcl9!vSvv zLv&G-pzKd?T{oNjcNlt9OKdpPCmrn*k{ zR9n({Q`Akfg>%G_o=LGs*~ZWh15f*W3>VAOc0*M5srOrnkN0N_6vNW~5B zW*v$SG(~~6Gxpc#tK9r z&b^U51`oG{Oz9c zOreL*I-fcEwl2;Qf`tm1HlPTt$>PBoo+giSn(Lv8pVqRAj5%3s+{>s z9$PqZc#PcG!NFRFIuotwtK%GFWNDo}2o;{6N=eqdeg<}T#LZ`$(60H#H^CN#QM}`)u0o2U!ssXI zJo@0czxg3LkE+S#Ylg&bbXwI0Qu2&d5=b6I>AiWGj4;cJnn#QM>6R=pu*D`fmr_Z| z3mpTTbvKoG{lkA8FoPlOH=@w$Whh%g$t3DzRK?`Uz9doMb1`R*TGgp)3Mxj8T_4-F z8)1T|KfZLC*45n*aBk~!a*zeGTXG=h_wtneY^?7g_!5w$=npt$U4H(Ml2tqe`Nfc? z1KZtz-tmpK9a`QNlzkB(-wr=XQ%2`a#$hIR_10zK5&dlvvQK)7?lV~7i_Ugqxd!FE z;b4^6DW^8c63!EEv9^(Kyts&P=S|Q0TE7f%BgTZ10I&N-3#VZ3SST(TZia!p2l`e@@>@w|B-jOo4On(F!k3O9Xhi6v9JQR3bN>_Z}Lh*cny+={#mBK zTU>#g1kuV1D{NnZ0Vr4515X4YukHDbbm4S6HK|cv%Gu=DRm$lpr_Re~jtdqQS%y9j zUJ*!rzU@W@AVLC>g;FA<8t6cfsdO@94VIPItJ0CzQoP6CHcXXV4WY$Mj5gm|mrU^1 zP!K(mD+uvWp$lVN6^t>kURE+p<1z;z5Y@z5XSjW_Z9S(+hDL;@Lg|PW;5g3ju<_nl}1^uv}XAItc=2ytKQgil+Be9%4dvLi06%0Q5KT_M1^2+MNfF+c8 zB)rFxL2;J1vtfU$cx#_2KKBV=3S@++PL{$E7k)Ty@|T~7Cz_<`HaTNP#9n}vXbZIX zkGIbeYMuVYx9=qm^Znko2b^YLDhJ|X8K)2IH+Gjju?0{P)#k(u6)|l1`X9sFeu{0g zUYR#lLVy(%J{rjg#gIjl>6X`5W4(&?^)I=D-q#BcGZ&4sHB2|O&_ zv@S~^uiTNkGJ`RWyr&mZE~WT4kL*d@CnL+6KoOA$!lzl@-k?ZH6n9n~nffCOiEzV} zJ8Rx$6h6{19mp-**Yh457woP^`JIO>4^JLH)nd22Q)TrJRTjMKcv*b?h_ox>n55O< z4ZLvl-rYH+LPj z4-~_r_nuU)o|u;*j``o?iZ|i;+wB8?LsH`*nh<9;)^|e=J2AaAlyP#O%Hp5P*I9#9 z6XA$klL!*abAins7kWYBPbK|ra}s!?`*vB$x5NOdiQ?F58r_DUeS&v z51c#k0WV0ufp58Du3r=E=HGl{6Z+OUb^kI}AHSww=-lFLUP&lpx_jZFj!`2GO+U#zDOLJCZLqpY2Xq%38PLRc+t?aujEPisoaR zup8;*2rKq}|0--{sl?S!^2Uhth?>Ouude+Gc0fkiw}|N+{v&PM9EN~p(AVm6vebSj zPfyiBw{dvcc&yz83p8TZ&F8KlV(tW&2{|{epvUDY0?Z+il`?&LxfYouu(6eFboWHG zHn@^`c`$~!Mx{M;>8_zgGcCV>A_;O{F=RbM+LO98A+u=H3Dy;KAHy*6=SILcmr~(@ zB<9fxnTwd%oEg|kg?30~ro(@7sT$Pe1)M@f#*h*Tx}#}-CB_C38GaawVtL&d7j8t>k^KXycYG0TRRk)=Zv! zg}0|x_P})}jXIlXxcUesSc9x&QT?<~Ko7_bPrV9MCwNG9a-C^3o@=LHyuNPLO~w_N za>~t2ww+~tA$)kdY+(?whDtuQFA_Gp6RAU+&v3!GI;q3;AF3&0n>ZlZUTZjh;3ziz z_vEASy$tUPd{f6-zYlDlkh{{3=v+T&PP6;`}I9<(~CRE(d z1j3yQFEnZ?d~zoGsqCPOe(^}uJLUK9oa!Q1*A7#;YT|%eY}Y$83Of*Puo^_7OCLbM z#7Z=^E3&`}c6htpOO?{k`$yqLVCwO5lpX!98GusCpE?j!EAUa{u?XCPbKs9*KM;pM zb)$Yy^}Q4rq?#$M%M4HZI5yS?$5ODY>Gbf7Nl8B~YpeHev-gj8?8Y|u!eyE>_XVor zrK-t-FlyIg&KdNW1|?Uk4HN91``kH)04ZdCp`nXajHKhXf}i7h;jPW`Vq5AXz{PK1 zD3Fg#!`)~~V>X?`2c+?i`~PF<%>$yU*Z=Wz&M?X<4lX#D!olb)h=ipG4h#<3f?9@* zAPfx2txR%BBoSs4EEQb(bV19jK^TgIh}S|)XF;emO|%kF6G6Quf{LjK!pxlC>-78n zb-5%kGv~cL&+B*t)^Z2?)W=7PjP|T99_&F3ZMj%#k&HnzDjXD99H& zyQ7wd!QV#;rh8J72C!=o-cZpi*}U#k>gT~mRfSmWEOEgS$IY)P{UHd&`^jfN9pw0! z*K%d2ulfM547N-me`qSEP?x0Zm-(9}LPW7GfjGW9mNmL9=ek7L8jX5Rs0WBfo*>Lm z&?I9)jFbq|f?)RgXf`gY@*YJc-uZPYZ4r@JT*4n5}&q8h2 zT=MF^gkb$D7&!;Mx!&bZ+?yyN{@!yD6{~E{gE)NVXnW?-9`i#uAtI|G5-|U7(w8^g zPjonv(@<6uULdU~4aRg)q9QBQNDl%kpWMaaVY{5HFbJ3jvEc1@gqiM0M-wgnWRjr0x0V57je8=ORA@9{+j&C< z@clNA+O1nfhh9Vh8df9#2L+9}+pz}9n>ZBztDVD>d1HmvNA`+iG%!zYdp-vTI*LtFB0i$xssNg`SJ7T<48RTp2u9tc-s~ZyUso{ zw~F<%UV^Y-%%KQij#a^MnETM7Ln{qGw}OlS$hjNxkvBaSaXCL_E?Wj`HR&SVOLPbm z32JQ@m34hd5^loyJsNE*GRbz(cH6mBmw&T={?FMOa3!grAKKDm7U5s~c;z?-bL+%p ztxK^}MvFDu&Aa37@W$v3mmn2;)&FPO_Cd-bfYWkSYFI1lXqKJWlVJy6+@5)E_V#jdzo!vCc7=><H;7^Fe7Sj*_waB5P5*>*VB1Hm`iq zHBW0ixBw^e5IJ+&{$bvh+Ol~x*+`HxszOy_({UtQDi7ft#jr)1nzrcrtE+kAOYPb7 zQ9uB<=|0<=&sqZ^HwZ;p+HU>G;Bo=73Mt%*<~(~Ba`lolN#cetPI&W|Uw&bY2hVc2 zHYDC{^>v{ZFKS)YL9P`xfVJ?2x&djO#f^@9KO%jtXkvxzvjn6nxqN@$<~ve7L(1s7 zC9hPSjcP@Tk~`}CU!n+{?}X%W>6VCoAJ+BxlfB*oIb+w}%eag>`qTY4zOB~2a(TiT z*xe%Jg`qP!``_NM z0SOZ9#!dLVWmH#A4vui?vC_Ki>({TP@~+P9fZzj=t3^q*4P9EaTx@zO zcbvn_A?W&=0>=14UJDnB10t`bL~IWplPNz>Lq>@tcl>b=Y@;Q}Mp)|U>#I?(FqzoQUAc1Q5gRjWe!%IYjjYq}7x2V%PV(f_&S4%^*N4K{0$|mX zW*eE zCS0i$OYFR#*RIXULN{Kyg#|+IN0gI|dFR}~4Y;%Y4vU#~QNW-(lyRvLC5C^peu#Cr zk!K^8fP)c-@BBi0_`s|TUl|NpTUoms7d@UN#^UW_dwU{?=9h@XcGjYSrMKVdKhb^# zQir&`rF%n#z|bmykwt;p)brx~ICfuO`Z57+NWmWP0ZfRuJ!p?KqbVjo;85u)D6%C7 znQ=PC7`}I4FH~NB%{8s*lWa7sGBAc9eO~}cc!b)`2k&gf=94_LdY-O~L&pc> zMR3Z@38%N7{sm(l>L6EEHjXp6{hI21inT3US2aPpadMJ8ZeB_V7|&FF?eYkizQoH5 zzEy4A3VPO2TKRf(2%zdWX+`h^w>cxm$cQa6>kCbsGgigx!lYyOor$=99Z`2^lK%U* zfZ}KbslH)6BW{Zjd5Q+gM1%A_&U3zmVs*cw*X_$*v6ce|G@)tr1OLVmur;hn^i)+| z64fLLs)MmMyVwQj+u_3+5x$i;O-CX2SQp_3v9k4(GFlN$=I6}RK*VWt$^*jrYgAP6}>do<^6-TE4a2JUi4yh9O~#hUin|L#t8|kvAD%z+z#Tbk^1dB z%k55G+r;YUnS)~neOTl559z&}0y2*cq|)>olq>5kaCwWx^KcdnOyaGwJNn0O|u2fR1hL$w@7MWN)zz~Ka_ z-D4L_ybHa@-GTr8k2l(TmMv#&`TjOv-$j{?obq0EgnojXNlLv>&j|D4Vt!mmD~fq* z^V#%pFV5xM!b#_!;GDnwk}foI78jKejjj)Q~5!7RG?efNqVSFnyu>Omrbdf!@-$q3rian85VU1LFIGb z{QO0be-o;^#N%Kbmi%s4V8VhI9i6nr3R|c4^!*=m4kOe|npdymb8#RzY-Fa5fu{ku%HAip53{ z`DfewXaIcIhHoUwJl`@|d1YMRM__Cb1axu*#T5;hu1s$-F)@lExn$x;SIqv6<0UCA zwb}UuZ#gCTt&|JGTi2zLJ43g<1;}jgj!Kb>-B$mC*Q2xI;;u8-#)1f^_`-AUk3|m>wC|_suL%u*<8GggJvqat1AyZ<~*$TkT7Tf1#R*=8{>S8MD^EJ)uUd1 z-LGg_GJN_K>*>gA5l6dlOPwKY1LyEY$RKp{d-|Q2W>(;JKXkatc|{e;ZCL?C%B|jX$mI2X+)lRV54I$ML>bZ(;rcT!T8EJcjw$F26a$ zX!fmAnJ$D&xxQ;RZ@=?#4m_H#V%XYs0ER^ck7&DHy|{yk_3A5~MxrpUB0)r0^YxtC{9mB#C_{|Fe z2({>Xyk-s7`8UqMpmgEM6qm83fOjUg%O$>9x0f-N3DPgN_2s1O9fY}RIa$hi_yTka zqDJewhcXy_+%Z{U>JpIxwDb>IbHIgkICo7Ovri^@S*?8y2uyO?V_a>2$Ql<>+}HVo zqS4M%^L`%&QL)}>XQPxl6NPOiQ#}m>J!O}?X{_CeUw>5=e}!*VLrfBeK}n(i$u^(x zAkn#qK&MY_@x;J`060=%;vq^{^7zqx#`16J$+q0uo*w=V23Wl{Qy3j)_MgzRkPStg z!n}=e7rhWE8FiiL0Rvi^V(VQ-n2oqE#>$$m za;UZ;MLc}svrE?StxpSmn53v;5LQ9 zMMPv6ueb$$_mK5gHM-=v4Xf%xfu6KDJ9qQK#P!)b8B10G(Mj(9o`;X*>7@1jjMXtq zD{*!L!`dK^E2K7=tKs!2EJa8efSYI-oV~_{gn5Cn+Vq;3XcrfdL5ARV`kzr!1OHlw zn_tn~o>f~I-6YJlUgu7%VV#mI+CZ<`e$L`fg)K&}$LY&gX_f*;_cH~`HwJ+T^CJrL zV$W#}z%kLC!sp$O@Fs%?%w@bKkbHQ&Is?%rA0Ksy#A@Ru^DPV`RpMVHyBHhdr{r^dhFF6a!aI7qT&xZ14BzDZfpWk>vSu#&Q21!lw8IavRiU>A z!XeY%cxq_08`=02PtN35)L2-M$~Z?(mBm$%vC~c>3yo;gAdgeBN*2E`&}CEP~|M)a7d`j*2T^2&8AugrT-hKnuBZfOf9T!n7>t54p;I1yG*p`WQ)& zmj@OqA$ez8${N=VluZ`L{UwZZWlP2fu~%6|bg*$KuRe{@uYX4t|A{kJi*PT$=6wbY zuF$wNc${bSRKWQ0idU=sjRNLc@E@)&l z^<0ZHQYASMMbxwktnGyl6VSOoCr593LxlqNQUU8LIg+ks^^e^3l3XMco{1RaNOg?S zenr??8O0b`Q8Z@~y)q*MnyB=Cd=Vfcqod?=GAqHPqP)@$odZ$ZR0vzxprDFYURRDb z64Y#A>338Ul=gl__B#WC7!rYzw&pQ`Hk+ajM&);5iKyKAOAkhH_3da?mdYrB2t^P1 zljMh%y6nP2*8Zmu!@ejFE2O}u8mWlOvD_gcvk9nKQ z9ILtlI6?+rC1Ianr>LPcXJ~UW_>sV+@`Q8vYu;L(#|SA4q`V}>@Q&*b<(7& zcea^R7D1mD2pH*l8|&=Yp>j$JC}~}GXxaw*s8hV%H~IG;7;8X_oSL3|5=(GNfMk085}Zh;7oejkQ75|)l>_QH zTLZJtJ`k!+L_Gk5L{4RvPD(}vuZMXEVEZ>!y;~ltv4g%Lf?P*v7TwKni6Z zz!p0W;RrD_a2S1W&?9v%W8DOMkH;CqtZVjYm|If9P8aG-N~Pvm79~6yb{Mfr;^pdL z%nILAcSL(Ci#^edj_}0wW11}^H<-NRLj|g<@DQU2l%7v~jlQu3R5pbhxjDiMVw$G7 z)!FI4)S}^d?iANi>tM&~&X#`}(ir-+HjN<&sG~#$4QR@0tMaMfzx3$+OAzFrf_40(%UQ$Gt|WtTpZxyl~F!3G1dg z|N78({-tCm7Rs_}kM&{|;Bd9WmzC3o3)NUy3|1-y>%hQtfx=WX{q1Nv%6OD@O5I15 zt3R6HRyY}|FbCK_M@IGgH@>d*P}wTbb$r^JK5~##bo#}=Whe~dbTmHjbp8nV6K<5M zwa~N^zw$-FT+BLxwf;wnhcPu;D2p!)Jq1><8)iChCYV-~;m^B~o$4Q|aXPiuZDB#> zadePTzdav>^p*VXy6XepKpZ7OW?H!*ZRF9)fm9C8Cg&4>IzI-~2!c$wdqL;FaoI)m zf9u-;J^RT`!Ia8=>cS~e?qF7hbJP|f^Icw^wwT(pox*da@FehPwpPgOdW3~tBLu#@ zDU*x2)J_Y^Ww+lIuLYST&T;(;Y*WZ%+YW7HV{8MoBbU6DZ*cL>2kS}b3>0HuzuYs1 zV|Ar~Be(Zm#IYRTRT)Y#*4+O?Ktyss$h5}Qnq+KX0tuFqB%_vb2!8PmE3|@tqYTr; z`-xr+tmU#_+))H}6om5jnJ)86TpA#1eX`^}43P-hHd76rZ&S>oZM5*Yb^!e{SWpS+ z!@aX{qFYII>kT}T>Fq(t$(ektR4d7i5m*Npl8FPteNffh(8_mAI|A6^ML2AWJh$G& zRbM+Kyt1md7Jl1f{F)on&r~tG*?vVoeEr82#v%8MzqUbxVA#EWs({>9Hg^AiOKD|( za&i(Nlb^`t6+t+BKGQzz!6Zn2AOa3SM4Y^F0vQdXRL+^&9WZBbXo93sPF5720#_^~ zV}CHC8>tzI4Yb9*h7}^uM6BoZ^i)t+wKXQdXQ(Twh;&5c@XCLwUDb@!|6^L1(&`*$ z9A@d%#jMIsm^xV`lf0>_;a#X4CXp*t#g&}yHF;rBMLKJV3O3HV`T#sR)0_Bc>ZjRz zu;k#~+a-FLg=KlouL&I90-0gOS#x0HOB&>j)vqkL4mm%Sc&{#|o_EYAcc1;mDC##B z9DCWs3+}BksPm|R_~E`Cjf|r)pjooy@i8dpGNPh8Jr)OxYsy14VBQhLTB#3dE8B$y z)1i&9iwqz4);dp=^b6&Zg=#yxxDPdVsD#`gsty}&f3pA&iXd6sJ~CW+ZM(?+=p6Xi zDHivqPEhxFyVu^`!%U1e%&(|w8WRhcuHpMZ##s~Q)=VbsFF%Eb<|1gzvdoL$@W%4T z1)zF|V!*cI_w`K7O>b>(`K}+q*k0*9l1dG$>3b0Bu>1Oi`Us~9_by^Y(538O6W6R2 z*L$VI=n$w*!FN+!m@6>r3Hq=`*@>N0PKqWKh8h2rtldOzcRHz9avD4kV~D^^wGee9BsUe}wrzvf~tr*x!E3}r3J!OCS$p%eL+U(kkIc}DiK zTd?IB`DkY;;+lxu0))uiyeNy`xBJ3*#@cj5>+!>z?Tms%q-~lW5^7eLNqH|8Lho?8 zFRdLfhANnbU~`@`tyEp7MfmxDAb5AQ1P?@W>Oe zx^~-9Zt5{%ssR{+0J#kBTJzP`PXr$P9xk_F+-ugQT@04F- zKdHW5QzJ&ntQQJ#Ji~yZ*z+91t<-jOe$fl$MRU~om0YZ1TR??6~qQwEMXQPdLk);0@n4Km3HZ>(Y!6 zoO${csgBHVU@SgmU}R_S>@_voe61LsqsM=LN^O@dtd_!2l@X>_^)G#JCS8o79md>X=RqT&(Kfs)(@kNY<+)cisvw*Ij5A#UF9>)cuWzaMI!bWFP^F7fjT z)r7efZEF8eVG!f+12pEfxPK_r%2{5ZvXcMj-NPv-rKxd-|Lzx`ZtXlT7Da_uD)A%4 z4SKWMZmfnX2l9$^SN}rRQ6!hl*?1FTzk%dVC8P5XD4LwEPQtB8Tc%J6^E(|U#e*m; ztuJiOan3Q0TKxKqPuj(iQ0FjI&&DA2og~J!c3~D`T3I^}TfCaeYvQ%pn|kZmF&)+i zxmX$|i2kM9bM7aucQk-)F&E|~wPm-lQx?Ai-Q!COHDkzHuah@IjnoroIV2y(3x14a zh6Xv2bw}<`5G5E!-SN8pVmyW+e$8!vB1L*XadXt8%!&$LDcSCGh_TYOTK}RtBNGDw zZR-bYLIy$;3q`jriHX&XqZ6 zyfin-;pJU&RK~M~zP+68KLFYzV~?DIpp-Hv7GD428m$HG<38+n%h(& zQ8$32ei?0Fnf|GbwUXz2+pGF~IU|{9e1O8|*Qr|4a2?=umRs7n#145l?(b3SdoLn7 zdek{zNnO!lAi*>49AIMHkI;%*K!TeTg$?_!{e_|?(Did-x zbU^jt0VaCgXR}yH4Fslxi3z(zLnM93ZmnJOU9i*s1Syz_d28|(VU<^dL42d*9hgNb zX`%DucRyyKQ)?r@F6jcRXG(Bo^mb?i-9zP#g!! zPxr%3CQa%+|ILKduOn+ggpjKy6J3mc`~sOo>1ywXzzPH44-?YUg+kVGnR1`5)ehmd zO{NvOsGqNZ6@NDht?3R}fQcDmgp9h%fjn{ginm|$Q+0YbhPc#c5tJ4F?~$8j+X=ZsE6&m zeQ$6bUIMmW2)VWm#`1!H!XOlGre{z}%<%2?_^!v0Se3GPaZ#VfJZ5t(;2n`jK-XP zJqLj6eBysyU^NHe#`?4Kw?Q6pErTZ}7mKXthABO-|8wYeS3lgq8<$ls$KCYSLSvu$ z5EOC*+1humnpf;2?PeaeO%W^y0Fxbr;HKKf>PiAsfx!m+1+BJ5UChS5dxl%8#!Q&mE`Wh2p8w_X~`KaZTt(e+xH`kpnb*=AwGB2tfNNio%LFTr!^T+4>eD&3i7Jw z?4eoqP}cD;O)`~uL)Q(K{*>WEI9~j;v??4*5{V4+7S+s?yWlq^L-MNcr+rYHmJ@D1 zX`HnoJk@0!EEoRPPKPpKD1Rs#>-!s^vjXwv=WcHhx#Z_@1n(-pd6RW&cgdSaId0qt zb(U8ESCqa|_0FcujAuI55(HZ9k^)^ar!Y{dC0<4YADi6R1?*=U*2RH{t(b_UNMG4^ zCMvld>{G>6`JD7nUTF8*2mg%$>4uip`s8BWFpdnezFwQgUY7jhey!c#2dxnS3%Crk z`5fygq&_cAHo;h9m*mS9UmX-5&Yb#yxG|&Mnq1~YtmYu{ne_}XZPQrt@m`DskqFXP z^ggXlcM+^*Er_#xE4sR`vfkGnVy)_IZ(sR@22L>s$YH+Fbpa3GkO?){B%B&5a=_5k z4DvUXP|+HG1QZnNe&RIy5-hwSd3@SMEv9uOT(urvT)zrt#i7?Aelp>BJ2KP}#4A(H z?GKq4NIQ(lMyHvxsPSKtYb3qk%3mL>U=;5L#A}72LEf>KOhD8lXE_Cuk(hh@zkuc+ z&E{$j5uvtn)(rnK3|P`Yv5f??xLAeEl}3B8HM!7d{Xy^n8p!q@$m|8{ouMx1!fR5-G z8u=IChIXtp7crcy;x3>`ePd69ChE4S8XcRpwF1+e|U3Gg?^ zB(g;E8tqwATg6(oQwy{88!m*}Hx9dQ_|GvfpkoU=1=gy zkN4(LO~I^kY)e4~{*xf7um4b`?O`ngu-0@#+C1yHEq!@i2<=thp1~UDnG+s*Fk5+J zCLP`@R)R%ecRC(`nBgah`*9Cc8>*EEI`H}&_wN1->A(|KKcZGsMV{+2tmpO3Caht} z#q7ILl@D3F(rYpNLaj(mz{}{48di5=w_uWNR0}+-)Uv8{PKf-y^!-rb#W7U}FngRw zB~^XKX#xN4dynRI1odREo6HEw#j(<qd^rjgkQNrmrdC(6dDTvXFLiKM8jC1n>+VU=$XqY=iL@CpI-_r6*^L*g}uyn0V zWh&~#Fkf;`RncXJ>)A~zg6Ph_!CF?**8S*rE8*^S9_PyG<~F(N*Va(ZKDmC)HW_gj z)U-&An(TL3!+53lzV_D{h0!nm#reet83n@80?GdC!>4$`E5P~{qkGY>F_zr1-2M^{ z_j&#Oa~Mmb%=9Vr9^(SW;9H*_jO}C;kNldot1MvIhoW2#@4GqLP14mWtoJ{?eTH^U zW}^we1`3S-O%NGY1{v{~%nk!_)z*7HVZ=qvAiDj&ka4W#ktC}|^^(yVs@p_br(EA3 z>M#;ySegB!3SmGgJP-W7G%QUEmr^YCQx2u%yKOgb<6PH`2jp_)#3C>%;E(Ec=$~&? zBirljQf(dzICPaYhHyF;mvE2%Z_cucB{fKOmEs;m43F1^N~J zFE?oyZMS zQ5oLASc8vZ4opDTRvW(kd*N>kOv`8NyO7wa)q(|yWgkd>u}v&y0*}chUDpS3a_7P6 zIAW7mNeMoZdIYrOtu^!@>l&oT!;iZ^;)Dj(AWE6S%;E(3#;BJ?VS+iaI-*OAQ!b!v zeZOVOeV z$=EVwy5C51B|8BZGub!PiN=j^)ntKHHcL)KlQq4?wWvv^+3gTYfI~Z@>iZ)HZ}Gy| z%JZwU+h1dHA=DqKCCUG4+C1?0xi_8-JI-gzZ4mv_t}5AQj5khhE=Pkl1~FL9S2 z3grfPM-!~U1HDpU$r?%|Cs~IVmVQQFW*6(2kFSbKe4y+6kxbhc(~s83 zgYsHTJ+2Qmmfsdu zDpa`G@!bgtOzejx3BGCL$IoOeanhG{y{X~$8R4w!xBID{r;;H4fY{?R-%}hE`W6F<*o)G#2g@A7sza>*GY!!tdKOp0xDD39V+l+Gz zxB}YL6p#xZcpPF3qt?}qxbDiB;MRDJ%F1JB8<2@j>XVcHWOWO1b6-ozNM#jq5NWQx z)y+WdzHeZ477Ui-x}=)EuUc*!@Bh=%e$|p6|1?wFr?YGxb(lDS|M$%LNuH#7w6EzY zoZWop>vBcLK>R?VITiD_-*T1`Ygr}n{Wj_i9UmKnNNYzf2;8!D6val0Nc$h9)ivF% ztRZmircu70ZEWmV*}A-`tWA3~dnu96#t^?{knZqsA~AxlvzPf3?UcIqeGbGZGUyAL zsewFnXlpI6h$0PzZDk4ram?P^Ta0;FYChax0C zAv1WFyu1SoG+z@&CeOZ8&)b$xJ_~l;1W7XjLHoeJaH_i2 zyFu>Qz&JN0gZP@2HGwSh{G;@<&=~3&Erbl2p|Z3G#J^|kj10BM<#ePmy2^k?3HfJp z|2q(E-9&tml^dXi7h9eWBMd@a^PLzM49DN+TAQ$HOx#MW@?Q}0B#FyT0r%LBp5h&y zmzM{8?moe|r(5S*&gy=k7G`NQNL<|@@mYMUFmn~Ejp-mj&GwQtufDZx1>@Xfkdr~- zfO`>V^Hqy(5GG2BOq||5`L016*F*A+-=LBuu(*db1+IU%kkgZvv>^^kGW6Fw>%f}V z4M9qDFKV=e{I*q21!*zDH;E}Gp3{A1jNi*T{3O3bbgj9BuclDdTx&rSD3H{?U%1E+ zi~{_nzwbRrUr)LWdu2B>jkBcy)M@xEx4}8?)hZcjV0c9tuIO?bl#wxG-;`6w;=q2F zzR!uDXRsolwCxHX;4z;!4qPzu%JRItAqX|d;kIi03n~b9;BzlKM6&n9&Xksc0TePP zwP9-GYJcKezvdg4kDo%i6bg|YztsVq#KC@s6Hi4oF6{)>oH=to1dI0|Jp)I)?g?2K z8g-Iagpg+s+iviBVw6-;io~$!hB`*aijg1#eHAczjLX)Sk9H#ja$w2iftUs^x zVfHe(_L@I&n7Y=MkT3&gk+02`m+a77M(5=DmHRQWepQ-*QOtEqsy!I71pI7$NWE;1 zwV5RJtgz|~Hx7H4Nb=py6Iaj*x^hRno=8lfHuA5^nyNgd(Al}=Rvn6}SabzJsnYLC z&qV}XS(M3IJgMchsc{*)+%=SEbn!xz@E_saxyMns54^E=&vDgz!B|7va)^ULgPndl zm5SiY$|5mHIyR*aa%?q*RgIiw6m30B^H#Ty(|67w_f@fuYGBv86Yd!(8-nlLI>E#S z-%pjtpFi;DEo>aQgzy|W1?MU~_kAj4R4Dts9}zdQKX7NZ2RfEa7Kh;$E=F{*I52FRME&BW3v>>s=T%3AY8t;o(=fvgJ6A!*6A?-l3v{DT;&-F+nLAPRR*x zehIekkFBKy0TSJc|F;9mjvZe;@px82xI^n!o49S`#*K(Nu_M(WRg<5>8WKO&r6ZX{ zF$z*mR(9uzSa z3@OrFHTLEZK3Ol-c67uPeo!Pj`Z)RjOx}||n-T2h*Su%uSil1zvc_IYb#{4IH)wLY_6gF)uSwqRrA^`r9IzTgjcFJVtPD7P zehsU4s}7iBf+*8X8w#>Cr++b#*H3;t!uto1+*H18_cYc#3KOLCq zlMHbLk)8uE4_8%HHBEW37A2Kibs(aRbG%MFgCa(0B_L)>C7bE%yV{dk+qC8My!&OL zHq$T9{2Q~S|1KRtL+r7H)rYwI^pdPK=wq2=T0w!HiMi+vQ--W>XET-&;)FEu_@lp? zID2Qpt`nol({TSN(zZIRFpk_w8!v=;gnGYC|HcNrNz~Dwtjf%sfR>gZq=s*fzxSWx zSrcEz^N{I^umO;OeKAKq$9FFv0kA^;gGiNd-5}^CmcRf>(D2(Cn6<%FVrACF^%%oE zgROF24?IaN-%$~+8`l;=c1vyMK3|jxeyH^8zNyjBd4S#YDrBMU8CTZwhAzDmTU3wY z=um1V0nf2KIaxmg=il>SAzJ(8EyliV*3StV0YwrTfJ<4t&J+xL`LrjNExf({lnaEV z4bY0sU$s1wwMQqYqy!-bRhHH2zupF75zyoYA$b;S8IOOIK2%)6+sd2_>ujGu3#YUL z)BH_^Zh(ZdOr|b)F}a27KI2eG;?|>uS2CW8^wL-)T)uL|W&pYX-lRqYrbfW$@*>CN ziC<%h21yogDk|CtnOS+IgofoN1`f}xMZG^O#4x>i+|%S+H!!Z+RHRdW32%r z0>~iXZ?6H4I&|-L4W~c|`17>K2ShZ-oYZjx=;A%y4(ECsDSWzm)0oaGX!+bEH6 zy1Udz*=iGz*J&@*zxJK+2`CY-rmZ77qBj_X)VM3trtv3wMmk7<$EL z#&rP|m-@wzM@_Btrc*_b6XtBjq;lI&J@9JAHUDLgfzHfZQ}9o z3^dJf7*Y5{Y(m{r#47ubWUt}$LYePK-Bu0@AyY01dV5tqqgx5@>mAvPwHUNYS7tv* zrJG)XkB=lOU7L;-(S-rra-a!`P@^A=*k2pQ#Pt0wD~btez*zbd>2RA@Gz`&O*_b_R z=+~x&wql3CU%Rll5QE!j2q)4eUX0;mXRknIN#p}%NUF-_gE7IeLQ7#8BLnbf^-Qef z6c*W=L^5mX@M|Vj8$fM+B##@SO1D=82cg4wPR7(1W61a)^5}oA0oEl7)^@Q@OFjK_ znQ}K?WFwLrf`I#taeKP=Ohjg$h}>l2h5JY#;-hs}sjQ!T5z2NTLaheG86b;Sdf@7{&8|deLmq6UU2!REczs$8tzS-Y)*IEdA<9JX z%FmMZg|Hl^>T*0hkcdZsO|416@ggV9Dh~;7aiB1;yM}Uj+34 zf6hCa$p;@kK7lK5q^pC&j(fFgczA6u^y;H^%farK7b&A=VAM>1v5oQ>nZoLcRT=BM zafyt8B|$~E)}MUiH(Aq7O*@`Z2@H=DLwt7Hc}q4~w|(I}Ru?2GNpL)D%3^^Lmn007 zya5R18&KwArdhEug5Xa!TWG_hyh#0;_*u#W|BZEzg25B33R6Zcnn(o6A@lQ$UcP*A zITn1aD{%B^-lcq0uv92wb*n%EfQC?S#L!KNziz^L`LYgOn``mQ>qcI3*=`_VQf5N< zr7%x--;=WWv`!vOq=(JaYnTP z5P3Iz2cxe%E`u)n!rKWMB4MDQKtQe+7SleX(-$<@X42VeK?^$ZzI;w}H{<+qT>2|O ztl|i1OOBg7%*)f0H)Bd5n)>s2p6zYx4(1lMpd}9 zOpN3$+Ldvulhu29%Ouqq>wn-3i$07Vm3+v=+cV77O4ibw!Sqy2AmcvvYkvLYw+9)g zbgEX8)T8&08v#~!iE2yczrmo2fH?ikp+giZHrl=@rWS92AlzeO!Vis}COqjBoKrM^ zkxHXc`TvT1qv`m&vyW%Zwh5z0vz9UBqXJYpA_2#kotHX+Y`h^|+A>;q=umA8ObDo# zb*ZT6F)o)$PT5?rmkaja|NYO72{ON=Hh#}w*<9u3!{jYiYb^4>#IRi z?~}zl)DMHu_fb(qM?ny4@q;lQ)q!vb`CAztL@uf((ywU1l&*%{Lf)7#|HjZ3E8@}|c<6JM= zy8XyanApGgR+b3l3|Nn51DJRFs^w{Eu{%&)WGdb8D#U%J^=p3Za0U3)?#Z-nE-CPp z8N6eNEF^gF`t9z7J8Ce$qGBHAQ4WOp&LdD?TLLofAd}E>)sGOpFrzQ;m61>gf$+C8 z=jVuS5r#O6!lpi^#2hNP755;-QE4j)^*`;t3S=b9gk_Tyi0Gq_3|&*$P4vNn8b<`xEVWNX_X|J1NdcMBjxR72eK^ z??$W)X9eZOoDY2)gh7#QzPZ^9oXK5w;xMTyOcmt^Hz8(tFvXJ<<9i-ElQ9FEr)|9x z*tp-X=s@_8l8M>8N-G@cZ1gKdWSs#?l9iX@pmV>6VnjqL<`!j03025x6+H*DS2xKx!Bws z4=(0n5~%dHMjb+ZY0M&)q%2D1oxiH3z2H{_VjP$wlmUl}CMN`6bRtLT&p+n*lPwo% zA?$+zClr1(Am_z@t_KgdVKfNo>US^)KTW-nuo?;{oq{$-B)jk^h+`O!)EQx)ZyAfx zO7MH@vGyuJVkrjS=xgm06^|LwbdhwSKnL&&$jrqmM;{C4$BeBA1&ATwdKy%HGM#a} z<45hHaKOMx>co~@WU4J|$&tlBs~*&gwk$B!n!D6&WLYGGLGg539Qom3YGw10<77>v3y9*n4kp&lXeP;G}yMf{AbaAggJL9zbjU+t{U7xbnFr$WDk(Je-!7lhVM z)*g5+!9{$DU@DyQeP_*oveqeP-w#|4&=kG#&p&xkJ6a@77AJ&CYR&^%G>uSt#e@)b z#z!OHAdEs>rdaD#Is;$AG(Yk$(YlS|s@FY)%tpU8ynY1H_e0<{+2!gae*XVybYP*bZkWIb~*LcIFFsO-%w1CE4WYQ-h z6_NY{(hHp)?`K72T@$Ma#&|k8Hw8cdC5wNqcE+&I$>-%w4bPu&y6IG^v+pJ#>{%Oq zG3GaA$(n9Ct|4GS22-@b|BLy}N!HTB-0uvI2~^RP-h@74EL6>Y`{eOgJ0^js9AB|A zf6)K*WMr5fSg&WD8+M@R7(S1cgBajbElhhuCG-?S*hmWst?d}Ab864qk0DiTJ?#pjPGW)0#+_Jb(t_7IiBg&Jhw-O= z5S-AnQ}Uwd+XRd-<9nPBCNVKyJLHo0JKL`#tpUccvl>q1FjnF%+Wu+n50U<-3tBXP zk{x>e1zcdAX){<|fi_0J5Q|MheW9B=B?qVPr+L~_4w3!-r_+TW*ijY?-y$BV=U=@@smxrzCf4OLnfvt=5o+IoKJY+ z-1b9u&V)GaasPjSlrtjFGy|i>N+y8iq>S_viTl4x_BpLtCR6JxEV*Ax@w9f@uER+^83(Ve`r38*=B=Hz0hNg#1Pol>_aE zQ891?8mBo14;$_lkBqBIfwk<@{?-qHkOj5Kq>eqw{&BqKG@1C|!9!LtMLX~)qtkz* z+f+y+^jA}IdBsGs!4~$2cgV@WSQpe)#0$qTeU8%34;=1blv5UM^P+7D>UCg}$eZ)y zG+!k~;$($UBXfOXkN!){CjRHHk-_{Rh~9g!D4#8hH5d zxqSY+mUp~CPV*EgBwNU#lYf58DqeuEiT`c~=TP8jZhy^~%_(B2go&rjb=aJ=ZGrn9 z-sbl7bJXYIV70hBo1i9qPVSfiv_!* zIXLpuxJ+?@pL7Ji=+c&yh->&r&d~DiJl42p^g18Tav5pvzPi*ad4rrXBP-8^hcA=G zHBxB{@66M)wju8{>UPF@PH~w^cRTa}7GIwLP@8 zz>H<=R=`cK^sG@sfeRZ7s+x`6_e#|$Ux$DT@QA!Q`XLO}4chyus7+@e?8mvKkg?5J zv`HqB8Jo^wqF&ez&5$ync?MBZ#>BX72jfxV-jK^HgJ1m|YO~z`(>_lr&`xke*XLDp zt%7$2zK#xIf?vE{f94sZpRx*wJemBY{|2v^Lbg9P@8^XdZlAx0>I!Z>!81I@bRbX? z!1*&hjBsCoyuGsL5V-fjRAPDZo}FkJT_wYK5})8vrlju&>*SMua%wohYx(>$>Bt^I zI9ai(Zdwhf5HF&*OHw1e57+9{w0G2Mvp5gu`>B${1a`dFXkGe@6mKtHY26x& zgV7DadiN7{Rn!cNd!;vV-g)(U-kx{fTE^%ntfK8x%5q_65_b-IqQL1#rilrl#Yk4W z4mgJRF#{e0skr$Zm2pA5Wir|6tb2k?ZpWWmXqh$R$Ze}C>%_Ck{J^V61kW?#MNYms z;cm@$`2YX;R_H*(wNiWYsnEkJhCv~-2%O{pqv_4#nmD`n;miaCMZ{n&2CEPhXEG6~ zwiLlYFjTFnON$09gbbCoF1RC#I9UYuwTnw@RVWrkC}6dSLKc*#u2tJA;0AH28>m&nIY$0whth(z>pVC@#d>~3DhsFsZ$;YG#D zkc$;R=r)+B+&ePWXf2qC7MX!)qwJ%nmC5yl4S0LdTC_aZ|K8Krv+mlW&0qO?nZT#< zTfI&ea|7O4C;jX3#R+^(Pbul>l0(YBR*v8fm+=!R>D~w#HQ6~%#<(lXGi0#_5<6@7 zg{oVMamT0N6R$UXjQixnW4{B6@bDMiCye$8Cs=)26X;#SONwm?VNB|#rO3U?yV|5h z*h4;=7q+3ErCcGGrE%57wxW8TvG+(~fsO4RDb0oN0`2@A9%a`K`+}j6LfGdS8yRI1 z(L3a8J$NtY54QqdlzAOHUcZCk$=G`MTg3+E#a&+3B)5!)W$TOTWt2fbN#>kDwC#F| zIyi>#+j$Ig~~0Un?hGH+MPlm%GyEQLe}>Y)|*%cFHiUoRu!m>Y$VZ{KcyK zZ_o&ifj@G45`JgAv^JYeD9LNz2_G`?1@-Y>Bnkb<`E9L~RoPo7AvU}){mm$8VpCRx zgHgq_xYYqfsE@9VDA`c@1{ogSw^>NHAdsy#GP#U$Fp;|J(s{gRmN?LVZ&=y;vh3A73K3V~+@mOMJrdDPL&r%?eWCkM#PsPG zX6n;#?*R~jAHB7AEkgN@Z1)>jpOhmvYzmd+PKsz?Y!eiS<~+pBA`)-Sn91;C^{;i5 zYY4b9BRfi7Fv>4bqVL{oqK&dA2|eN~eQC=npDF1T_shyOm8i$O^9-onbLVRMq9lvr zK0s!qL~P!&Wdmhor-N(~XQX5GS!I4=Utb@Ls9E@alMzLu)B;;doSuVtNN}NvayYbJ z53KujcFr{_b^($$yEnDWrkufW`+5{rFVJ6JK&;W0Sq2l6IKkYgb?#ko7_XId8Uy0S z2#J`vIb9ki_GMQcn)cDh!OwlE1r&J2!}?xP2U8k|B?72K+UMmqL88}ZH5*(|K*xGu zO=0=bqq6dRvesPyrZ|L9F8^tgywO@y3+47N&ountmfQENlanG3x#7w%Y3_Sgl*Ykg zO>}{o+<*(#-tEHdGM4SG?>I)eW|YY+dBm8cLm%KoDOSQXPCu+0$ zD6^dVXW+>R!F23DZJB-I!T5|BJ)e#DrjdYv+U(|+(=P9?km_QvOzz!JPt;^7RHEP# z0}~Ss1a*~jlFUB3#9T~Smdh;YG@mA)Z)5BsC0{zIn9%uB^EJY|WBGZ;o?^~jNn3u@ zd)}Qakg4)`<7EhP1h(qN#^fW6JH&+T#f36i?2lSc+7fRHFYAP5y6CaYcFx=tKqxN+ zlC@n)lwmN0m2O7`6)XCCyWu6GX-^LFlGd)FU5}$|!G#)?M(Q20qzLUEMepBYoqi$cRHbACl%ZE`lY@7c?1P@s>vf?h2p z5W!Scwq)~`ZCkd`+z60lj5*oajN7D;1MvI=#Ibi*AI||}))@||-jwCHI+@rhIh{bg z6H8^LU%!7xNjdw1J)V6Hv4DfbV;p~G!n@bGN>XbgFD1WtiFIEvtgoCEg@+O3;V{AF zh!Dgc=0s#xK<@aKr{lytMZSeEWf*kKfex+6pC}M~Ag6lWigK0pAg? zk+becX3ShG!m6<7_3$juST8TgMOX@_BBym9jfBWgNmzXjRWm9TudI?=Vj+GtnbsB| z3y&$qaUK?U>P>OU0C8Lt4CI3g*fzNnaoXm@`%sl`k&NxJT<&blzo_MVVIe597qr_+ z+A4jhFhy2YK2q3*R#wVlCh#6e^-$(K>~V_;tG^ zSE+3o(8CN#|AgVP7#Z5P-0{7q$qXU*SY4i5)4!CPdm)J!B=NcGl9IbU85O$8Ho4La z{9*XroEC=rf;eM;eUstF5*a^tV40&Leks&cGtOEf_)+uQ*c9m7tqLj@pJ=K;-XGi{ zRhO4l)7I59*w5NC7gN@8$JnXCZEq+p-aqe9_x&w+degC>n)cN43$1(?^rizfFZa!B{Fuj1ehPfuKDQp4n7vs?OUwa zrE3tDU`MwfvK8W)_>vsCInFGiE&C+ouw6TG+Rsa~N0BKpRXecK3P!8%hCMZ))duH6 znwtqg@A?l#l;N+bY^2K7PPxZPI0;tRo65>2O*VzN^Xm>v-gwN86XB5m>JDmZmKrkN zc#Ax$%KTRM+_FW^n=WU5BzM_&NJvRo7^v?{S$=j4!bQxVNyItEd2kTFL?+xWaL<*4 zkRG*jy9F^O9#0bvj2s+0SU6j{hnZYY#5dIjdkl1BU+R2*6o1!2j<)SvQb2J@&^HCx zUN(1@{=<$d2SfLMdDoko)(gw#w~F5Aol_b6`*+{FLE(yGe_ha7O~v{H_YvPv zH8r8fCk{mAJffXrAyvNL*EiyWJ>WR`NNaD?#%VA1$P8(rw87n1_Y=Wa=wN1~EA3ho zAX*`44vy*Sp$}b_Tt#1cQue}lrcffbI#F3|wv{H%{e-wm-l|aFMgGA;1y+sv1 zZH&@`*s#q8Wv2(R@P62jj5CzDzQmQqaGu26rCsxJz}@!;QLe@;w(jsR*YIuIaDV+$ z$iM#YL2gg~M=uc4MpV2MCY@!3c7$*f z6v_$W@zSszdXQU(ioHh_7Zh&5hgCNJ5*6d?C*zVOCl!+!(*f&^7Xsh&N%Go}z$s?I zw~to0SB43un~k>DXsGmz5bsZ+HnO zY%eS7v`86HQjiyAQCYf9M$Ptb&=J>gYu9t+m{jfM_)(sV`@x8w!f zLHl{$Xb3p{{8=`*Zf{{(W-c&)0PgSgU|(?@9tNx$bq0ZXjv$Pp8{Wc-KR)W_ZyyE_ zIgyf6(>v_6Wu~dItUD3?!@#_^^2AYsx}@J;JHOH*To%>(Md+0xTJO}rPu@R%#X(;y zq#zzU%dYI{ZvGh@No?@?r_X7l>U+F}m8TxJd9df?^s`YSG7qeSWKvUpqiqCZN^^b$ z8^`wo;~Tn?uTi#D-=Bt(r5!j(Fo+7jZa$O?&j95(qI*f&Y(_P%(@_ZhjZ7Izmf0NJ zyFnw#aNL6^<(SMpx-+^jA+~9Y7Rh?-5bY8?s=du6zY6O5Uz(~_jA~%Tf_ZZ19Gv*( zBML=wK4eo4)3nW@JSK*l{^8KAU{n@Sao z>Yd514rIp!<_)_LvxBns(8^TtGZw*ACK>PTe|>#?!zfsZkeX4U<`E1Z+I{u4oclwX zyE=oFE7u{)x@-4f;1UX83ou6oaP668z-q^nY^Z!P6Kmz#(hz=JFHhuQi>FHn1A`m0 z)-?HA=TU_{^zC|+!ajI}-*LIK*93F3UL%ws30F{T#;^3^!x`Se-hku!f>Ltu1}D6k zE3a*{fWQ+~YcwyJSkXCkU*gn=xAuZVcV_hk6~l>$>+{u}j6H4C5QLI=9hMm58eDCrvpMrCKGE@0JwBlt7Zo15j% zUBn#qZ0wFjdptJ69&5ny!<0*3B8l&J`}uQt5s-V^7Nz$b&;y*3@4asa3lBBx>h6Uv zX`%_*M7_r=tB*QzM+2D9h;ns&q61k=E@ld19lDDRPZxCgg2z z6H3QA6u;W*o_pH@Y`3Prx=I_q+#!qp491hDHRY!*|Jmg2|Gu4r{Pet|jZ%7f>?m6= zznzWYY1jzK$!ppH9;>1^_=Sf-)q%BW)bp}R0n01y^qvrS%Owr2%s{_VP z)XGeo<7z>lzTuJLA&rduAd)fNSFs(8rI}1Vd%*yF`5!`aCgm5m42cg>H zs$rBt#H(yWmGF-RSNMJ>{2z~QAM))-=dn)1HSoMc_^t@@)78xR^Az%${z&$aZQl-X zg@C+xczXZ-;K7^znxWHET%4qqC8IZPd$JppP*7oFN});e+7_ZJb%owX>WgRCG;vSR zJY;W?!HGpU;#F?d-_5d@?3-wTM5gsz=Bs&i;NkhkTrjJ+yU(~l@`tBoWK7u((o!xlrIAx0pbja4R zdvD~xyG^_)LFAkca}yOIkDkHO+&1xI?vcFz4lpP>tdiO&{7+Spry=Ys{Rzf@@%j1x zvXrw?S{p~En9adywC%0OQ8TQRHSwhcEZCTT+G%TqpP!FN6rteXztRgQFzCh=FS#WG z-DTq`Z!`}q!Sd?>s0Fr`#XyQE$=i^^-~NK*`!t@%txV|Ivl+?}xm9p?&(*ko*-3?U0N90j-6R^g$XyX0re zIm2^D6up)g8wzn7+}MGp zdN5>&6`8ehacQ*CGZeCxv8N~NkbT&Zc!e<)m|g-1zQYo_PAEo2*|OO2l@WBTm$gF@ zUzDgzWK>@kc7Y_5x8cl4R25prSqYhT{zbWymc?AC?A?#y#t~c2oi7*qGG<8l7YbFH zZQ~}|<##BMm;fe|2(hA}J;`2x$Gp`zHFfs4_Rf-7He$ddUhdhf9^hH)iBr7qNw085 zWi~X=pkl^F0BGLqbEpFdmgt{qOk-ZeTYEP{32yd-(ZxRlsv>DuuWzBBim<|DO0qyo zF5#RQ9}mea4pMXVVUC+o{a$?p_SN4>>e4jZ{P44bq8|UQoRWU1tZbcM2tY%X^QNOi zB$_&PD*JzJ`_U>;Svt4zQgbr7+N(#89&&e3W+!^Wmm#sWVO}%@2o05sSL=0)0Q=5| zIyI+j#tg*gw%)i&S*F5uW!=cRaespQPioGNys(M3=Q|tD$zq}-C}$rSf!}E6(CZRt zSXNwuIV_I*bn?g8Vf=pw?ll@T09cLl9oueRHkhgyid269g;;rM72|<8gt*Z6KB`} zWwzZu`;p*veM_JEn&JDa?mC3i`EvU+W!ZhkHf}Z^*P|Zu;de_#M&dmOVE?q5eg#=C z)b#Poo5uh*Z#I5U8P$n<`%Hj@!xghvTKA=H#&cY6H)N(YdUy&Q za6-prWYLg;xhGm@(asM;lwT1YDStZ{=a+=-o&oFIfqd(CLAB1nQ#l>T2^-5butfU@ z59Jm!4pDcP0at{SX#CRxd34alK~~B=^ZlYBF*F|OFU8|zp`M;af{M9R^U#jUY8v+D zDdNCtcLQPPvgaA;m`w-4g8b?R`U}ozgkxiX%oJ+pL2OnLr_V)UWLxE$FU_kvsnrIE zES~*#d?^cyh=8L?C^$3S)o&PH&UTCpsP%@S!t?)Xr2YLOndJ#)>hs9n2*3$mfYLKp zofbEMP;2~m$P5$8X!nACds)w3;B~5giiubb5N0~7=uTOTge$zM%oA)SCYAOFU`;Ic zjMz)bYtt5iB3~*Fl@)E+QYPn$$Yk$Ln@*v)J%Q%L84M$;iRyWO6oV}c2raHpJ4$;2 z-ZR65%V}CFi}<;puDz?uJKJ76ezhc7A?T)d7|9=Q8!7j4_UF?q&bd2GM4BT?vqi6xR{H#;_L zWh@^^K0J;M@X1BK$P|uCCZ2abhGuG~N;Mjw1$1N6UpL52wcl)>Nr)EFF>gYl6MP?9 zn=61|vQD#&u;!7)e3c}(T#>{pvuA${B_45f^*Mnp9tLjc*GzJbA`G7c`$EnpYqj4hP}cv$<2yt1Z;M#+|(r z3)stsZcvD%_1$-AXB_KOzZ_%)De-F0EWsZ?4nm=S29)hTgjC2c3DcQ}6k}0ID(AM+ z{15A*3b3A7Nmx7N(O8-3+C1PSytCmIV{iSG1)xlmm9u2R8GDD!Dw`!whp)VwTqk3c zTQKNV`+C60$OH3i`-;Z#=y9hx5U^PSjpE|X>a??Iw90)*?kTr@+z(wi6Eo?3sj#3T zLM%fG(~YE05oAS}Y^A@Ttl5>1f>x;#WvZ|C9(2R)QHyZFnnKj-TnJmo%d=)USr5h>3*FPFxIdF6sS<~@lHdmic;M0dXE33qtk_*may$g$_Ve(;=C(oD7Vwc61pj z>lZWFAy44*4C-a2^?*Dn5ur2K4xE+O#m|AecGMX?9}z07$j@E8djuF~#$DKuodEJZ z0s%dz;v1|o(@))QBib&0=P`vT)LjnbSWLcO^pOxxRyzw%>68>Peno{S&4ktTV!hDM zyVtapGOA&fJu4}0rbk3ks5E;9S`+gMY2E`dHb*Aj1yw!={dfwgIoZpPVN}ECe$++r z8T;DK%A6n5?qo-Y>4fLZM=($S-VpP^uRO7D9o7|8j(3oj{+bbFTZ+hgdbz)lbZge zVh^@udU_*%C~gS?P{x#QKsH)norx8OQL48jE{!<&@U34N`w@FsIpqq&8Z_AFP(|6c z@Q!@L&0hyydzvswhgHG!ht|ml4YNyB&|2QxeZ=7G?;zi=?h{RL%lgxzeK~;cQgiDp^q6 zW$`!Z2ctskX{DdXJC2^w;CR6A%A@+y)D#i?f5=t*kwB3^9RwO*SyIyLCt8^zy^x>L z`V-9!ME}CROaSpYh_KF$WrQ$|4r{xv!GTNrk`<7BW?_Bk`-;La;cW~VK)=dl1X_9|t7T!jtYMMvirQ_vk+0FPIS6~L| z=|hT8ZW_n8$&Dwlq{pK;`V%k-wDs)A@bV_c%WkIu117}!hsAOqWEq5}UIwplY{U<^ zz>@wQLpgT~-s`FE3=P9Y6W`ZtI8EC>JRLPd?iyDw6@RJKmZO;>9!4Pm%Q9Z3lFiR* zqAf#Z#!!53%5fgkie|}=CAvYV4gE+i87;%QjFt_L5zP)WiDt=jKqQ1>C@cj*G0yRU zwSd?L{xb!iL~A~7gdj=I-DES~NVMmlnZsna8md4p4mvlf08N@eC*5(W3~o#2@kG+i zBpsvr%GeF1%^+lVjFU&^>(Lnci2u-#NF)#pFph42=6vL0P>EYEyk0BJ4|{Ie5b9U* z`~7k%=6<8he!F41TJF3J{l$S@F*USBj9(q@=;=p09|BN5q{(40_M9!ac^>)!5P&{; ziHbJ1J; zFe*$@vJtV8p!mjYxz`F|(!xhcV3N1u$QQK2e93dGcL}L+WHvX`76&LI5Eq9*Ztx_b zzCS`}IF0v|^s=bSxxDD3+@TuL#pFqW|JTSkgS`1qJ;3YlE1GfXxq&|*obk@SU7l-A#QtTHshMy>Fd)e$Wy~o?xzl_r!gjzD_!u}Fk7YZ=GOAw=z9hd z!L+ci@{T?p)}BN=k&wX8%zFwxHE~w1GSP;E$dE@!R}F4M71;wd$k^b8XicXjz^%z-V zg2F;vRkl$h>O!}h|C^*Py?{5#0b0@ON30!wH+eM?VW^%u|Jvh3jne&(fC~6bd(mx3 zr=8y+hoGAObtPj8zIkvDT0?*F^qd@s3iCZ*WS$ur(a1uLCB;sb^ns9$`%qlJxr8n# zW1JwFFSViT9!#7mfGon2MoiEqJwO}UnGDI~xEYf8@vco}L2>WMxS?d_x~+YK;9iB6 zpcfS#%b;YtL)2IRNr{GA=`F(F=0^-;gh|nmvE*CEGKN_4;^q**T5q;SW7Xzyta8a} zCWMBczyn5dGUgFw3;b=nR1_>X9J(ZlcZHReQiiXP!+wIut$zKGv72nw$c-XAC#RGq zUlWz&;&pL3qo^3oa8T3d-o6cLdSG2jSfd_M7XM1>0HoqM>_H|L$)kJWs0Mpzi!#)r z5*`oY9|_YrTp@DqGcb~N%G^Ul!HO8swBaVv)8t^eQKT)B#tlU+*b-qRK>T+OmJoI~ zZ5Z*FMBQ58z?uLKNDs#rnD4^D^e{9gv zyo2Ia2a>AWXv}*B)~W7xH&9k4jPkKzXtrm$A5|R^8>yLua1qt5Xj=o$+$1ChuzDAxfL=+x3 z8Y(i|D=X!^15uJV&cU8pW%JWnJ)0m`P9YOs*mpO}4LK>Ifqgw|R}cywSzf?}f1CaI zBiiyl)*QwzL{lguq4@G<`eXFjFj z0ahOC3QIi)&BoXrDJ&5j0*c%#ct?`(k%OF!R_8o7=hAMh7d)qN@Ol@&$DNJpRYn_# zUD8w6MF^^hyHAX^m1)5H95>oF6|VpI&p`7yAWmN`;j+)u&>R1@nSmDH5{U-#%I038 zUijI#%+*puHcQ(F`*S$I@q-#Fw+-+RO_0{EhPm#zon<}dAq51q_lUiv2`J;{X!5(w z^5{qSGKzJ-6YArOmSMl*k@1nbDy*cG<`nQd?Q$lWgva_>2qr!i>_E&UMg`A-Cx^jX zHZGkV>0OPzyU1MFhJR%r90Jyh!uyhHYNDF-x(w=u0`D@hBshe2_K=7_Y$|7HWLrNP zYlZiwrI&!v^Ltb<#fzDUVfC#(8X{BQQ$U|fDrEn4c{>MiN0rHDk$B( zSkIAmXf#A2_#Eq11@M;aBguP^+YJyaZ(?z&n=*d*B-zi4YkULmOG({Xb$b}T%!BZ^ zClaPgrvS^B#Mj<6LEfiW*wsc^KbkBkBO)tUyP%Y8X!#psPVnv%3d-6xMIxRbRUSog z)B5z~7G_*@J)PLcTxGbn&2{bKIDR?~d!;k~7EkQ!fFyu_g}EHz_0H^U%B5~WNGgn#_a z&4aCO=XazE{S!(=ss>2=+rBC>u{JgNW{9D(*5vuAm(ZeSmy^w;;KnaebWm!jWn(e z>Lzy=_!*WteqPSvLRj*9ONqC@3KtV+qqJza#ew1jWWJDh{2>m_phY;+Kkf_}v1nsFC!qcUz zf-s?(cX>`t_lh=`7*Y{XAU!!Qn1N9q9Sv{fN;%vUMv7ikfpeaho6{Z>uqtSh%rum5 zFQF}zM>4H;iOB*6_a;LhW*NJ&_z^fSwZqx#IZ0N^6&uESCfN%q=j>FkXwQ|!a+`dE zy7$Ke2(jn0%#FG+2x;^`Wzv2Jh_XDRk6#i`8%ihX<=U>ko@4)MBs|bhh#__jZ*P%X z7~IzHW@T+;jPQJ+EkQuxgXzW=#x5!>Helz~D&t}ax>{S!*oXp9OmYj#GksOOcMat> z`b@(LsUp=D&hW!iOGARhUti9c=(nG5oheriCe@G3w@=U<$-a4AbAqMRfGCY->qXdT_XMS~?caM~cl(lRQ`Q1(txUwj&EFgXDf98uDk|oG3$gvI z+7Uo0TYUR2otp9Z@x*iLoB4)oRfBFC`580*JM*lSx9Ry;uV`0L1j}o21TSy68f!3n5z*I+7r{if@BORuy(m zH~iyVgyGm3aB18f2Zm8GQHvz;_AKq>fU$3HVYj7f+o>4xvIMWV(GAyFotR8;E^K!L zZji*+)clL5$pbvus^!jC3`Y_bNgZD>oS4|(HG2f~UQJE)lx2;i_8OVME^s^&27);n zQ|5l!GLUs8wG`ty&`IhJXn9161rsG%?py^QT!Q2QKJd)QTo_f*meGN$q7`!GXr${{ zf(zt)%-NA4-oyZp+QCGHcQMA3ag4}Y&P{-jaHdeqC3Rk+6du%nZ#TxDAcTF4@;0sa z#%XJmE6;`4gTqQoC`)yqIIyO=15hcS@06$0_%KJ8+rW1b6!TNy7{STo?NLRHLpv6z@zgnQG=Yi zTlg>?ukW7(^)5B0kTS4gtYLn|bc%b|Up(~X(=(LvoNg+iQ8`=!2jPMy=gs~sfr75S zaH1xLQT6yWH6OEj8lHls%jWHeTlM)zxKI;7f7NK*V=gJ|VORDZ0~>pa#C(w093D0p zl3x)Kf1&Q2F?XHodcNyg=4O#7IYDS(e)m5LbS4m@7!D=d-byHOVliWrkK( z(auWzBnKd!$C2%m)Ajlp!thEyNiGX4rCdkf6|y<9A}hgREw2y58apYlwwlO_8Ej{a z+XTRP)t-LRx-qF*9V+b`iQ3X}d4NYXveJWxujd)g;>*m3&ZP5Nz z72v(gj6-cK?!&skI`K8fnE+xuVu1KA{RlX4K=#B2X8}U}tl{1!N*O7v>3au#G=PZ> zu(n`c3cbYs)%60x2hTutkNQo5x03l5k@nt#STq1nEypNje}6Tnoh*;JlkP`7m}Czc z%U@>i@ZDu{;46?wKSuR zQLXs?xEQiMHcVqm1;rD=B${82au1-F8tHok~I3Pt14sctCGHX z5l|}+6cbHPJ1EzIa{bhNcr~5c^UdZyrs-PR<~4kpG;iqNQ;}U3GO)A-$-o{kcEL(^fu0XXw&X?RhKa~$^QL?} zq8SzZSHm^aLy;&cDQOxGH`rmG8VM2Xp0Q7ot0+b%^&+3oUUU}AC9*9uA|e8~BS^uE zsv)fl3WK1(HqEm<^NEJ#x70Bz_Qck2f=+_zZ7NWyj#1pjo{cHF$gaPJVu^Q%7)1~6TRbvNwd=3IJ3S>6fE zdoOs%Gm85L)MAwj#KyPFbpgbV#x?D@q%2n&V2k$cc9|*uO9VSP38MQ=IF^knqH|1D z0OJnMSK(pb9#|Vq9QnnT!ng;$S&w*KWP}c>e~HRN_{Xgv#(!DA{n?x(!A*$*@R6Nu?~&5*kw7jehNT!|DJ2Z;O-><6srbn|EsXOAqGr8o zg+P+O7Uw+5#P;ApOr2vI^3u5ye1hS+2}G7@{w2nK@kAqZ==#9gRYY^!wT-AUD{Fkv z?8{Vp<696_G9HmQB_%UU@mr|7FBNtZV<*{|M7c#Fv)@bd0;x^(Co#CY8|K}?78r-y zKYo%t$4~XWH;J#VJ;H%u>%oDN5V_?al!F_&d0U`qA~f|&^t8n;MT5R>?Lz$3kd>3G z;2xpUEY_m@-2p;Ks4EV&;c55Wmib4*h>I0glQe2cFWMcuCtb=cju;fBZTvpmtwi z9Ha-PrfG~SVAxR{3IEG%hrwXGaHPPjcHKF%4+b1rgUAY!+jAiy$qB=L*lsL5|-Ic-maNo^sv~j0+@Q z=UBHez;>Uy{SpOSWOC~3oeUR8ygFTqDiPwC{s|Sc8@cpBEe$%kbGxMO#*t~!5Cs@2 zrs9=Vq8~iJu#t!K>ys2l86e4X+N)*@X0;beJAT7=>X)@pVH3F*0RB4Y*_SKPB)Bfx zX&2F|zlZoz`#YVje9%dHG8^u>rC!brKua*{P|a~XYZP!WWHJ6!SHde*T<=tJquXz=j~O`9=+bbU+A=Y_S<=oF^!pLxgKPOwGx@|C4c_0oEt=nb(#LM={PSTf7>EQ!0P;?TAWjpFVispNLz8 z_JJP>x5k7{tfrR8RApJ0a!{kUlA5~;=TH~1g}v9^cv-Ie2ItUy^Ti8BRlgzUE@fS@ zSZ3qyp=vq&^N1PEhyYcNlo?iK_Vhx}*;i)2$=%o|Ohn5c{d)%i5b3>!2aWxpT*ilo zXFNobjZ8U~oMxeH&lr=DFaAKT%m+80-P4F@6;cz{soW??9{0a=++g@2CypYFdC20` zz2gbJKB5tlhk_UCO%cq>daFg}Z$FvKoX%KCc(Q+U7ilrZ?>b>i^ZOHNZec12D4|K?p3=%M zSikOWWb4!(LP5w%%KDvF%B6WH9I2^-swZ##2|J_G7kN#TJAcP_-KyB~LO71qW%f*l z*Zr21B3H&j3>+Exka8RRxIXV?L2Fzbf)@J16y+lZ5%wL_3s3?EB{^=%ox%7gR1dp( zMiuucqMYJ>lGe^86SUfhdO#+i0=(o|2VJW*s$EQdWa zXSrxgra0q?rtrp(V4^?~`?v|rPF2$9%OU#KRS@0xQc{G%(o$S~UhdSB$*CaU3&=&v zb>kY!`u5AfJiXS{9~RLajk{=KKmKXT>&Bey?R>|e?l$4tHm@FMNS_Ef+Aw4wQ%5L3h}E)^0+rR6<@0w6al zxmPRng+cS6DsJ0&=O@MYd*hN(r zKbKqfks8+aC(oG1cClBeSZgZ;4%XzIrD(1{`wqeq4IYnOf9$j218QCmS9>x1vEC}5 zBInkipPJtBu!`Z<6E6ND{-}x6R4u=<2-;;r)5YwfT#LbcU4{I(m~j;nv!2j)fK&j1 zoXN#bhHhk$Z2{#}%MjbGaiks$XH4rFkcS*IVTw#OmVdJ!%+NqU@ji$H_x?At$58c5 z@1-8u6~7L;`I~PupC}yYUs0PY9zI*>O67Njglf>4}sAvv}+8%yU?j-m$)5}T&& zfS#YR=`KJ{ct!V;)I|GaqTcBg-BT&2Hn5Hx9;#LFtE$@ZgyiGP`MYInr^3F>poJhS zyPbDa+^oR5UABr5L1wAM96=^DB~(-}%1C0avlBa;)Fv0o>0b8C!c8Vr*v}y%c8qYM z6z_Um4&c7Y-yA@!?hXeXO6h!7O$yudZ7OFQJwRG=Mg zW0GJn=Owd`b(OUNQzbVg)cAQSEFnbVwmmzUnAH59XEFi5kqH-Fxo3oDqENBg#F&Q6 zYQ88}rbD{q=N5$AG004i=`UsWme8da5xH)qRTs&6In zKa8+{01JsqlzU0sZpzwtL>6nGd6%~A46(Z-v|s`BDQ6$9xKdAX|H8jUQ`=RdFa_Ba zp8~O5yjdb%RoV2Z!f2jm0x1T9$|;0m(?aaa^gJ7ZCTgJ+SjdsCI^^^1`(MLy#9xt` zmS4hW%Q0>zzqrFQFh|T)?gtIcUsdG*g{ol_^8ntQ{^HoSEh`y|j!bCV{d_%K!1HyG zEWd?HRM>m1l2(qx6QN3~*D`$MQeFq!A6*^cJ(CP!IF5Me`jls4hQf?zmFHrqcx{q) zI*w4X6t8c|r-QO)qd(~LkJ+u5d?upLzF zXMb<+Go+mY-Oj(R{poNJ1-t`mA0WxIz8!fF{S)=HQs`fa?}AUO6ef=Otxz}#pDs^? z6koRK5Vju8tfXt@JvlcckUaAxaK$8?t@R~CPvHp0?(0KwqXS{yQJ-=>kWtEr`Q7^C z4EKiM^{!5#`?0s4YJ}z2osdVsvJhMo-4p>vA3{YFwk12WP%eL-)?1=8x+?}o`U#oEE&D6qT-<3o~rpG5xwdD5t4Whhog(O z#IgLQJ6Js5$N6NKd6ap9L$A-q0(D zR8Roc4j8q2o&z2-VPdjUb{EYD{gR+oi$phNiW;3Rx)f{}%-tv>4Y`6-<5)_6N zn@>@;ev4PLp0RFN83dEb6}Mt9$(*3aKlU5%qHK+BqinEj1XwX0YF0aOH3<;3Y71aD_kN1|z&}rPp$(3d z&8TeeR+*}W`aM@u-m(O17LrV6>&b5zlWE=QUUKW&62E}v-JJ|CGr8|jF+l=^GRyS& zd)Ss@m|f1lpp~;^rs$^?Xq^T|P1rA#WH0^o9LhapOD5a1er26pISzUCNl0qsvWeI2 zrr#Mp>cWGKlyZ=Nt%0!hi5-P*;5my8iwe!yH>s&rjNN(DemTHATBd|$#rJdf7YdL= zWW}>1j7fj{v5*<%pBMEsSw$IoZbdRi=X_T^W0!SjbSX@_dleb91!!wP$3r>Sg$H4F zL)R8LmrrVT=~5n{JviMAn5TwJ;CDamgJq7gdLCToC;G?VDGlEzq)_L%j=H8XPEX97 zx=MteI*!~Ep0Gh$b{b=`;Tp5^T9jbRhsc~(=wtr9D7W-L*jLjuw*vV&q&lnERt%Ja ztv(_LyiuZ|x@KXQp%-r$RY>G|GnQQ9{PTx{8LkKM)7%@kF&L#ThiSka(CKo=zzBd1 zlhlRWRku$I{T9)nJ^EA)0O@jtqNXo zX;hE1K5(>+tA&rbKAQu@D=Vi2@gZArID(G^-ec@PmaiW{S;H=|RlM;9WsoeA#p>su z0|W|19FbH1vPxl!)}`So51xz_D|g2~4l`B6AuD4~?YvPPAnNib4BLozFk=U68?z|x zcwqcrtkw`9>aROUs)H-ipvfe$0lCB1m;~dcQq46RfDC|@4(B{vxBZEO;m_cmA9TWr zb}z2@-NTf1$5!3HL`%s_BV$=ce0%nc9)hxcpTKlFPW(qgK}bFl?ylMQ;`y(U@%ker zR_qa1`-SV+@0;k9cwt9W!A%4be&StWHp zluEys3;&~+JN+IqDEhP5#kiy52&S|R)2r#$$DdP5mw((KqPlA(@N6=L9gWUI_mJqG zQhXjm*y!%jaB0V}@8!NTP|#zi7397r{6k!?Di!#Fm+!;B(rm>aIC?FlRCp^NKEG7P za52Q(ZJjxcg(jAyAbZcUm-zbTFB=)vIAuOc@NjmF@&jDYGFTi>RJWBB#?u@j&Pb^F z`*<}7+Ap+N1QPh(wsaB`gtg1m&$~`4R3VLy?;zIW6?6{ey1$K`Z`Gpc93Y+~G&j-C zT2Y^hOyBgdm@ox(n15;K|Fw@=?J2umkoKGqP5gG~N8b(&ak3I+-~T(#JyQQUw%{HD zDF(3onl(EpcgoH(kN*+5xp}LQD5uw<6EK6BbUCAEPhZNC?b-EU@n*d~8w!ATQ2FQ1 z&A!cWTL}J59zLc19rhV==M9vbXTF990!OMfIg@`l4|EJ!kg!k=;jP^Dd^tA|1o-Uh zR+^JwkvKhb&SQqVMfl7N|B>PL5fOH{wb`X@E-Pip_55UYiN?)$IE4*YTXXDBf;7u< z^k@SEX$i+yl%sT|*Q0>T^iJ?I9Mnz4IrdB#3%j`65(gciRa7v*^rY_bb6k7^Jcc$8#48iT(KJ_o9H3yxPoC zmIMB^Da2`8{ddCq;9cvVpzF-!aZ)yrC7R`YjNFn7l>QXg3|#PAxHl2^TP31f#Hm92 z0f9gJ(}icB&rA_J#Kq%09gJ z$8-Ji@-tH~mv(%ULt8eg!TCLK^?JmakhX4vY&%2xCvbK0|4j{jzjyK_|r}c>H*JTY5z0 z4rHn!Rp;+Lvs*x%@T{yX&tzFWG=@p@5Erf-E6EF-mXgF+l!QB$ufW3R_;2vy&ygwL zkjb7^Rc_E2P*+{;mzOjAK$nB3V#2que1{9RWdi{HecH1viM9lYdw*QzckV3iC%`(mbMDl4LZx|?TYixw=hksps zlJ;L*r>55KK-w}LsL6=4u3n5YTQZgay6+K$HMZ-E3fAxU2N-^gcqB91>i05k&mU*e z%Aep@->6T~Fs8k|CYCBJ1;l7|tBOGg#pNKx3I4(JW9d+OuVT%euGhZ z5p(>G?P4tN5bwT#B+@dI=%^Wk=ge!dAxWWh5svC#7U) z!q?R>{{dXC`}qj{>u@|C;1OpevY&5MDEP6zx5FtaZ=bz0K>fw!40e!?$4MZ@R6c`S zpDq&9!mP+@+<0^MD}=f_qUFMB#_qkgWET}f_{i)j`(yS85kvowSxyrB=5}phxWPp0 zrFK1Rz7PNP1GU3%vM!uR;>WcMFZ`BWfwyNP4E0wN80QznihAv3yv=#X|G^YDMaC5o zCOvBacPT&hHD&c0&LUw36Jx5Rc0BRw*|TT{k-{wp-}GV(#LonW;e0S*ap<9b@OE9n zgZ(KYYfTP##}mDL*~ts*ptcRi!}qcJwzu3_2guhR5(X*s0z>92{F#Ld*)`S}J7tlG zyuRJMAiXRibW2@}$$9gj;o3-SvOm%!B#0tJSOkg=IfF*9K7(I%_5Q=_(n5X)It;q_ zCm1v=liB$hixw$V=Iys;z$4sa#pzK?NuQpSDQwI`^bK*Exr`|?DYA=Frs>v^>YWwO zj?>CCnd$Y4fKVKt0S(JrY(;bs!^dPEwNWn76xOq9X(JT-Iv?WY z`CAE$>1|OjhH}0AF0f#NH<_}91<5Oi+YWPJcvV&3Q-I3o2xp8{2dh!F3Rv;gh0BB( zCeziG_t0(!&C_3za~7%Q>RMn%$H?=V$WPJJ2Ye$lx+nim8$P@wv%Rm!Sa?llEK11o zP=GP=txS1`xPSj*5~I`+*2X6sXa<9tQZbZzXU%y`TkgtKD=SKsaxNP5s;Pf4#R49D z?({uRkTH^5qhP}6w-jwRo1MZqErgfpDNrjnag}Y_iR#McSOP@r{No2&n-=x;i2wZH z#XR9jo2wqW(PucrAF%G&PIK|>zb_m>Tny*{0$r_j(6A6gf6QtUD(RjE9td&VhIRYE z?UMn=7&&D+5TirHEk~<^iBXR7ygY~D_gkuKGN=1jLEYp6Gw#DSNv(_cV0k?ladxUH2K-fDHnO;U7-ju)63bp)wiNqR z41k)fM#n8sw{Xq;p6kZYGexp0H-UCS;*l~@vt(t-XgTK~)%Al+XcO&Xjk@z|<^d+i z6`{*0>#D6X)4Y0j8D*3l&h#p-w1&dOVrlQ19?9p`>O~2g))_)KdPZKlyfP_KmxdYJq=Sk8$C==};fTcdS6K6@m>q2)s^(M&uGteIMx%DJU>p2L z!jYNh)pG7Inb3K+2nzz(hbP=0+P{H`m6o1I2lJk;j#Q6m*|$g7$yuFmaD0QNC(fmu zK(XIWZUUs2=3h$^J6u`sGnT=`#p>P!V~`8))*Yv0Y8sJY6jb+Z*F>!KeP%PrR=b9Rsi1 zeWg=3;fL=ZI!|$|q_#hq@R~Qm2yOJmrvM&qC$vpOg&DI|*Gg1If%9mJbT)7bdreK% zUCR9$;p%qn2CQit9#_~Yr83Zbj%dB`x`eTK5})z@5vbDI@o)4pygc!Z)v*|A*>)WzdO4Pji#1$QO;E!lQTA{Z`;8aZ)Kwl6ItYt zn^uDO@i~UrmNw;M#^gM{_KMv3CC+$hchNn@mh0X|Th4}H#ty&yBis^u49O|RH!C^* z6RGxom)JY#X&`pxe0R-sv&TeF#m zzi&s8l~PUw#rhA8Ut`-&Mm4FjzKBx(&+E$ODH-k7m@vQEp|*TOn{I=MaO?_DiO>q8 zA%6Y4NQ7}-81Mda2Fa|OzBaPU8+^(BEZe(zfy`k3e2DS?G54kcQPu4m@cGTcJ`8Av zwg`jEIdg_ZEcbyy%%`N>&=F&RA*Wmz1ru@O%p62ZMFs28EK@{zOdK||P=i^>p2td4 z`&Wo*g4rU1fT;+=%$)Z+zTe-^Z(kt5nKQrTUa$MQvQE6`BU}9-(Lc1QTz=r{xUH#~ z)(zssTaL-ux*?2OE1BZVHAzqkG?I;%b9Z5M^8@*$^R;>U)JzmKp2=+GXh+`V%=}ao z1fPwx9!NzGWPYUGKxVCP2I*4P+}=BMe8T)l_YJkyVZ4$2PaE@$EYj589IB& z49e@RXWbmRdd-eWsPJYzT1Yn~$+6wb0UJcyI%U`yw7 znMIrU+uY_Bjo>m?EMu)C0Ma|ZMgliJ?e5M}lrPDgx9;6ywMAt8wRhm{wvwbX1M5ZS z)KmIXJtC2sVjJoSva}URUjIV$bIon-+bUf&mMk@w&#K( zH>tK^hZ@nWx8^*;NNJinDL}@AZT>z=#nEK{<3|>Fvki@ifn}iBOcJ7;Vq0)lQuWC+ zFiYsBx}{oY(OHSwFO@m1g(3)*LF3oHCl9%QIaVTxZGjbgGyVd$-|qn$eY z<g^gBI<97dd%*Ae z7=_!92d3Fre!*t|t=d0_8;PoDiWCVT6Ba%AL(Bv8`bE=O-MD7Y{{Tx1ZCa%A9!yPF zbB&T@x3@Q6L;=~=eK%NsNrlD8aKEVR3&`Da%|n*^l;q?C76c-Yhf`x7vGHdM)$V?C|rf(i5_IBevS*vk9{?p{7?K-*Huq);Eps^SG zf1(lakZ)Fjv$VlD_#SJ2lMFogA4~r9Pu?(92N&3WW$oJlFZJrzvN~(@x$U&$fI_89Uo!|X-@CvJ z`;tAOJxesg$b~C5vhFO>P?3$bc%BS;H!fkh<>YKLha^-*ZoGDA4$D)`(T6qK(WJhw z1#Dw4R!2TB%I{(3zv1W4zhhm@VB=#TUeli^mr^(Ovf6lZvbYDfCw%9{wlJ_xeEEiC z>W&kUK>DaW>pN(!76hAvG^VtRjWe1vc@PBv4Jk=#JiZs1`&dK)r)=BTfIbbzf5T5M z0K_Hu&YSYY%kX})rcU&aC;_p7WM{I=+s}ZY-?U=t(FZ*U1POjt=Qu(0?8Ch|evST) z=-3q(1i^Rz>>JlJ_jj=V+ndHXbra8P?K)W8yNGxx%4hf^caM8r&ZyzWW#yX*4HWCc zgDXv#Hv$D-%GMxLyxM&T$}IO%0$dE&D9=B3GOy4kG&AsjkaZ!+SwQ7Tu%s+liC();^cx59|4Cv?lg1-xFZ z-4HtCk=_OP&U0rb^}#qI67ESiG_&q6$+?TmgCJvnt2%+@HcFEJK7DFBEBsa`GE7^I zKfio-2c59*gS|t}jpztu`LvkeuV}0O;XzKyXwlL+NK$J0&|*uA4yDGDzP8p$tZvHZ zabM8!OI8`r#0vgu`|;2%+QFk+#6xn$rbCnbYjUZeClwB2_r7Jcc4=r6hs5f)widN} z3uXaYQ`fQy9TQNTAcb{9wrC3mjjRwE(|!(J0AqYB*9XwUunC7*4k(Td&KRDxjC!E> z7^RIDAed1^ZK-B?`cmIA+VQU-iR)#lKim2G%lp>YWUSQW2sn{^W!vLmQi z1hAbxT>!Qt16k5)B@T*NBBY6I7-^vTce5U z6CN6sFWhi~-^0cxr%@4OpW0EJOhSfFToP&dp)A8ZMkPc|PZ1*Be1RaZ;baVE*(5pXa+061z{;X= zo`2(aG%Q~tgPnN->(wQ9v+g#P&bXiz0kILm)tUXeDA$zKYYRoxnSJuZM`CHgz`1X- z+_S{mF!(@BNd5}50M1g7+1iQ-;h^y@zpt0kQpjl5@U3O28LPaD2d-g0>DwPt#zYGq z{lZ0zU4RQq9XTPN6>jMtJpygbNuzw29w3WXRJu1?V-hsFvuDF&AO?sAXt6^tW|Q7^ zoxg}8!WSM~Ph;(GrH87uOH~PPmcB{gLr=Myr>`#xQR^g0_t8Sz zoNiJ%GT)^W0z%dfN%}3r7$T)0#&q9%5uLh6nfZ*p3HZ-XZ-`!LMN<3i&xS)hha|K4 zGcbkn!wBj0&jO0+_@pl2zk3pHLTtM;SvgdqISqR#OP-Z9HP?+Eeb%<)jhM7UU1(PF z?r4~#I+gtgsXl*#S^x$#A}B{T+oW&qjeb$~hGLoSjT?i=pV)w;S4i0ARouTVWL`u7 zCmKyEz#Sf|jTqx8{A7%~(C39_q13%D_tV9Z*2Hoda_X;*`Nj=U5cHA-i-cU-GHqVy zjOP4HJf=B@NW%sOZsKo_ke~(8y=v~7I9+vhy)a2c@Oc**-G~r#a`V-81ArXC%3i>0 zx>dRfeF*H_7&nC`$AkMZh~Uyma`vqo_zVVoREu6TlP^C)`6}__A=GB#x%s~g*8Y%` zSx=Q|T$x=wFjsF%lKWj5`&pggt4@pB4s|+iZp)bvY2r(yR_B7M>$45uIibEue{i7~ET+<{rVTJ6kId3aUQ+IRm)R&~M6<>n}0!8M9S(E6Ja*&mubQ zm)2~I0!8)IRsD?iQ<))q>e+K$J!)=*B#Ct#HZ$C|5i{bO`@RL9ZN!#vXc@4=fpS}M z7N~@mA@;*Nt0%T*xkQuFq+njX# z(W(q-wSV9hz)CYw?@bzWF`1%BRn`5)h(@hO7z3(Ku1;!p#0HH1XXz&o!!kVPpl$N# zz_1Ja8)RYvoZ4)bYB1c zTp@s1`pjFbZgTr~?X32iB-yoS6Jp(=i0m{;1!&p39}8%peV}qLBpoFd#93>|-JKpZ z&c8@_Cmz-*0c+{z9dHa2y6eh7A(37oNnU^EmqTilvXUP1ne;w+O=ewcFZ7PAciWCL zb{%(|L=-lLu)0Oc=kC&uu*;E_X*1RCqeg%FkOc=;f(5<#Q!3KiPt!{voqkRAr3b?) z9d}Q&)^O`-RB0helssbLFVk3e5fP$0d&Csup{o_>sS#xGTNjEo&(8Vex>%P)qBFpH z@37n?(%mSvrIyPZYx>sak` zWYkWbpNJ>B-S7giSMvUs)F6GhkRDFxm*bJmXn!D0wCCF(m2mF(;6F4M5ZeD0NoMLC zfKwP>l!DijJEsC_!E@yuIDOgSODLqYrW=Si53IYwn4?ctp_)`>9Gcv6-TA5ElNkH^BMM!T@wM$6 zoOnmcYg0cK{(;4W@Qn9n4GV7=q;JNj41W}9pC##a1PV9DSakKW;l8~+X~UHFl zo@p8)$u^`cq#_nQJ#f@>-f*8wqwQH1<$EeFQ8Kqf=yA`Ic+!c~`((4;_{-bFd`jJx zo~|WAb1KgAQ8;0)P=hP7ptL*mBe57 zQW}0Z-yvb_;#B4JUmH<}r}%x>SO=995N4r7?vyia@A)C3%u zv^Yun*OIAyrw1_}K3S67o6#Jg=JzJGfw^<~x!J}iEp2>w)6gL^4Ee?k9Bc;;wx<;| z@}TD~`Xm*lLn7UgbU6Pp#n?~7(q-tO=ObV&oJWH38%cHd`LV8o=Jf*YSdTHAuT)=Y zQM!Ge^a-6f2V=?2o2eM99D_8Zr${V5<~QHmj>p&c8sV#VgIt1FTVyMgGlYgh?6>1d zBL+oz-~7KoghDS!Z2?RvLz+q!N3yOr9aU&e%8b)J8+*`>H2Pl6&}a}%r8Zx!WOWix zTaViAD_JqV)??GSh~Ah9Vn?Iz;{iX^L&&V8R%4Wt%2>}h`~vyFt`2Z%pxG*bBRylV zN9~cWP?{}*MB^p-u&|;YMt+MxvD_@uEVv?ZZ}=Ox#5W!GSH^8HPWQT?>a_|fs_G<5 zTgVj^w<5zI8}vrzj9wRQrM}pko-c7o+J$cC;Jb-#-{*8no#l29_i-*$VZdq*{zZN-;X>%70b|D{XoV<&d~z zb4}@lb`O>Qb1>G_XhXqP5_fElX#l(f|E>>`rYq@q>ZK9q9t(B&hriSZYb;cX($^$Z zA$F4tITXC016q+OH8F}&F8slon&6;p5W75IS*L+2o8iBQdIlYerx%u2?sXu~qBJS3+u{gs=hn42#xEVtDEW>NT97$omUOI2BjsCTl++l8DW#+)94hNb05Eqz>J) z(H1gV{>n!lA}Jb=1&j{zY5l(=*76ioCt7&Uc8a=;n*A!*329tzo~e4@GALCw3N@Y>wzUYy?cV!MQkChR`RtQ zrLFe{)QFR)hk{FL6AGoit8OfI6VfUCEm+CFM<0?8lM%@{{@8?U7TX4-w`dk!=6q^ov`|h+mS0%nS}cBs)ZQl=;3e zLjjjZ`Z5&B0pxdYrtkxeupRW$~P>z z^Av5K%nbdo;4@=e6fJR?K5J_-2&I&&KlY(IlPE}5ONpOUA{=OKdVuM%|J%zXRq}fM zpTW{<;9=VJSUkBc#cyi+`r|e)_z;5b5aGrbMPBklN|2H?w>8GP35Zaj@am0;z#oHD z;AZ1F(ECwjYO1FSq8LF2Oy=u_fpRaYN>)A}Uh7ADsVGy>D3ZEf2*3~(M#r7hY*SDm zN$nj3lK>@6X^+znVoHF>JCh;xV(hN;knEr^$@pG<_jW+~e7}ujJ%hypQe7*l$x~=z zGsCm4{(FbeQxF_RdGLPht&<+>2cKLH_FGsLL}ZG;PRD;OJUmz`1!ho)=uD55yx`V- zu#1mNv>iP>p(uVIAFJ0VPvm?fsCKW?+-2SP&Y#@RzL?N#pLg~2s(Vk;uW_$RNu^iQ zxA@?CX>a{B0ixgeI>jy_&w;t{8R+F#^;Ol z0-JeZ z_;({vO`BxhlE?;ObiL~ICGR#W+n+@6Uv2d)I|!l8G?%|)+h`}oJtDO6k;BC6ndnw} z`YgZo`DnjB{Z>!+VZrmNeBZJ50M9LQP%d3?Y(?^hRJG^DWMkWtN(Mtwq>7bfYJ`Bo zOmKMxN|J1;HBfANK^^=@FAGoA3mI!2Rh3fXMm!c47?gPZ0fiS-6O9JWC5e_ zQf$(u!e~z@@+%5@sR1qJ;x|*u1M!W65-1s+5DHM@=NTQ0W!M5`V5$)#05ZSMv~T00 zQ+e-*kCbKaeYiJB7MP@Q2_srhD{g$?xj5mN@zsTCRS_V+d4~*(pk}z0K0!AoF8Q#T+`(|;xXq;DPA96M6uGg}_6N%alR)a|De)bn4Mm!6 zjNDSBq4wYbhNGkkLv8s3AYYZ_ws~i#xc1(gb<0G=-d*S5W%2*}48{(z+#O_Syzyp_ z_^LT)u0?r>0!T8~VY&)DK+(!DXB)h3mvML9jYG8DPvN6W&Qe>3DKe+Ev;*jcD-pPF zla1BAG*C2#=ED4I&Fyii#{MFmm%q<#_6;(83;ym@e)2uz=53y)AgOipyrc-~UAIzJ zLCGQtga3q5>9Aq%y(iqa4}y~UVoLg=RNPO0NUL`iw1&G0z)c_!mogT=663~-UH#&& zn|HN$4q@#|QeIV+Eq;{ly73RxoKj+X&{-USW3=eNMf!h|-A3u-?g7T@Z=S9Exu_>b z#0Er}GCS+evi1oYZ+}1h0e|1Ma5DF5pkmCK ztC?ruiBGoTI1jeH&Nmr88{MZj!?GWN|Z7&oT$$MFFvV!t~ zU7~RhAt|w4;IyRHW5mcaYIe{|5>sPcEy@8D$^EPWIN;DeuM=s~?w~%2DZeGBRZIl` zucxYy!JS%VI8{|gJA$Ipr38Q!2;vTDMYrA=veFb3MpAz^3amYtd>pu!`z@#d>g^rjWZom+W-zjf~(~0cbycy?SkSjARilw>lUc^;zc#2I_JQ4y{C7+?{HNxs|_W&#z!4kw|AcXjP}Hqq!ZGX&0c`D%E_xWH+Xvn#n;(w zvYlW7J%g3*t1HD+OTiP2t%QIS%3E!JYI;^VUb`nQ!ml?oF~=E9ekg3erLjgXAB$qO z#Bj9e6pKAQG!VdO+F+3j`js=Y%^&E%C_c*bl?E2DiGZ{206drxg2B{5~+xxNyN zp+cKZV+TFrWA8_-5K>!L%h)3^sQA!pQ$tlr@%n3wXJn4bts-r0gHXMg(Orp|8f9H& zCA_CX<&Go?jlJt}`817nv|9>h)>l+niHS{W?W>e@>V~wucLV+`^?c)UU#T;LH6=M2 zv&-|5`~035?761&euM#V@`(H`dw5X6r&AQ|9x3lkIUcusd3HZM6;T+-7Nqi*)7O*E z{v`t}rzCYf(KTMuQy{xVGS)i}iA9E+1!^t?*P$q&{2cz@&#zj*B0fciAQVYt=#po(?BL>}0x8pJowU%X!soj`-_s14he@%SIwqRPSk{F>QUrjC~w z0)}26WG#^;m^0;ekegNBPJFVyK3t3mn1N~jqzu^->hEeNoUD)$d0(?}!lm z5B)N0&)Ydc0t)0T`}A;+Xt^BpCF!pd)@Aa9s67+6%G{6vPEUhoh{`q5d*C_Rq3a21 zljIeC+&aK;3OLG+_NFXGtB}k#X#y3r)mU5LE30b*iAmy>V8NVC{&P~aoh5md_XcOd z)Jm_Iw-=r*g{hcZ2Zdae=OuZU?$kXHKWan!bC?{Y$kl0s4PvJ-ukIl>GK8ExkOR9E zk~@GBQQ#`&BvT`bLNCB!mzavFzyqvHxdcQ-j*+|5w~$9(v~FEg)#U^X4#~{BO-C0P z1To0`Hh|d<6kR|-kp^ye6x*}}FR7{hMD2-Lr8Mjvj*>2JjPbxH;x7NasBFK6*Y9un zUgJ_8t}IJ!w5AAR5a2nc?(kp?lA5kOw8YEN>sa*=++1N z`{RQ@aaGWEja2g7xd0?QS7JKmO23sT!vyw2MX(o#cUViKT zQ!jiWXM7RJIy&-TP$Hze&9&Q4Vw5FZu%>G4N#yejrF!wNPo3B~Q}n-I>Yt#Ip(KH} z7_k8PNBJ(beL9%5gpN}Z))nNf0Q- z-;o1P3)kk+Q4pmMCZGP%W5NHNtCvgu7LJQheHvH64K3sm7K( zq#eO?;K0s*R(BhBWzzsgOI0~a+R)j-a9JQcFD+|92Vud@j!fFK;EFNy%&>aesX~k{ zC7ECwXT8deKrAvaKBHB`L-wehk`+m+$@6>`K4%5_A^5R4$yDvU2x_=n>ASo6^jn70 zrosFgJN?+_Y`y%u)z|^6PjT{_8v*hSmvDYl<%%e+lFZ|luMtg8v|-+cYi{IzbCd${ zmoix3D|v#A*(;G#2dgw%LNt8i64AEkItB;CPj}BLb&yoNxnbTdTC0ST<9~}FWD9C8q{Qgao0LGgD&wNoha_IVwLrohp78nRMH-Z|6EQ+;E%y~F5_s;%Ija<&y zjq+>tyUiOmfWF@C2arWSw_y|HP})^aBat#(AQtLAbE{koYv!2J7d~3Y*w;%+%qLFN z(biz)R+*i&@%7Wh!}-g(!tLURTlLk6pKx2UD_PpRQHgMz^k!zJihJ>VZaA8mN#uU# zU?YOKrMG@%xL8?1t*IlR!-ioKuL}UU5QHx4p6opXT>aw?}*F%oENII|9~=3iAm$HYiDpCR+$cD-PVY{!rd^)Yn*ExH5weFKWpzIol7Lv zm>estu&!?c?HqTy-dC1qGO4+JDn9Qv6Ulg$V^pg6d4;fElDd+6XRZiO7S7%ii0>(LM>ddQerlD6y0XEam3Sk^DoipcUUK5?uQ~j zdq2WnrN9`zq!WLC`$@^6&npD%VWrkf?@1f?1H4Q=?zia(sX9W4Y+S5d1<7r5V3&Dv$lgx zP`VHR7&$rlbHtA8I3a^44H{QceM>#<4QZ*DWs&LAzy6x#mVo@X6@V}?m(I?vK!WG5 z7^6C}dGltrop-kh{}}7?wA!ry*8q(zKHuZ{yT^T|KGJT)3X_G$b|VtZ6`7FZHuU$y zi>Rd`oblSig=(uZuU+jho;2$2uJ|2CZ(Mo-@hHB3pMj7^2)D6K*)3*W_X~Qg7jEG@ z26;))uJv2(Pz~;Yo?Pg}k5;ByBg{))Xp3}C_XLXj+PmNLo9G1^PJ6#( zo%5?EGnO@TRKiHoov?Q8F_dI&lmiIAwjkhtc`0GA~qXPp1z`%$hedE{d0`r|$7N=iH$1xZbE>S^tYSCanaz}ELchd>7$>)7#;vi(g z&}WWi$`=7;h1yEb&3)hkij~S#TepsmV)${{NfUym`J73hW<3}^yJ+-i?~jWR5=G#; zNzDCMB60WyusJLQ%^yhOp#>$X2Vq-2+%+pHENs#woKF(6H63!I&xfe^Wr@q-Rl@HZ z`A`3SfaY8Xkh%Jj6P;orRC|s>2%+pO#}kI+U2I_D?ce=)zAvUr_bYR*s4XdG$*bEXOai4avD)7)BoSLH&8rx0^n$E7 zK{8VnUloAJi(E{p1pY*aLb{E|^^;x68>31SP~QDqvQ*tX#-+9+cr^V|RfSIDbO7lf zt2HYr8s*G9-&?l+0meNWQ4e2mWSxdjJiGlYip|m*)9tE`?QB9w)lr7aPcM*|wy!J% zxP>CYalc;@Yl5oyV>XR;KI!=9`yTj@6B|-#=iJHXRqq{9!0z`sf_)(Y$4!Y85^14} z){d3snBM^>>u}mTwks`22n=)S_GMi-8Gqx;7jNX6qO_}@nkB_P7sR^;4hz@nPwj1L zLYv0oPgGN(xR`@=0nqFl=ekfyTcSdY()B&v3>Se^w#Vx#!$(}!hg%kzFg-t>vG+u} z$C1p2?ncoDcQgewvG#E!cF*nCSPV^lSY9Sp^GIxVEmBsB(AU~H@fx)+-;~3;=aFUW zR?TLtv9;#K8#TI=WA%D4B41Y7V@cIl7}>-N)xK6<0lVe=;xXcqRVv-y#)e|X{f$uy zLMul5B_7GYq3k7An?fuT@(<&fKqr90d*Kz$s9r*5#=9 z*ogt-f!C9mx|93wvqJ0&jLvI6AYsmE6Fx__n zpk%+5g-K&2vIJjWr4kq)5O^COr>lk79P>2)q!lvkNb~TD0V!mEj z3gsPD!t`$k8OM$JNCi?KzpZve+*fphnwlc=D_h2K5N@>~m_A;|I932V9&x*4iCEPR z+1j0F^PUALm68Ph&}W*GC%eEg}>&q-k7R28*9&ShpXR0i9LE+niz? z=1p1j7)IG?6JKFP1j*-|p4{BV-$+u5IAVOMVTD7H62|HXA$ha#a#qssd5h`So zYdVh7&gF~G%byvONZ~93Y|QghmBlnysnWf#zJH5N2*^%Ow*;qWe!9(ay$%$*q98z8 zS{k;%tJLL2V&20%ZR6!AC*SXoRmZrMAX2~pK2%E7o{|rZ>u*>$(Y)_CE>|gh48>jN z{v1<)kbq)9SDz^Q+pWNPVv-Lf92C0sYSm&8>?~Q!euqL8SXXmD7+6v?%u9U62HFRpZ_lF zcz3{mF^Xg#z`?ZiJ;78G)y%JC>|dztM~JO>+IR-~871aFPPG9=ri_URR%_o=Ig3s$ z)^HS=P&3tvZ9JYcpvI_)Yx?0u06RyJmXC~Sfc2HXw;eexDl%oPm$Cn1lung?rsnoa z=9tD8on$yv;r=4GSO5g^zzO+rQWt66 zeA~=uLyi1b{D9i=aFufKCBGx$GDjSZjKBwqxOWnPo=P{avLhJlIssST8-67ZAurEI zHYCt!K;@Y3VkD}N@`*CMA9wVNiX&96aDOQOkMDSnqLP!dkphIebv|)aaC@Ti&jVM} z$Ecm9EspfhAuNQ{a#qsn4V!4~O6bm;lTI8tQUQKZ7@Nfd<+S(Ne+pFck7cNidV+Ta z@1Hn{5tJY9o#%V)toI%=Ch5FgOLKY zr(MeVyPz-H2|iqF$Q2x@4&HJqvRJL1j+^n)VDb}&qg1+|Y#qp;$B~UKDx2_Q%32&j}Z^a-_FWzxZa%~dBg+oX|ymDSK*#*70BCB>Oa%k@q@VQN$nkYaEg4Ayq0q|pr(D1=_@5U=1G%i+S_t!m#^$-n zGNc5RKcGCoRlyT{^RRyh>)hPlz-YsfeOX#ObHxv}Dqp`3d1OxunA1ZL@m54k7E4QC zT~ulKhzkL$Y44owEkVlpyOAi*CvB~ZLDTYwm~6G>NUhSy7AI?5fBgOBXL!fD zC4V#A0~q{Gr>^~?NkCazWA7!+neHd7JtFk0VbP+~sVl3j5}&%`>Z$_Py_%fqX{^G$ zL6lc{x&|9MN>{jO(J$bekX|u$bhO`QwR`+GZ`oNK8YOtbkpO^3Mm1%R?Wu{cybVR( zo^?5Qo*J7-Pb~OK7pW!~;uiC?H~i&ezW3fVSkaA@pV~WrYjXA`D~@=MS*f-p&JPkK zrmdD0nw(2sm|+FYs=whgT_&S zd4^;!S*~`kmX;W5nUfU5{TF%munExnl`lR&`F!7rpbjR%FUJh46A5ppVPnhLgp*g! zQ6&C+k42=^btr2#|ibbEy4bvM5}|HAto|?!Wdi z!|lY1x;eL-ar%UC0YcVtwV*VqQ9Vz@o6|HZwLfPToWRHHl0O8EdFvVh`yN8BZx4K0 z{n0b+5&o6kMe^5mB*|zuIE0Z{hXJU?O@gR|4M4}Zgxh9ZKBKOGA~=sa4Jb%-m+hp z)9yIAa&2iIKhV()ySQo-qb*cT_}d(62`^Hk)?hYn7|^)Fvu)K3w*_0;c(Ngg)y)eq z71Iex`)Y#1SoFdk|Fl-4w?`8eD6Cd>p@=6ID+2~ zmR9Pc;wdkqqvme?OsUk1(z{)mzIqQGCJQhu%^*PFJbxl3SUJ$lIO95iZDJF8I#PlI z^#Tx_X;E5=^T(#jSi?Iiy-+oYrveN!HQ43Ow3#aG;)Rq9UoR6+oybr&1J}7DIrvp@ zY3Zn?Y6)OEfhNm~D1(noAGKi=O0StxmmXyPIQ2G20lSr%a;jNvSu!(|Q~_^A(lu(` z&?|YbMRvv4u&6=s9h;7^eBu)uU>lNrR1bLJ(P+rBpMwbBDpVw)+l7@b364o+_%Gg9 z{|8ReyDZlnB>2`(m@r0Bh#q_CXzo6FCM-NWLU1b;{}KMRWbD%0WBVOQrBrHY%=)Cq zqSX@VqSau>=?_!+Y z_sp{2(pS*dpStp7?V;2z+8h0YSt0ePf!Mv5XEycrz#!?URE$u#D8<^>;ka$6FcV@n zHM@{_kgmL4rZ;oTSu4f&h}Yr=v&PU0CI$Hq=41m8g)*E5^13Mlt^G^Y#-Y4T0`j=7 zJWPG+`)UK=81ij};7iSXv8o8!wWK2@6;V7guU)3)$wnLK_hc(g%+yqfu!yf?V3J@d zJ_Hix&Xm*v#!Brn$W{W6uUYV~C=|j!s88((k(^7Et0c20wW5|BHGiqcuwg|Ju%Asm+Xi@B8Arjhg zYKHdszdYK01@v3c)!wF#5tQ!!0opU?r}P3CaM{*>@}Ar+-OM<`OEq5Qo?Xgq3l}ZI zc&XfX>P(fRuSyEdsLz7?dVxK-q)}E(b!Zs7QohU7nWBc|jv8PzLvL4wOUyZI42`S= zpF9|AX>2%3TS*M(`>18kc2pLmUFMzUKie7Zyu8}{gQqZ?feRqyAD!>`kvBC4X^BJ&!*!WViEkL>c9UL;aHIuywpiu1-Ke@`FEgFOiZ64 zK?}h?&sdhRht-8aTZqOcPz9 z@W<_gh)Qq4N1o#4`HulIBeH6<;_bzXGh+&_mq1%mTF~)`YxJ63W$__=@JX%N`uOpC^~gX-ucQ zmh><6mrjU_1-+KR7x}MzjnPf}c8Uh_UQH`Qza|p3{R4ikrZJ4xz9v_!ykvI7>rfa{ zkltxkVnKUq)t9s#TG3qe+WF_)55*g$SnK*TrlU1abnxNkJr&|7P+OVp{Q8Hhu-Li7`sNUSbHh2^0}js-wp|t=xvDF zh61WvYC*u2zvCDkKkS~7EcoLZXk@yA?numaXA*2MpC|dWcqdIAJ}+h)osQ*x5lJcMyccJYL18ul)FsZlM*3XJM<9Nix-^zIka|4 zx}edHh!p1CK6fAFomXTgiF!}So;^&$t>R?aai4^Q74N&;-|(JHo=s9nCq!Nyp>POqfvbAuEiQ8Cl6;MX}#b$#|7gV=!+P>p0S#aj~9I7#C7XFPVFr z_cgM(tDUykXT@4p@Y=qmUcAnkNiW#10kF-qKnHJNMA z!Zg*@uEg*L85&S=P&9q{T45Rf%+hn5ws?cl`&&8aJO#KwH0VX^N;(#^!nn$N1GMY) zuDpApNr)QN&T*z5xe3FTGvFEripoDkIxI11N~%P-hu}b)vFVbC*7UYH`owow_j9*h zyk$RKSqECsaAW5UhF|#Yl!a=0riC9PM)Vyi%M)SvV#!N~;Ge(vf{^|ex$ko^NTiBB~N_$W$mFa1x(+lM&8+(EEC{~yvn9K>AY&; zHu*>O3WH20^HJ;OnisAGd;{eY5r&G>(y$&#a(&WGNiUN5P`QDH1|x>Q1JRb3tJ`99bvRQZ1|3Z>2Ay3MY- z(y=0VFJ|q_zZpIhljeKTG*Y$o8pyat*(WdCj{T5@S!9A@QMc*Y4 z=H{$Db)vRF+_pnMFGywWK=YSwT8VvWc=8u*|5=4OAag_Y?P|Q-~5;@E^zN#&)blHAA}f+J24$OSj-f^a#XaAerQ7!C$BNzGu2h>Kz2i&_$Loo zupd;eF{3u!qU}U}$!s=UA9yez9<4=-Y!qSvR)kIj8nTvWXER>EKZnN%vCbPCXl@v0 zG2*sjUl7{X>n74xhynZTS+fR{8`E>rd7m#&+h4X_*SUWl<&BLtL_Boo28Iqfz3TbX zZ%q?~tB%A%NFPd0*GHRtP?FKE0I-5ki%j(rx;`umH zG_@q!qr?QRQu>ZssZd0-s9k3#FG-&04p*Iyg|zX`Kv531Zh}ipb4h)8>`1ZXFE`j{Nl@;z&J_)(eU;0Wn4Q;%xf{7;!(bj z1x5vH;jvWx^81V~vD6G8AmMmYdTQrRR*2oU?R_vLNSCS=feHodotwCXvA(tfa*=x4 zqu33hA6U&8@i0W#!`15TM!K~<4rXD(tNEDFdlDGGZUoVaSODu%E zdGQIHvI4RSx3~X*HWszORmNE6iza76%IlAigtzr9pdF_!K~cJ`t%J6l>cV10(Ho)!c?i!5FOx zL@!pc*7u;p1Hz@};WTu2YtcK7C3UWzMtB^;ow$L{SV%<-SohL$ai%S4%_y6PkkJ#5 z72?{qvO}c7zy77$ke8rR(NtSr_W4yr(}E^vX$qibTgQb05o zFYHl!=iV=f5#}y;BFoVK7}_)%YB!+`&myM_%PCg^>SHTcJ<} z!U!iXNuuLDnhbszu1{#ufCh*E#cq{lw+mhym#1c%3kB66;vYDW%{pUUC@OB|3dp+m z*&Nmt%&`7p(--6bR$Z`aqv$nj-io6w|A|3hRL}*2N|d~kemQrNp=Bo(WY(sxOf0hw*LySpYt!}83V5!ZWDk0ZpX=A zSuU0oUS}nEr6&h^Y5NeBd#%K@Wcj)G#r0lV^@&Skjo5lbZOPiDGUWnZV8N}d*Af{{NoK0XjENHF{&~HXw!f|N#B%Tn0aIc@lMld`d<5$b@VyK%YSQ7Vw^ ztI3>mmgW>7?73f%*pzh(hIR9(8rs?V(_V$|8MP;Cmday`R>zYQnS6Et!@Xt!&7XU? zRAY!$$g3E;5<$4bi zf1!gMLOTDNw@LiH_paHfbLdwGJt*_kHh?H}<_}_{qtCjgj)g?JsD=*fop|eL6{9Ue zZld>og3{4w+YFL_kpRCy`Q{kWb)|&67?7jNSM?<-C4HmRrE!cJ~cZZ)o|DBSxo$^<1~(crG##Y(MSVn`^XF) zj|2?CC`7Sc&f*w|tr^p4LV_w}#cuBX(^U zs*Z$Ye^qsw6|#(dix_Q|v7r3isIaE^^vx3U;9vowm2gsiyzndwmie}3<6)eY@BcNA z)>N_k~1CXzpDwCz=}WJ2kq9 z$Ja6$?o>KX%gAw_@DsLodyGs#~S`QD_qO|#A9_udU`4ea-KrC zn!)?XpLs|=@r-(5G!b+>AJOMkhMk8wC;Mv@kS#PmJg5}TpMM`>n`GayZE@Iwtilj7 zBXD2M{9xf$ISN{^GHSJd0OJyV%zF;0*}SOG>60EMQb3zrD2@`8v1~NMW#g!K)zlmp zIYc(A!OjK4u5R3kgRLXGA5_9~h7kGP+sKlG1B*_Ba-!7OEA%{IxNsPH^^$B9I_5z) z4b;I}LV9d~<7>mosfJAOw8wT0{>}g;m4B`RDzqwij*|l&NbLXw?Cd%YC;v;InYEWo z%#7-rE#k!)H7ydc5tZ-Cp*bJ<4|%~W2M28pFcs1t%wIj*eL}QgLjN)_?1q!uRcU2# z*15?i==lGKq;C&ss_y?k=ZwjnG1L&U;GlHQ4j@vZLSsXG>Phm7PLSJ3$`rhyh$3t| z11%F#%+RbvNkefoFbg%@1+~X~w2-d`_^1hKC4mBJ2*S4Wd#zvpKm*y?=kmV3-mjOB z4{d#8-9l+x6&Ygnw zG=!FM(;brjVlRQ9erfM$cX=i}?iB1l{tEWnSe;H6+z;3!v67&w36JWONV~)fyEL{+ z>fZDr5Fo0maH!c2HJ)x9$!e}<6}}%=x*!pYq$+Yl+}&l4&Vgbn2A~xleOrBmU(hZ2 zQpYDIhT9|EQT0ec811>Z!B`*0+1DvBv!Hp8JY#*NFNawZ)^v^m}cAvn{6(p0jdawf9mL zpv}(wx6Tm4qMf?z3(P$9gWo^fa_|+4Q>3E%+@F>In7fDOJMah>B?n~kJ;hG)AB95XjVgmuHUO^oA>EiEB72-%;%*?@!ez3Ze{R^k3(6lde5Gbgzu z9g|P5>>mvgBJCH~(bEP){9%ecXg|z5ethiM7{)Gn8ZcWsW5#sM zpU$+n+SHB_#+sNQ7LJDD^Yk3x{TZH7zbRY!F{1)}~C8r6B z@UWUWLG6utq)zfES9)=7+?htsQ#MLmXI|+8{F_!zQGDIw9PDY^cfAz{{MVg3S&g5| z#)tWa&azTx=HNI{chmXRs_cB={KZG7?w{b4_#g(r7U0-lw`PJ7SW1=~Y!0lkaHffo zD`|N=@Ox#4`<$!qcyJI+FiF1vbm4MZXfRB=%-a4>t<5@>$=Eg{BkM^e^l$)zgd<2+ z7_&ka51J6NseM%fj0y}=opMSDD-Vzou`>Dk5XED&6|@FZrJ~O_ENo@$q6*r!&PA@6 zKIK8bQq9}0J(k8V1l4SCze6G&OAk~?e_r74JEnO7%1A(Q*{uaWLh&o!m_W0RXJcPL zZiYAMXdGy|TgTdoCEfzIB?t|q*8HJof7|c@XwxP}Lx}fQeki+hCq0FQk$f;~Q_+Q7 z++1^nEX;O|jBAK9J8g5EvBu1qJW02m?pEiS-uK3@-(y3*9eo~Vt0%XPcAA|hezkVa zZeSO$7}p}RK=qYedbhKev)12#4!q-ej1!ful~}PEg@!X&W3|X<``2M`;%r0RJ-m7V zs7TWkth^iRc$-6ctuE0Ozy_lB?*kB$h)5426Pv6KPNO7OJ?=XITUK0;8x;a4{BBY2 zRan?s@T+FGuz!~?9Wdjq3PqYaNBm-#EBE&F+>wA`)iJhSh+>yZz(YH zIjrq-)cvHIJL%~u=xxPc&@-CbE>YW#N2R1J^e2YJS5nyoyU-EM%D)%6CAfQX9B1i| zXkbnH5Z)ebJQ3ztH|<+Cu3`ZcDkaOu&Gp68r>ew+6> z{O`-;k*3pvv!0W@v=59{K9X;yLe5id&)&Hcd^H-#{7mILQ5Aa0MdR~sUF}*pUtjY6 ziE;&}Bu{>Qn9)d;MF#w&0FLiYAAKdVgw85(HcD zuuU>WL0J2fi02j33x`+d()J&wvx<`g#b|oN7+pW;7JKIo8}~|z*Cg?6*co|-_)5~M#OdCV zj1$1`xj4cTy3RP5f)hSpL6BI@AR_J68;xg^HyLnp?7B6aCv9uS#$ z@viI@^vwekCc^!;H+l$EFsmfim+L`%cp}6a+5VuDkxz12zpWv^ZC@J`C-qeeCiz#4 z{hO26Ao}%pymkB2QRv%^tnaOO;-98qRrB*}!mw57Xk42+ZQ8hTtSuTyg6S{3Fdd@6 zi(MI!JkDC37mHb7m7YHu9KzbUg#2dGse%6d#e3yVA+1^A%JRXiv0 zQj{zr;(Pc}6wJMuDK*Z|ay7{l?H1O?Vc;`lS40hVsIKM|6PLRHB3kE0lwnE>_ez~i zJ|6|9@9f8BBG2tH|K?99P@`LY(b0X~*|Exx*H>?40T}k#_^ImG@wgL9mlddlR`z+G(FR+RrHWt^EnrZp3OeB-{iDz1d%)^D6q^tc6C<;&Lya=}kD4}Ttgt%UZH${trtu(ij~cKe&UVoK z?Gb?5cv;ox3V2RZMB3|E=-c+?j`okrOuius?U51qx0W%%9zCorUhVBsizMGz?jtgUgR{&piT{uQGCK_H+N{Z|IHj)at8$Z5VK(rh0mVI8LXiu(Fz#5MjQd z=~kGq+c3HUtOb40LB4miM`mlrm8d;ut>tQWYV;Wts2z{56SJUpI7x8t##jn_VHkqRH4Vr%bDdYUz!WLh*DPOa3L_=VS zY$2>dn-zTE>|VH{{PEF^jQzDW0b6}5c9i(*Wj+JN-f5xHanVFNKQLApkgN+PTpdAa zd0L?&Q;0|#BTNK9^YB!Vy~`B7R}!7(^YfO=QNXQ>p^6CSlb(8~o|P~3qrT~CX3hK8 z`dkgGW8%0Q(yip$wFsutuLOwJi#*Xb4RZ-ko0G`Zong$9xd9hv5tJts$&FIcs5>Qd ziZ&=>IkU{=u%=C-nU>Akks?+R zKeozEV6~5zNY5w#3ZcAY(cbd;*$M$;AL8}fx?`56Z`jEyvo1$@xQ})KG9zLWJlwbp z=pErZg7N_JWX>EZ`A!HcxaXFk-azciUX>}*7vLiYTyPL&GBaVwAU~3UJt2vJ=(vLZ zPC=$ph8~&DvnMIcPGlbxvvRX2-*d5tp;xB$3iIhO^g&uc>&iJHpZwM%U?8!V7-{S5 z;3GZZXyY0>IQh>cQF>49RA(YQ>N3LcCM@{p)FS;6i}U97CUt#e5S%x$%;8I&5AD?k zI4}Fb7oD^PKB7cS6Hw$_z%`&6>e7;XT-H;R31{B`@*i+6*rHvww7gcsaiDD+BRwz4 zhoB;*<4JA;S#ta-ZG9_oIfn9X?4qseTX!IMvW1jtBGN(>=k-5G|5lURwKsPziNVxJ zQm|l`w9yM^kTytb22x_0oEH~@Hfr{9HVPNCQpF1OnM8|Cl+DTZCi7dulf zO%M_OA&RNG9-yX(_CP8s55tVUE~gGYOiETIGjYCaG7FS#tSJygG2OB(4?Ny2vO7lY zgacfTDF9?Apt(mDNAw1ezp1<)Fcz*iNh=}{c}rs*G0E|TFpkHgGDKKl0;1DDwnu3}#KvifhuWZqFtaEoLsTo{37M*i<%!Rb99?O5y5iZ8$99Fj%b#t12etmBpbVqdZTPjn`I%ri@ZS4^Z=MmJ9xo6}VBhM2pyVTy8iH6NuKk7hXHEXIB?>E*Zs&smSHO->x zAjWL~N0|edV7IcQ3E~TDaNd=~{+gUH1<_#ydzliuQy@zG$K14+%~0_ktj#lA0Suf* zj0J1W*OHsz8BXfRHiSCFfR0R7&#)6x>{!%6#HPfCZ9Bv4;(e^R+}g=Bq{fjm;kw_2IUP3Tk@#d-_>ZsYq3G!6W{P^R;PJWh3=hSU9t>Rn;Rr z&=*pC$1Ux2PSSetAWHNoFfQ_XeFAmCHnz&=C};0xru6QQ(^+A!SrM0qg0%0 zvY_VYBq#W6sPXLtY)gmHK-+2O43g--QFfx%;G}r|IWa=dT8Ig!#lH~P#wE1rO&t0T z+OeWG89TGz=(CQi{C5}rnsjCxmCsrF9B8;5A*&6) z-Eh9S<=)P_c+(SWkP#<{8}cQqcN^-eSyW-JYkB3-^N(IzF!SQR_79zetzc?f;GO_7*eR zFF1GgM&*FvRf}_{Pn9=}^wa{4376EI^+`U!XnV`4A04+@+qZb>2Tkk}T;G5H?r75a zie?XfWB}S`b)bGc%FHXBN&NqklNp=dPk*1Z=G;Gp7Y-RRAwdy%adOi+P+>;DxHbAS zVRM*LvbQfByF?a;`B>nfE>ZpYr9>rTYZqTD_T9+V_nmbH%%51-_Tg{*_COV+&-aVJ zL6)AqYe1!JsP7+>NtzWofP;XEMoc%yXAL+5~;S!N{HPNVeow2=7JudE! zNr)$0^#{JmxP8j|w%6hbuJKcy4%}6LYt!1N5J_BOoC5nab=z<6yz>rg^T9{GIBWKK z*u(hr4A7SJHlf!jHNSV5l?T(?BWi6}g@22t)l}<2tmcrMs^m2DD1S@THXK*VQhdwCm>y!M+IN;Y=}c7Fue z#K+Q$(ZND8l3>5t9~c@`jAPoOZE9D-ti%4QJqc=Xf+&6*S${p#+xb{W&+59c#L20d zOx)%uH9s`?K6qmML^mAucEyXXPsWMJ*(W}U1 zojJ~F4YIG=(2hS<--KTGiU#%0QTuI1xp<)XjS#bP8Y|xm(s7$chbVcTm*A4LYudRf z!qbhUWK6JBlbEo4`SJ~miMOs#p1*gp%fGd}3aA~s8hGEKOmsq=b+k=25!qWyFiI#c zY>CpGFWIr<{}Td@+}&$~vOBpw>LljLtN_Y+rqxy--2#m~T{3hebUrP`>B*c)Le=Q% zM|Q9pNkGDSJs~qGKy>4Am(|9f2I&hyondq@pEioW)4RKR%TQ#lX}WhI3&r@5xHP1{ z#C>%^S8^lvWnT7}A(_+SV<1u$rgy-u8}%%oe!X(8x1<(g6@jJig6TjL?(%VEZz>@S zvfAu&Em?qBs3dHZi3mtgA#&1<%iESo5&{_boc@cjkc+lmOz*5a}jES`d9DP#wn@#b4`pU2I%Zidh)S~osjOPt|q#5--681 za<7L;XW~MQwcWzg!@}brskg8}W?C@8JwDHQXIy;mPhUHFI(yQ~J8M1w7$_LU$9cKf z4U@##X&fWk<&8-xD!22OztdSo{HjFyEYIkm4h@wjRa-Pn?A289xn4%&1|Fz6iEXM8 zcncpX9rSFFL{#?xBzr?G6;xK(xthJ`M>jc#iptuNRRVE_Dq@Ydj_)-Zgb_2jqTK0!nl6pV`w3q_N6<;mG2%1}h zRaFE`%vfncYh)v%oA!OX+A}#592>rPl7o5=R&J*S+K}8Wv-qsZ^%$ZEfLn|P&^`q> z_$;WsC$k4Vz`w07a@t(CSbbqK3QOb2V^I!(@)t(ec!hDgp&$KTE@U-NE3fiHJi=@vV-X{^P!t-=qGxh-V)S*5 z4-S|Uy9;KE+S0N}Baz7+v?iR&U7G&O5>_*vG9(oic7wXik9;%Kmn!v_KXCQc*t!{o zxvAZCI0=M)X5X2#HcBT`WWgVuQTL$z<&DjXXv@Te1aVwO$L$Hl=SJL+k*qFsTDUj) zv=L4lxltyc=W^OumNZK$X+7WuB z!C5@&FE)+v&o~`X+9y*;^0#Lc>skA=a!G$rCf@1=1fz2j+9I%hrbRHD8~iS&^i=0M zTOb8B0!t9-KPN>cv%ch(~ZMN!+bmetm@2E_j&YHW-SefgVl z=Ot3wR6(+}D_8!rPplHSg%`n9H*;(}LC0~wRVve;VhT&*I%W*Zd-`safF3+cTCyjd zGwly3&AW&8v5)wr&YZ;1XiTLet{c6(v@nm6|0KS3H|5gZTlWC82&AnGb-MpJ*paLxAHlmN!Jc1vsjeUQurQ$Td`411{+i| zes*Do9+L?jjbOpXSJ-YPaoU*dJ(fZ`+Bm(yg=EdPA*pDo!ZGAuB05bwX4l_lwQ~zF zb)|0xEtWX_!OEx|JGS2AEXs2@?SxC<)(^TnbN%BN1H5oKW|#@u!uK1F#5CpD{pyAdMVA@J4!gj>l%dvs6vnVks54{UK+ub`2v^?>VU6Fc=4tTw zQ5vzJ#2|_PC6|wY-TyPN)w1$3nLE(ar9qNUFoM8R_7HK>xS$q93oyhWyAMa(~H#hsKPG2%od?8ac2}rN<>R) zRLRMp%bS|j3_BGrdSCX+p`va!ZtM0CEe+ElLG>?htJeZhYgB~9PzN6vaRAimZ8=839Xsw#q*pP8Bo#s!Cj=n1$HJ6vH4 zQ3SIrAZ$L%Xw4L9T-&EC@8hdUmuUsaI6dPYl!D6(2(#4mmGCa&iJkA$5i`zoviwUa zm#Q(+Vhb0K-Ysky+SFOdYTZu+=u23KG^NF*lB_P(pXL-1$+ua}e_^T$jH@j&jg~T( zCk0}N_f+}=iEDal5@V}%DX5uN)1C<-6kiN6rex`5kc@jjY6eIc5pGE1i)HdtA@Ys1 zJ;{hH0*#^Wkup1n>irw5F0R9_X6EQ*@{PE#f2?~4SZdL!WgW1FL*_A)t83w569S0# zH}B|+SjQx{gk>aL-*{Ny%#LVJP!?mpv?MD%StclQ4VZtw&;azpjS*h$-~1KzSxa3~ zDDX8~XufaQf!h&0L2W#H)8Vh*fH!+uIkKF!4btC5Q}oj0n^Re5%PoPVI9md8zdv4z z-p*QmL+L!3IjALIYfMRLHKQ2^3c0I^qmG7`5gSMTx?~BXlsztvNEh5B-icKxk3sl$ z@scPqH7#xNKby4WRzURB_E!`qX`0o@kQK`h9ylno{Fz^fx-sxqk)=%^JJ0W$?C;Nc z{Dm67=uO%1%5LPSK4h(o@?^~s>DWAV5r)Zv;5l~4QuG{P%m!Jg2N9+W9OyX&&@Oa^ z7NM6EAbw`fNhtjMWi+INMEi_M=}VT%0KKX?yR!OgPLcQNoe89V4h&6x9t11IuT@=+ zQjb)FzvMzh8xk2`@sgScF+^RPnzc`K3zMtW{z*hI>>vL8l_WTc_Qr4vF|J19uOCs% zH0dB%8CEw^tT{v$Vveh3H6~Em%r5NUIe8@6lhZT8DZeC$c*gV^1gYmF&WK$1dgQ)1U3ls~EC@7!eNg02&^Z1QT_bcxFT?s#DqYub<6#QGCZ zK8KTjm{hcUxSqAm1Qp1PPt}acL;U&!E|#D~M%FGVpx;dTs0gRQt+o~%cyH7EHGOxc zlg;)@QekGJC#NOcW%hv6($ZIZdYtuRo~o*@`#cziX!H||WWESDeT_Pl!|{7ex+RPP zP=D$9Y(xhMG@qBPt_GIJ7aSGdjoq88385HbYYZKvkv5cx}sZnrc2Q5IXpuGOC!Pg?;0M#PK_tCx<_t7 zUWy+nViYg5o4ucQxGxxV=0?1E*E&4rMl0_h4_50ME`c*GbQxDQIUv3L3@iT_ycz3} zH!0Y8*%+x@0j`ejH8kHaw1j8O?(@~;>6&O{;XVWTiLnMpsgh&YVXj@qA|xYYFuQ7fOWF9+}S$ z|Gkv8yL8h!byps%5ld&kOz6MFGZtQlT8>MB*FCD{z~^pXu(|~m`QcW{8?wB39qV9L z0GIp%uT}Rc8O;K5c-q6Hg*P{WRMooRN-?8N02|mktHsP{rLEpVLcqUBx8)Pw_$Kc5 z$u+k(l!u!RgFwb1S*NFj{^>r#*qZRTJ)fqdl^!V-&8S2zM|*Oiw0SzYG!uk)LgWSR z7G!$;;=ds?RM8!r1~Z#YpU=mEnfKE}elmT#+pByMtWe%$kE{;yoZvMe{~4e^GHqX?=npgZbij_qZ=(s^?cCSpM0$blkkqy zeSJv0hnqm&(}0fkoSthxBYx>!Q_Lt{1n9UneE2?N?s|%qzuO6oU_K~h@-SoW{WxIj zSK+(sgG%bx2Wt zbYpklgJf1IUO}gL_s(GBB$s`9y{Rx^ZSgt25qiS3g)11<9+zr^xx&pfCF1ZrhJ|Vd&|5j3sJ*c8FFmdhsaB5EwA<2#(TRP1^7z zDM>`kDRpZ1uCH9+2kqW}ya>B2V49wqzV7~vO8}njSMzy!&@qr~0lsPWtl8O49P?;b z3N*1@1E>?)GYA?N(6$3qw$|dX%aHk}T{$@lWG@@A^T%&r8e%oUAi6Fd_C&EUj5;3W zpIOA(bS{mr&;;c@gN2g#K4T}ZPUmb5ZtEUG=yP%LUBmVJa;;~iN53c;p5a@L8jz_~I$WF;mKizzoQ#7AF%gU1=@-_5e zQ>N3tY%SlfMm4MVM45l{)E6&qMu6IbD=f}U1N&o`v7_HTF5x_?K& ziTc*lyzY*=fce0EcP9C#n$?u(iU;nY9KB*5nAje51TEmK>v~E@nYbklv~58^={oCt zmjkr9VrY`-F!|(ql3%c^#xt03w<*QJ@jhLIPuE=^;e&l_T=f}R_rK*&Fnu-i(ir{u zSp>mpmXYeE?F*fF#pdX9;m##+k3IYm6JHq6d1^w3Q*WfT8Lm;zKm9=M>MS2-a*S3kk4BA zVUCZi4o0W!)g`pBh|ps~XPWrN!5^av?+)1!g&vc6%jA*#P?ia42o(w$s($3Y_PO&&9=>(I!TD9SdFV&*q!oQGkq@ziaS<3-&t zF~3Sne(PW@)%%RJVkZ?L6V6|+G`M^2!0}Jcgp_zIj8yL;T@k13np1b0kx#)WQ{~;D zm8Doza`%e6tMP;1Ih4L1j;%rhr0EcNXMMn?cJe_-mNn!0b*7h)hUC>RIUi|clLm05 zLnD2_7^=iuS`rh3f`SgSmVHBJTDvKgwXH?L=WJ6qV(*~vH18oKoe9*3QF?$R?6c-d zFV?5;^JX-Q>A&-+q==(O`Z2cE{bDZ|P5|#%tb97Ek!d2S#jlS%d?2&-CB~w$Sei92 zO(GfnU?<~Pu`3tCAq6Vca#$#Ro&$P{>4HycbhOz#rU#%^ejrE?JYtdSbq1puC28ph zQJ#F~i&H2YOK17!lSH;m(Y5WObJ$(Dm6DmsXbNfDSt`57`m56E8ipPxqg6h&W2o1^ zJ*5 zul%!|Q=Fje=|Z_@&x_P|nRgj&*f%sv6}s=IfoC3UG{1A0+mPrU!5CuVPL~74$2f6+ z@#UD4S0r3=-AXjxsN5(XPQjzXE19L#%d_b(quml1sELC_(yGDZ?21n7J4aI$m6Mozsvczi32;s%Kxn zgNZv@5n^fxxX^s;u~g3o>|W5Ck7i;6)*e-RL*wb(*HPe_S`MuBaN|@BCZB^&WeVrd zvyhj)_+h3lot19~cfpebpP+I*l^j$DssITINqWSXwNup}*o9HXK5?qr{XYu;GKfS# zHs3LF*LiFYRW<_S2p(CUe}d2z?by~FLS1yh?fi9b$bb{eQNj44lpK<=&C9*QuXDn>&Z4)W^z;w5P8ny3u0A`lH0Y%cFBej$05;pnY3uTp<@EdKPG@7b$}eGI z{stiXfDR7W+P`4r8LJsmuXj9XL4bF{kD6E1!J-WKFtxO_fO9Tcc$#n(N;7f~d{@f0 z8Nw9npMZ_pv)HAal%Fe8A(-2F;4H=#)S|Rxp0!N?_#>_22$XdtA8(U*4*s9O*c1EJ zC4<6AkSN!Kqi3_F4U+5x|Neg%ix)uU45>Q1E(S#`NX;c%j$+2!18Ou!f@MmdAEO{& zORLEkl>y!VpXSl#2$US+#Jh8MBn)z;a2;O{_C-S{PrbQs5-{H`*x^joMu6{~8W=@S z-pS|85;Hl~h+?}U7A$#LyJ^!dvghkQo>Tfq28;>?+s48AUUC9OCJnrtnxL^@k3sFGRDbJ|{2iZRmf}jo$u=1uxEP%5=GXVq8i5pqbXYR4 zk9O9hDc+#|!f-+DKTESKQ}s*$=3HJc6}@Az6kv`u{Wh7(*6L7p#7otsXBhdcbSafB z*L^>PoP^327rv~4HX&C2*UjSxom9`^Y3%Tw_reqsM;Tg#9CZN7ABY=MzdoRnnIa+1 zd+*$lOjZ}PD#2ShBD28$_zZP;Vs$9Ndj=lxwX*cre5qM)7{eW7rd0v8uSPXjavZFM ztYY(k^S}tY!VR36O7Y&=h7PT3^!NM5fAW>mew7awyO{>3VG&`jF zZ>Yv_!_#Y=a82FS#l$^omtH8*5l#mm!^sb!PW_{-v7@ky)kI)Y)=+zN2W+MK)FUP? zszv=sFg%gjdeIp;VsJFFazAy3TII=FNH*42e4Z#nU3l@h^NUJZ%e_VeFd>Z(Cb-PL zwxmXu>CO|ZW$fh`biIQ^5MEUip3%@=Pzjw76iVMoEsreiL2m6Qnv+<1B_|N0YJle@ z4|>XMl~Qs6Fs&~2`GZh|gr{vh8+?QVHoUX9;t8j@MxH(-q;m3i$nMx&6gJjt3zjj8 zNEBIx{dZCr^U71{b!2hwl?9xzKs%fRQUhtJH8n2a!bcw;4bUs4yE;z>6Eol)Z3}3- z`t>P7&?ckr1eaM$Kcf{b@BD_Q#?(ca?zxkx1Czbv-9Mi(fEj7~_vE5OQ}Ox(S6fa} zxqowj`1|(6*x@@jTUpKjp^m2gZ$G+#*U*7-{D^k5)llTP$tc$PTgDvB1N~9yJ40sa z)`c660)9^*Sc&I2a7}oNjz=9oW;)1fUZh=LcljZmlaG?T`fw1Z{V77Gol=Mr#?P5W zjAfF)#aDbWamf5%S`qIN3RM+;OeLczcQ)ofX}o}flr(-ZW&G&RKlL2{$%La%nGeQv zsMn<#oCR0ZOfSb|W;N?s%@WkKs*jfJ;1n4=G@>?&ZngKO?u$m#Z#Rm*)hn|M*axTz z5s~}ua5gL1dq49u2dtF+`09m-U_17)@-DtObLpRO6AU%3%JBsllxOVsj;x~I|J4pO z2j<=v;y+w`$%6T78PkxTK9WrC|2vtpts4^o?d_c(^Y#vnfE}<$cDz&)yf?xTw5dkN zXLVtmZ>*2-&MctJHJMsc;tKiUkqamIbn>@+R7;h zw){2BC<9V1`24`1Ar^xZyfAIK-XfZNa~ToGWI3=CuO{ zfE)?oXSM6*I*WE4jX4RNVhsR!>?ZW?Dgl;DX*rzlfM=nojmG$3);ZAZ9{a+?anm{8 z?@BG`K-BG0DvQvwwoJd~#pEpeXBnL4C9?mTwUe{mA>AIXnB*Xb&93QJdcc`eI%S1S zYJQ~zROKCo8H|Fo4ACg+>^Q;cLjMLQxH80g_`tyz7`~*vv0NLL#o9P#igfD%k!TGXyX)a;-=6aqFoPbT>ee@J ziDcuvuhAx&(==22jcP}#OvxoCE(CGV_j@Z{e@f0=?37iPYIY>Pe8@54Y@DQAvW<*B zXDxnPT1fe7L@}e#9Kj$PgWB}DCTzAo`!hw#d@n+{;$$f|x&I?6kcrbO4& zvLD5>@>hXUTe$G%KBqdzn(Qa7tx$&WDNFPaAdnE-&NJBDwDVfx^QAadPq-u|*4#f{eZU}7fv zICkZyReWBUt$}`S#q5iEsQr}8b_VFfyc}P$`LOuAa<|wZ`%njK`b#RB>p2LRWzgEp zQ4cimiT$oW7^-WKQUwb|7-F%%eBaSy607UY27u#$nq|c+d^eH^V*YHVS>^tEe^oCyGYgr)Osfn zL>ID}pHed-)Trh9HRmNWcCtQ1*(##SSeqElGFy6b0is(`U1Dp|lL47c>5>$!G|TiA zfd&0GFJZ|Wf$>qn#9OvVzu7ag1_~LuH|?fb4obC!reA zPRY47QqiIIFu2gQ(u-D#P%~PtUOM{_RSnQf!tPv&L{C6B$pi2vx7ZnK*3rAAh1T*7 z@S`c0{7TMS0kB;A#xI=AAvENo=xz4ijTH$;#Z|waj+>w4evQXPn@X)p?8-#^v4Lb0 z&g@|2djejcmgI(3OX>1?*&&J&z&7Dr<|Gu>4xyg8oO&z4Gr1onOS1Axl83KLbA=PM zE2xC&3SvXK_uG1R&mqq0(yanV(;I%GuaZ5w8B0TW8nVwxmJ`(+pEr91wJk9Sf=315 z(Kq5$7YUkV;NsjKCRrQLH0G6INX!Pq^14kj)p1y|(N{#Zrd%3Rp1mAf=&NzrNZx%i z@{qIbA}?CZ@ZB$w!uH!B!Oa^|Iv8zi3)qpLQ{)e2I6Mf|}>0 zZ>18FYpV^Mv#q16)^j@V5%jw@;OwxmkeRUMiq_=MiT#yB*NXn`HWjl}Z}4P!ENh#$ zs{ui$apZMIJ874c`h5h-+VRq0B}hBF+c_J|R3!N;Mh)*cN>^7z~Oi{|M>D){KT6#_YN~ z-IKKU92w=5>%O_$FN-_&P*SS0-U0CinfR=wkI~NXqHTxCrx!*rTNM;XQ_ZXNu;-z6 zHSEb8+ky~V1!tGcpluc8^85F*kAtzUpo1+^rFK8t7AJwkmEZ*%-hEaDsU?0H`ORBDk)4O}ZB+`?el;5=HGY;aUFrgr*oD-}hs zgc<;V7=Wk9KjvnTXbv6mBYq*>2oJ>GB2wrrGjdwD1>$^@uc%o`E=o_&LcAj7h3I(w zWP2oX{TcS4A0|20WxqJp#?v-+m|b!mrT1*k`tn1QLuOOs)*U?bY!e!nqQu0uP$=36 z;p@v$keC^wd`G3Pmhr14nq!=eh@3i)Z&N zx)NZ3Z;!_4x*{I2-#GoIxQbLF3#S`b(szn2t=XLp^faK zNsflAOQj_qIqsF9?49b6oV)2HpLr+Jei%^GU7RDx-=gN9=HKHK-rWyDEz;GS2)1kOVARXrZcA2LAG3yggoy+=7fcHZv04X%_5vhVG+sQnX)_b`@4yX-eUJy>rQ7_(nA zZTo?<^S-oZGMO-Yc_N2VTD5R!E>;{gh7r+9;#KQ_EB{z@rja0u5)(nqjzzCIW)Xb1 zO%Wv5@`rJ>Pr+So0OxW=`chW$+%pYozh8azwVbsbo@B51r)Bwld&-5d6jn})auZ&8 zW&6KboyWSg^iD<@-)=6ab@P^jqQQ%r6FYO}LPqP;=yjEL$aZ|l!k|4$BmsPrcBoY^ z40S;EP35#&rh^ACUR&|kV7o7M@kwveKAA(5-VeL5WXUh-oS@;mK_c}M`OJJdYJy1r z1uf9B$WYdFG(?^OF11!fMUUnuPo4|}i}zvx<)-ZSyGU76Q79BiFRpv<_7JPdLO=-# zy=Et1;X_%;j*=6cwK-0uWo*F+2yu*UJe6|kM;SuKc%692?D{Gu%=WPs5aS{CR!{@^ zg(2{yRpdfeA+E??24$4EytP_#29A{ep#bMTR;;RdQ`Xvg^QJSReVCN6{K5tp1}f?L zKo=@u644CsD*DGP6le!Ov6Hr6o9{vde`=EiZ^lSPP-*L;@(H5m{ThCXO-bh8&(7zp zj`pv3M)M=;o*;|8d-o33UpjlfH*iq4!vIwDA-$L9iVn2PVmGUuOoAzw!V;WNR4-r; zaua6HerJ<&6TH(V1WsV$I+xIP%{G!KXBFJTq>No6PV+hGu(2~a%}Mg+&DH_Vs@M!l zO)E9NY7XtFIBaDd{AVpv?VL>KN36HJ%-H(;wwA}kb_r4Lq0@sBRQ?w4e`A#96WUfn zB~1QmVMb z@xQwHx@;|4Hu{8-PxT|Tx*Rjmdf+rpNdU?52-r^z zu!7gE_B_Ayzv6`>g}2T!){L2#JZM`utN98go9(h`)4eHH_YxY_maz6l$&VX<_d-_z z%fEd6Uxd>{%xmZk;cVs5_sJ^d924WS5KTS=%<_59FlOpRhNPUF?#nWpm`Xf)bcfMb zG)om92F~X0sC|(f|ArxP0vIW1E5GJ{Z&7iE=y(fk+`^_cJCfr1+P^=YxdBl zqq4Y^&e(bIB)yr_g`DWJ-|Xt+hq~bk0}%yB zs|R81IoiSxs(^!%mT2l&MbXSlzT)^h8Dyd}QW!F`v6#uBwe}u7gOQq((4}r;+C_cE zk{4_0su^uSKU|^`6z!TapgIbdgLh;7C``V4D2R%A?-1>)jkx#Is+JMnNJA>tS!4X0 zJyGa+JK+E_l|2EX#+&`OP!e*C~`-uN10BHRGps_W-AR*P9`X;%1+FUPO9{DtApkZ^>tpOnsp_JQApisWC|xZsNPIFWZ` zSma-il7!>-jAK5*M6@jk+0ONYxW0ZD-_ObdqU$h#uEnFp`S77R?HC0J(QanFZ@?k> zVAnVY`V)_^{Q81(hy^$#6yf`XFgZ^iIivcX)4lvRlD0#B&7gJoyHV#n%<4y$$H0SA zX}oIaDu@MF+pIE8IPUtD{=W)j=;Noo+yal=O55g=*M@}6oDF(Dor^kvWKwTf;)vq`&Xw3D+=Y->YX zZWq#c-HiNET%nh##rM5?I?yNXSoe&v53W@k9YPCuCj5vgWVLM_D0qGN%eQ56AE{`5 z>`V~K9HNqf4Pj>d+h8*F`KMCOx^`$gk2Z@mUPL99?G(;&N?z|3gNa6GPeQe2#^T?~aDq_%WfO(U*S(qOUE!K}L7y`*umbN(F>`xW9#tTO)9e7__}$AmX?v z*olnCDpm;EXmktH*j%P=`;a!&C1Zf*`xP`j{#C$vc6CRkK)g$Xy;{(Zg2aD~v?-iy zFh%Ba%82D7RQQzKpmN>o z09u_CpiigL+6tDSHRnT~tv!QdxSQ;)ja$p%oVMONhj878{QAgDAxs&uyZ1QG``1U> zaM0D#tqu+oIp!)iDLG!p#Obd~FRBG$5QUPBFV1qoc;ST{kXVqSX|(R7%Fdd{ETJ{8 zLNFenqnI|{myC}NAP!Jbb;ia@&el&RXR1*$JWMW2R)Y*;fz)~}^1C~k!gg(jFdt1I zyQCB<4_f|dge@rCCiunoN#nALaYo+K*%)Mi0w;Rt7Kss(qUZ)#$}hU%v;9^Tf&Z882LlLixpjc^BIWG78vJd7ZT3l z-VbFRm`AuCxYeV!`pcl^lYaVe(saFgB`0q{wo(l8!zqG#kTKV{)0SDhiZhq5^0p45 zaFy{+UAWDUvzPBn|1?~_i+m8HLhLnH{iRw@gxkDX#V5e&y@tuB#+#gSPqMmm0yVq9 zEA5EaPmCgTrbW6{%69@nEGFMd81&>Yz&&-FQ4cOpO(|(Ob%^Jz;=Jc;Wu^hlA(l?X z^YF_fj+8Ol5EU)-Q`Y^U;E--@tUGRIO}+rQqc(q{$Rs4?5*!DT6m~=0H&8rDy5}6DpMxU0aJxB5tAdnA$*0QryAb!y69(wLP|NG5SQ#WfW2?4D9sAB?;;aq-F}IdGU*# z*DFsLYQd{IUt{V4#*Az?UzTwuspdy*4YN1nid?=Gsq_@*oiPb3ld=YJ?W^5vI^R6`M}*asX;B*3T!@7lfl@~7zy9fqTPp-%?LW38 zM?aPfKIcbZUxF?m!@w_N69fnUF1t{ zUG&U+Tyj6F8E1qPZKpr~JR02rm;cfnU$M_PKg6E@nas2|MEeA^)|8GUmZMlDo&8eh zsK6>jKc%_|i0FOceSJ@y_!7l4D)pz!D_6=Khf_gdHs0SN3CqiBW*kA^luJZ=KHnGA zEb$XjZrgrG=hJVtaPfQ{V;Tqef30jc{^BPf0JxVXNx)Vt#`)~dfE|L z(1^V(F#6)N$D?wWeLwpt=UBINDR2%@U%xErI6Iuhf-@>7(HnCoh`oF>(pbwtVT+^} zS(i-F9G>d}G^{tGH1F*H;T{KzFkZ6wPqaZeGBNhA-&h@(^L&n0=KIQOTV$r+kWB<0uoWQ{qsa8TY5xb1e1K@`FFYh3gS(@EbDNC&a#{9y>)yja zb8zNe`=rfAaxd7LI34x-SAZ^~@F7ch`fegSRUhTJc|{IUc#hZdgbWMiZYPPKU(#y$oST*&M3@##|C(5RwS@~;PMJXp>^QH8nQ zUsk_*CAj?T1w-dNk2;Cm(ObuG2a(nHR~YYm?#PgZ?wH%?{c$EZmT~?O;Q?V0Kh9Dk zBxu*Y)A0YNv+kDJ^Gqio;XV$XZvV9>-#8>QhkgCsfFv^rdJlm~-Qf2vo7|#A5rn(1 z-%4(!k4$K*az4rVXMyc@dldHCUlopxHN@lczt}koB5v_^#fKbGPu8nQ?kiLK{MRh9!so^0uV*!*TbABY@MpYo>-~$jgY_I-F3?s>JdToS5&rPO_j>qPO#M<)7(Kw0%AzXfV&l102g3|n8) zZHB;Xrzy_af5DEOe)hA5Ec}w^IU`Nk?_al0>UlYP5Db6TRNXgds7SRnmCc{xuM5N(tGJSixnM2@goLLq|w2mE| zAv15Siv!~_D%lT_>TN?fE$hz(2TMXmLudL6#omKIL(o4%ESDLtxPe0}m(PgcqBl-5 zRKg3|MM$r3zCp0japB(=iikJNq;d0zU7vBFO3ParLXuJN6!=2U~h#5{kPof=73kMZG1-d?_&N&3*j{erjC3kQ!7k)iLGm(aO>hqfx3tEHJX7sDY>0_aLe-L)3!W9pDQ-wW(~RlMi3HTtir=c%|wR7!OhD zU{tP*_Z~7&@UQjrGZ&bBaNmBL=y9`K4^D9+|8IMuWM=)5w-5|u#ZvF=QOi>ty$a8Q`g6IG1?`o0@%kA7GAs*! zM+ir9O&kU%q}IZ9e!5R#8w#6rn3qfutys}>zbx#|J_O3FjYbtO+#C3?G&E~h^Q5C8 zu1;c^wK?9oOQvt`iXMdBJy8=fo#ge&ICY5MD@-%^`iF)DVBTAy^#9H*RY_2-6KDd0 z@dK#Q1cb)O-aZtIiC1ED1-OAC}gu+94t1lBV*#S5|gS`B;($ZQ=GB9gZ>Qp1AOxq;~CX5pni2 za2hi%9Aedq^68jq`t%GR?r(mOFO~MD-gcN&Fi@Rn7y~P>)%y$H_Tjw7Io8#6o|IoabAs;p*PBrUlLo26*d;0yN z6BoNx=ZWDnM>Ie0EUYiw($e3M=>FvWK(Z!1TdF%UN?H1>UwaxZ6#hJIk~rB3LdmJ3 z82<66(TfT{^U>gG&e-Q5sTecnSh&nQp5qP^TS#-Cwbl%INy^Z-ghN?Y`hKDGK>ZuC zdU0hjG#C@dPdfVbydjZ~Xv}!;2fq8`SOhp9KfBlsp0##OwQdtF`gqj?GJeLPeHMvr z-hoVh#%Ru4QsB!)Vh;1Yqu1W{fMKU;W4n`PkmzU-pJJy{f)!h#ZS!gbaq}Dqi5O_xa z*TWi~S_J^YC7oumuLGwNr6!*qyRP zOl&uu{KPJBLbZkNv8UM zwa>49b*+HE3SVxP4DXNi-%3Nrdcl(Ta|wUn zONEhsHhmmqkE1Wls>e1y8EopRh+)reR-IFSU1CY6FEp`WU)+|`gzGn`=!D z+_yz$TU|BPY??UHR~Aw;(U}WC;u>A}OXwxTYuWzwgZsdHHM}`BER^SAp0nr|KmEBW zd-h1OLgS!X7ni1!WZpi{PiGOmy>M;5bU}94xcdXvO7$Jj`4j%m6Q%h()f0C;7r*Gl z!Mn=)=(|@luK4RrPM3FwRivnJ{UN?wsOuT>w+B8183^a)>=yf=pGX8f7fitCYW6 z1^s@}0(gdm-P1SS6_WZDQ0(07?j)00i~K%{zT#gCom)jrbRsNp!pvr$Bi;wJQ|WeLaq_=nE!AgsoP)W=*xQcAoT}~v{}7&4(<52n z;)9)k;PJlG#F!$(h?uqB+3-J(z0x_=$Ng&e zU=lcees5r)WGs;c6x9#HvG5z>S>ezHBHD(z5g(Pyq&UQ-XMh*;x?|D+tQFGtd=07^Kp-^E)M(UI*^7sz&>}8{T{`h&V{S7^&eOxVUv?+K z8P+(R_fb#26%k%Ut2|?sd)uWUDkwHjtDKvQZmrCae(geJ(D_&HJWpK^q!it&3YTIV^(Sxi=v7u_1NWru&_0u#WFr? z!{7J-z3qamOrpClP9&BO=4XNNeZXmec%!>3$lIy7*Emmd7hHQ^vtN{i_>K#oEc)O|B2*9yM0&m}o^a(;_Eg>%5Vm>S_w}-nb)rYk zMK71t=8J0eWm#m09=QD?TtRW7=%HsOqx`7Te}j`8m43?7#gfb)f>hJ`Y7mjm*V}2y z_wUw9YVUEa)VjyIySun2ZTVpG>4WHL`wZRyr`*A%FXcVpU%ODxKY#qVq&8`s=t4C3 zr_ON?Og{5Ps>Ig2!+Xo?)+_LYme@?f2`TlfH_G&HT;8CQ*q%?$+Ps4I*?ij$KR$}T zd{|oR>&NFuM!{e$5N3Cl%pEBh=N>R}mQTT^(h>#{+v0IfcgS4lNEWyz$88bWA_vZq zli8*3>>m?;q~%jIW1BUUU`Uc?PVfhaq-W*d53Qa=Ow z%6In0M8h2LmWTbqUa<3hQw+`CxB^mCgjJlAF1W?$dApvs%JlZ_@D*yU^ln%z%D!^d zCaV`s7{aApN`+tjv_)s7b>k!bLhcgv%&)}USBW%VE{T(c`Hp_G&S&%T1969)+=JYm zpUM*P!~H$wDd<|Mlq&tgriF;IlnU*&$Mid-)>m-PwJa_gIyOfFcVIm@rppjj{D^Djov2^f8*M{c zf8AuUe0sbJOron3e7IKh93}dUM~dh6$@tKk4{QBvr-Q=_F?}5sP*?klG_%DOZqiSm zJA77FdxyxQrVQ~S+(q|BZv7mDtMW+k37?ISBZ`!?V|PQ%>uWnAm)_~>7ZNIZr+H{U zq4@>dYwr>lrrm@7wRgfV*y~G+i1l2I`u#1CZnfA-r7$aUPCaAt37_Wo!G~h`#^Bag zB7@y7uYAV@b;n0;WBaA6F%j(EjxB> zb(VyrI4{j{d-P;!Eh^_w!_ z&B+r&z4)iUAr(@U+kPNk;8S|@-8mG9=Ue zSrm1~mP(HN{jGoP10BxCOq10Au{Xxk>Cv+>KHLnfZV{ocRT~iyY-0uNtW)D~Q(1oM zA=m`MrrvG`K_2PuKIU(I&w0Ci^Nx?4_?}%N-$@M!Zg}zd@kM^g@5SraSoOZ#{nmm} zf2f8(-sY4&Cyix@Uovstqz62vA*_68*p*L4f0vLD=g&XZ8{^?VI-FEgvd4z?Fi4cr zeLjqM&VO_I7h>4-w&PG(+oc+v`X;1C>mG)psB78Q9c1Y1_<>j%w3py5G!mlbveoqn zfi&&`^QWop0WerOFh$ZU3v>I7HzRCZ+$ND#Z_h-l%n1m?bz4w^%ij`UBRAE2&)?!9 z(}}>qZEOFkU1qHposY`G6z~w;vTMT|q=UQc=KDyG4cRVRWFZKwSHahlP=(9a*{Vpd zoZpn6LDrY2o{KLfCL159)D}N_XA5S+N%QKUFDi2 zQK2U-IBAv{rJh2}mY3qg1HXZ|Ii-s9>y==O`gj;eWt^uZRh-a>>M`mX8? zP((^qPJq$bxCi0~Y;6IxVItebN1@K;u8w_660%@ic(3RaeLOL@zqTdA->SxD+1}Cd zH8Ga#+y8GE^W#K5XO#o8T6fXnn#0hb^7wl#cJ5B^qr2y8QVB^;TXy}GICgQ5diE6Q zdh2Ut5X5r!ro|HFm>!kwF-1ILnyZ}5Gxk87wdtpyCDsFR8^wzFv*s2Vg4I49DGhlh z&L(=h`VXCWui}+CJ|ac3U&!5@xUO!R|9xHjPoKgPO_9fOQzOC`%5-CWxj)-m?)zk1 z_!7~Y(;M5|tl|k1l(LiI&Z4fA3!79Tqp`#%V$!C@(FfqBOJbj!*5>_yEg`Lw+_OY2 zPlk26$3SqqKRlr{DJ&gLh@=wf)-IBlTc!upo)vAEG;f#HP7(FZNAM0kcksZE{#HAf zkiVq%V9W9qWdyfADGM8W-q<&B)Y0_Ld|1pbaZ`yhV9rptAYb)LeAGpl9;%$qK3OcW z-UH_Eqm(Xx-C~HxzSSGeQeC;9{&cVsgU~~CwrvPf#BdRBJd4|8u_*It7uM3 zJ*Sg(;>kK&BpK!TF&X`+N?Q1%(vSsy`UU2cPY@x;FRU*91hz7)cLk>hW%^k&CS?TZ z{dOo-65Z@^+0$cjU{ve%yw68)yX5VZa_XJSIJx7rpS!oL4=$g)k7jrLa!4AoUYskh zJ1q0pm2jhi)U8!j#}^(q+fF?<`SbwdmCIuk%YC^eR!^(w58&fmd|&+L=t(IG;jS`+lz*PmQIoB#2U?w`P(L_ae@=*Jmni-k^y$a|*B&0rV z@z;gpHmLPZi_ISzf%1wo_L%`;@hZJaX8la0Y*l>)UFr%|lz+&bs93h$>R-FssYyQ2 zvjPHVk532i{tFnT`;NgFT>q^y3hrf=z-zr>Q~U%O{J&eGu32T)Vo{IT97Zl%r zJsKcG;0|M1*Lkogla52J^8B)LvAna)7%B@BO|Q(9)E(_nUG~^l0EGc?$xRXa#oQJM z{>Ad1M@&Bv=3OIqhx&@=6B$Kl|3&EUY~Ma4sfRan_bKh1b#%~kU+|ZY7Q~;P7xxep zmJ~~7a@>&L=QHMDrGk$S=ir+jj{!g1DvI}dLh(}#ZfqhJ*I(~Df z%sN>#*5(7(qse85=lX|aLEp32m<5&D1!0G!I(}+xw8-O74xO?C!9lkuLDgNQlbRN#GoWWoy`{&^CV z$wEbKPd@T@5+2#^**+lC-}z8-rX*_=_B@|ARa(gcQXCc+1oY!-_s?^l}OB@a3Kw?&4d5f83DV zQ@!H!`nV9Mty?E37k{A;+fw|_=tY6*s7$Hdwlv4v=~d-b*wr3wP%2Y#5O5AuZoLIGdS1UE)w!rvoVH}jbS2`5ico&4%+0c+@wtdv(-E)q4|~BV z-vim&Ga?jA_+XH5X-GXIA!QXX)3 zwI_%Mx4Jnwdztw?{G2CF>$mi)a+lOcct1QUVRWv-wZq6cdAoA_vyUg>2FLwYCwEt$ z1X0Aw1d(Nnr_(l0z5SRwzfI?v>3r1hg?kcjzs>LVrSYOLcc;KAr9W(At&a>G0mMrJLs56~)#m=I5T*WwlQSUrTeD+q@H~4-38PN!t7%Ib#I6`C;RP|3>T*`*pYj=`|#kBr`xzCZ-|^d5=I-;Fy_hf*B}a;lev4z z#<*ZaXR&g3Tlg019Gz3VtIGXpZ|^4WFvFTN&ZBnZ5 zqa(A8ftfB!-#bIOY1s5IV12of=Z6r;?*6l17m}+M&cJcFGPs_J<9Iv_;FsU=@BQ)n zco2Hv_xbSqd=N&%@9X2gpAV#WN|w+*8W}A{sa}QMS_#W@o4{+QBBhUZw=)}vUoIf@m#H)c_U(l+Qyu^ZBnj5>_eC@^-_jaUtA7t-Bgk^j7&<#&tq zpRXL`8Saf4Ghb;pmhg5CdV?HSu8_`OpyDd{_`Oa9_rWdDSf$eDUw6Rv9O^f(k>eDV zJpbUaYWLInD}0d&?ZY2tccZ-rY)eMQTY0~jgUd!ZZXBtnF^ZH$p6mGkXMBm_!h7T) zeL{aHKmTvz|BU|GCPHuZw>k@<@7C{=cQ@`Kb@SA5+-CSxrL|rIdiCq8#1u!WSIJdX zv>!Oc?pP(SLeC57Zm}ltuL2HKC;VU>6tG+D`M&deDGpKx#2WXOPo+3e9TaN}n7&QG zZm~6e##~3-UD4I;i1~Nypy)_12ddp-(|O)bv0H4CJZ`w(N74y4r3v-Lc#6pKyvpk9 z7Ta}idsg;`tIlt>wev%KFg$e2E6s!MpONt~`DAYlnIFsk)A>Zc3r&rij{dI0;n76k^aiptkLir;y$E!jV4lE(_J>k z5hov%vi>9K9p}mz&esI0d5e)@k{;jJ!0--WrOMtTlm}53Z!BY29i)y*HI5ZybwnJZDPV+ykc8}HD&1Q=8 zHH#t^<=>X{mm`(7qhYpBgRpxk{&{0U;Of0p#KJb&f@`d)N_@k9OsOOwzox_D~~&K?hOG)s!KXM6DhW2tU>hE{cJt3 zWK?K3ss`D5(W0%;Dq|{G|B~^rwW^7$2Im7GGA{_G=`C8UPs*reE!X&;!jLN{cFg?uei|AKS~|QRoSuOFLAh-CaylN! zdpG0!cS>!v*nY5B-@tzV=KlTrY5Oc0{`2p=^UhEK2dP)$5ind#ibOC}A8DZ_qeYu= zYLN9`1u$Zl+i3bFjE|@&y`5q*KBD6Hu=Rai-c$Z#W#`yr2Hu7^E{Udl>Bh`A8qc%(PptoRR%O^LjDCdPJ=?Yk`v-81v66j{(7R_kKS;|X zxbIL6ODFUX^QoFk(=YFiR7Wje7DsU;_@VVrJn_Wn&JW^Gzn6J(1Lo86<;x$v+3COM z6zJb<;SXW`haRGVw#Q4iN-mL%9!;?&W3f7I?WGeGd+J)W-}rB5^e4E(KFIo)jEBCI zy;7Q=;4D>K7sV$snzj81phPhl4^JDr+4~h*x7b8<9!t*%j74B62YTF?p06oaxI5%0 z>&MTPHSBu?|6RZIEG>_$AI6GTt&aHZZh_uGntZk0g5h(0e3S8DI&|&|#j{Hz)p5~F z5Tt#C!jbAE`RcSKCqni-m-+X7wv)*?eJb#bq>i-XW}N@GZ@6maZF~4bRXa3^YuB!& z?U|Y5KY#RSPqx2%>hd+w(a~(Y&&+{dbwD}e|A8~?U4z~9eKHdV-AOz8hs=Xpj? zg87qs89iIHPx^D*8AgwRx(oO6gM0O~yjzQn=q(?0SzWoWlC3`zaaZ@~ zqgpL}pUnRkybc`j`Lfb>(ri1b$l~AzeW3$|5}5?{MY(Nm>kZN6)^KnLeJ9jDzty`a~Uh(e2rUdp+h>E{}Bd( zKOk6Ec9@O7WX%q>(YS@JKgpo?)a|nEw0yGu+cWIF6#LXCYt$=N+)pu~e+hg_&U+!u z+M>68TB*VL5YI62uh-*dpucl)^_ttOSKSv+_|V%0evt5&SrukBp2&W&K8hcp`3XPi+f~BqNATg6*WRJ&$vA(Q zD{ye9>p9Y+;xji=oUZ}JlLUS>8S8(*-XrBSJrcOGyu6O$fx3Ln{r7+TF~!MP|HH$> z8x9SIS(~n(2N&YG+33HZsCvcg@G4L04ZGqOX#Lx(5F$~h(^33lUcP4Y=4`gUd+92* z^|w!&MAO&hEzKEf?i?fFnK^u{p6%yLb7tl&Uw(zH-()=0|17Mxg#LVAH=BQi{z=_? zOK5qPj7n|UpnO;oEXWL}iG(VaD=WEJ3DUNPTMl8_h*?yC({z8G{Aa}+(7h_zk@0YSW*V-%C| zp&zVa@00amz}mz13$i{aRS7J;LR+9YY!uGxg#LWJBQDU`p;$)CC+S(;-RBtAV0}== zoTfM*=gYD(p?&ij*Qm*QPSa=RB!jx|$YE>yOaqa!h~5f8AOPuCBrjw-a&rA>+{o7hw!-n1-4}DyCL0@apU_VxRsUH zq8)?p+1U45w4{6)!d0VJP`%UD-oJkU2s{(_2LZ~6aOtSXq3Y#FBiFT26dGx{Ga zT%(3R#II>BV05cnxiXQ__x-{a?c~W*rqJ}6c~AOBFI(PDvFoFM@$0XeF_z*yILqn} z5VQGxQPZvHHwyfj`+AL9Y4m031jpZix2szn@=w>jt5NdC8e0BE?RK@Y+o3!i%Hsuo z^r9AcNSNPWXvW6s_X_#n)qF0Gawz{@a=+w&^VIuhIi|0Uebzr{u)#pTPjvMh>0fP1 z)+}2V7e~_`wTWe zrmw%KEv>6${M2-v`}%hChen#8;A{3DnEZ&~{tU|u$8=@tKnBI`D6je1hJynBLOW;| z_V0_@FEoSJJzvsvf}@rvu=D#D8k1)J)v{wW{kY~`bymBb?H})|KgD`g!p=hk8w}ZO zzn|AAo$t8*Ppr?^#Nnak6=+sPe1PZHi05p7$B~fd-D8P-^jIZ&S_QnKXSd@D;n6t%@YwI8^fkO(!@uJ&T>k-Pa%2bar(yeq*}s z3k|R0?KD5=uRd(Q%EsGq;Gx0#L7GnJ-<3F+L~$P4gX1t;pER+b-iz}P!_kfV{2l2Z z-AL#!$VZ6${1-e+pB|A1@%&=-%|QQA-Xro}9xi#|O_t67@x=(3a0C4>Wh90h8fbrf zx%-lK4<3qF%AZ55bZ0sAnM$5x`py^BNV)OS4?L`e=C7cg0YQE6qzH1QDHOJLZ zJ7(n*`fut!#l{DrKhAUEwEXMzXY!CujnB?m2F73hTei4fMZo zud4$;gxRb%nN0rleM0|>bw8F;JUwUe`pO~UJWj?#?4Te&p01m|-cTmo-;(v9#{M&- zmpjty%DV*&`kz0)vV@jT)`P)hL7wZe9_xWVOIQyy$2A>gD_^Ji3H?9oI>6osKOl!V z=LY)2D-omruI5i~p#SyxA5F_^!F}m^JZm#Se*}x>`Op8!^v6iTg}pGI{+l@bvjQvr zk^6mLKR-WO-|@eqe|6PMdGLD4=>KA#w{A*U9g}~ol<&LO<@xQo^nEh_T`?gj4q9!} znCj|G6chTJ!%8uMM`}#y{mssGO(*pCZ5HmE$^1WfelS8v$9`bkfHV9^ zd1U@~b=j{vVykUvJ;j9ndcB>Em*ZF;RLXW0O}~ioaAsxiGZeq8?pB012=vcW|8Vb? zEy8*i-8g1Gh65W9^RWLr%EvEhbIJVwE;SGPe}V1qJnsT|`af^}`=Z%c4B46Czl;6D zn=RJ16f4p90QnjHzbed?!};|%T4Gz(!NSC@h6aiiIhQhAw`_l&;y}&l`2z!2SpTk8 zkBM->0HEnu?KMFN>q#-8|7{m-(^^(zzp@jK3rKyH#~F|z&PIL<5K z1_SzdWPGhw@4I)iVe@8+H#PStKz_Er{hI&tTE9sC-3K4Moo)c}hv&b4#LYl|mphtM ztc@ww_PQJCKfbs}0ng|^)Asq)FDqTSQjm8L`hWg;(`PgtZsQ|x++9ZTYV|_7|1^Q# z9_#be0YL$5zbEvSI_+TmKUvRzem~tz-zW4=&jJar_xE(r`!!yD#avS znZ8Cv@kQaQoO5qT@J|4=$~q;!1-@^6ixTiEsA&>{Qs(r@RmJH|8m7Y zlmGkg&i9el3;IYdJ&h^+m6Qwd?$hR}u^t4_bVC0(U8YSF@bvYs*9hlzLf?z3Lu@>d z^WwQO<2IV#W4-%or!iu79&`sb$bM$)6QTFS*J|Z7Kf(4CK_9_=^>K~eZf5I0p?_7p zvX$odKzcf1C$5i|X*N z2eU)N?tiQx^VBf^7xYi%|Npo2uQ{_Jd7wJ^+xKxfM#dwp@8#Xn`MADd{W-DznH;eg z(QB^v2k5WEbdRGL`W6v5??h7!{oWhs@3DS|W`@Zmtk+5)6W0@Tlzm+4fdA(oZ1{y(m9g)Yoq)}MVEqVI2H=@&Ht zzrumP!Vjyty+Z!unulUJgMcp*Y_vO+_fV|CDCnCXC*>RaSh@-N#T-}RfP0{;Vbs(5 zo76pWgVD~`^R_DK{3%oBvh^~pu~G{^R53LFOL>bTjK*%Z{#?>FDT3$Do%3)}pQ zlR_Dl#?kzjcN-PtI70C=dAT>>_i>+mLwe4QxI*I(eSf};zTXq$GG8ec?rVC8K0ha5 zqL1x}*QkMwg8qM`x@(rwXlC_E#`#2Pv@@KqxiNpG7UkpP^!t(OG4op;%ClrNDg3LZ zjiu=?=Cx>-EEn!CTA=?K-f)23r(S~o(%j(Ss)EDs#h*SnLjRkA|MU16#IH`dkGKNZ zy0xf?w#TP_X-;Ef^RpD!G`q!4o9i=y;^;=7dU=w-5Bb!$RV8$vVf<8E)lQS4Yuipz@RGWz<|e^t1zG*-oQV|AF3s0+TpC+X5n@csrI`|F`oTiCSk7!<<7H-!E7ofR zqmP%aiRjibyd(!0?tSU|OLGw8HK2=~N7vzgIm>R-(R6aZ+%wpHiDFOaHyDle?EABH z71|*_inWi>e`7-Md79q~`faJL6`xRS$w-R$&VKD0|24;jb7Oo@Xp`hkEe}29eCK=a zu%8-U|3}~Q&y)ZA4$lqxb%DRfpNAh`{LkYVK|=aHTM7N2ynS}*jr5Oh^wQzF`d<15 z95%(Kr|H=IzP&>pp)@(jI~sH4{pkiaKZ{IBa?bq?M&BY+Z;SyZ>$E(~er@}3oknVu zX^B+pRX!4$zN`6IjIvyqPxBfr+J1-p6YIwp6JZz4KT!8&p~@iO>Z&ywy+is=6ZWGn zA^rA_AhqrLeWCRInK>=mwCr3aAFyQf#*78&XnJ*3lY-YHI{oz?RF*E1tFUKM99;VC zL>|EsC|;7&t5CsSB8gx0>Jy6!NBso)KlG4BgDMR_B;U<&{=1D^^uix;KTYi2CXn^- z-(ae8ix)Sq-jV_GAExag=ULomGx-j}*nuAq?)Ty>(T!0FS!}&0`fw%OcsAeKs>&6T zR}&4iJaS)ZMD%xxZ|^|*o#)aiu4%)1>@Z$7HE&Gi5{3SrSfBP}2?hYoKTwqxZ*aiX zRZ;QWG$FmnWXV8zi8TMIwm^00I~T4|?4^s;;C#>cw}CpNqC+Cw?^IVM6WX!&m8BTp z+*mfAm8GBE8=iRLRazeGV-#`G2~qCde7_1Fj+D^5SkP{!~>^4$#dr}gp0FJyg) zD7n_c4;Apr(r5DS3wr0@XnPQEM2q7-JMTSKFO8VeA?yc3=iWtsh*^L5AgYVVHAJ9K z-Rx3>!+bi`maKX1*=P6D@@Hc`2p_Hk{=>7Ytw}MhJ&W-Jo0?(YD>gCyJGv44KbOna zd!PD1V1fUyu380oO;#%{Kh^ZSJna>ekzzPnR+p3s`h?MqYcvy_1$xhGEHbUsWwG^N zS^AXU+6G}f5&DZcLpUujxOB|?UoP0#3L6;Pt7ty|_?Y@|0^r&V*CQZgL;*ozJGbQMGJFG_WqZJJuxZ={9>M4 zY^wua2mbAO2fP&fy`iD2ivhc* z`wuBr60z0sK9`*L9QA{U{x=`o-$C2ktW8$eRCt&vCiUN+ta>YnmTyd>DCDodLb(1bS7{L0c*5#dYP9O%6$ z!g2gYs(Tg2dMj)HVs($gyl4L0@}D8^el*wvwlVYFM4V^Y5rmQ4-05Vdi4FmB{_CpxX&Z>KcN%!H!kmneW5vw z(I?*0R;7y*G+O@b(uEO;=lZdrkCeX#`dgc~m9hO}4eWzAn)pnb4r?)m zy}LY@VnYA0xuJ7)Z<63VnI|vdbVKIPNNG1O{g)?=+z0-9`X}FD4?^sJ3Ni-ok8)k(nS$2?ZWt&js27pSK$vMJ$89F zFvqd|{L4Z&?Drg_4_W_#S^lLti@=Wv=S44_G@_v-f${gtP`*Kr;;xrZ{1bfO!m;&$ z(6^h{GkO#I@0k7#ti6$Hw@2+Y_3Zn=v8jhHv+rN0|BNNc2t5Y+pZJZ?|FI-o24V<& zwfk4|-*n^r_tF^^#zDIe?Y~r$QO-N~>-e$|=Owik3v>5mfa6k zK%f3n_J^r79sU4fOQz;NB4D@JXmKuEer`?2mUM!!I{QSO^Pwut6OWTsdgk6bBUhw%p7Kyd}^Pa)r6{1TzR zWX_xg3l~3^c@p}52Yw^;e|mLeioMxl`*-xOT64qvkGB}*2r)j5w*S<*eC)4@;S_Ib z9;i!*ImP5719i6+r*VS)Mm6m5&NT@0e_c*b48$c?`u?uwK=ki4cHTzB?pP%phS2mj z@E1xk$L?FJtBi7`K`3vhiO3@aO!V1!+b<{R`!zWKDV0SNDE6s`qkXY2lmAp#eOYMY zeA)MQnv|twozJlSA=NayxWrg-ioQR)c;Bpwx8Hu7;>GGFMOawa+`mS``13b3|GCv8 z`au7F{l9VkzhUW71P4!G^JC~-P%PA=*nHU4e6Y~4WZqiZ9|Ltua||&%loUfgSXi=m zGe@zqbXY%*$xDaM5q)amzF|}It)&KoaNcUG+8*KIx_JwIf2RrZLbr}cic?LMm~o>S zze)JF6DO`ResB}U7sjtM%|ExXYgT7xxC8wy+LDvM{6f=}r9tZOr0;*Ec&F*|?s5nD zG`a72`@24to(z64cal8B?4*V1k z)LFD=IgXtdAg_z@RHLkRZGdX|a6sprBt&*8jQS|3LrY`~G~K{~i5nk$T*W{QrMW{|chd7ESxF zLIe4_;VQd7C;H8XF-F$kJ2Xl15(j>b*zcbe3-<$LzpoqmnaSS>wtP{`_TPMzpH$|{ z=nHE;d25$(D*ZmNqE$JS@oSJK%8P6+Y(I!pA5-vSecAd#_;V8{t)cIe{r{OghuQZc zv0i7Db=qlqU~IWUX%OrI0%LRK{GuaFAE(+ zF_Fiq95CeZ^8SPdmfo!WLQ!A#=36xXyhgJBD_Qvibv-dkWdO@xU6mv!-ur0&A`|TU z9Wdr6@~5-(Wu?;jJa1$Cg-<=`1^-s`{ee2%Uz@lC6qEI%-=V&#(0{f$U?uLah%lGt zC-T3GKfKNMFS7rK&Ye5M#Silz`~OMYug3h!|HD6%{-hp)_U}l&{#W?Xk^P^Pw|{>b zn_tyc%{Rz@;w~IhOq&+W`tMX*Pt1WAmKbP%_|z{}b8EkShT>(ghZ|G)AuBJ{^h}PU zK1q>j*nbMsCp&d6kl0hP{W%(O6&k{Y@q+sVxl8tDcAmujl7c(Z-AKQe3Vv-~&cMqQ zD@%=v6EJX~cvJJk>IsNRNbx+}U(MUSdNsue(;Lf`ovEi-3I86PbSGOMhVj_Zx6t&j z3jGnayN{iJlhx&lIiX>5oo*fB|46>rSXT#qe=`3ufUZA09{M}^`LDwAM@P>8JU=Uk z=&RFORsU-KU#&CBeWC>UUJc~+25}YJALlhT#dJE{$NJRwz$2b;Kih`=mE*ctenS6c z@DEA9_gZrx^y4Nlys7zMo*|rL=S3gfPetDEI3D0HX79+jC;gX-`$qgoq~#HNX6r8q z1AV=h3IFFDEPRjLSG>xNW#4P73RHjSP~RflAIco;S5qM$bWMz6`71Oo^EdAm^cRQM z|KPd7zu4ZJd>U82JfET=_93KhlA`WKmo_1W3}4|`Yz{H2_u z{R!`1iZn#S{9jEQ&f7(f>nHY8j_aiDC;PMGc|7%3=kZkNPxAd~jQ$ny*RcOVZ4A|`YH7N zBBH;hM4*D}>%%a1xZht^3jMUj{{Mo0GxT@z#r%g!2%&#k+FBj$kIV1};duX7f%9%U!aveFewt0G*<@VHJta$e)&h4Di4 zj~(?lFYj(rq~U-^^OO3$6(!hnVSkr*I>?9JaK2Y6eI54yMG;xN;GdYJw+@WmM$2=< z{l3yvd&m)IA5pXW&=j)%2L~^ByBd>!c>iBK>>p-i_aOa5-yHeNO@r+Xp4J9WoMV^f zIIjO+Vtsb>2R9FqiKCRk?EFOJc}l%N|KamEE@)^gmE?Th+QsmnN|UfZwBB`dg3RgPF=f@XI=U+K_;si}6^61tH6WDm#3I370B=EP(O3D3! zpzm{eH`(t;kE8F8FaBzGeNFj?0$zmuU$`%z^xyh27XM*=|KG;^@9AaqF9i7==#TlI z_{=l3y&)HH|2LtCt*^V9cW9QBaIQ3cS94VrWQ1%zZ>w6ZmW&bRPkYs}Qe{*qUgvQpgta89f~vsn z!wkU4dJFjkav9nBT(r|LgBC`R9zxf5-LzGS>fR)(Z58zC^@YgFw$UIA2Y0Sl=OU z!}(mPr~Q#Syg#?LQv6ch@c!IEF_FJJDKi-VMAp+Oda&Qu_j@9r<4nSSj{85%e*qKy z1DFFa`V;*vgTws{k>|S{Q8Ios5b+!mYxb7V@@MJ5Ul4K5_3youw<=<|`0LnPmn-ii z#b3ug3dk4U;Koqg8`C7e)Scc#apm>(U;Y&4KUhGXpZ=TJ{~KBmC2^Skmv>|RXZz<@ zg}5)lL)%C8>%;f)Y`zk#(_4}q(|_*R*iSLJZ#mj@>Q0J@eoab7JCm0X{h7bp53~Fv z{c_Akboj`8CHFVA7cF`LHz}fq-oidLl1}z_+u>YaM_k{0^=FF7`yITcm|{2NuV}6b zb;LE(yYF$tz7Ks{;D|l)4{mhCeHK?X-w8iiF*vB9=?93tAD%g3IR71t1pR|ze+%>f z)sJ8gIwuAFI==HCiFgato;s(N%{`n z@)X77zHDREU)X(lAnwb5t}#2%%Psa&>P8jKPu2%}-)-k9CiEK`c*_CzDD<0tWaELP z8>VA8T^}F4F~{T;#=gB2lk|@ccc(hyf!7Pn3_seWh`)FobQ>98y^1D9*TCUsipl$b zs7ZAg59RWj(|i^`IGo?N0P?J$1wrl;W_&RDG(dj7(BHdiLy83uNRgY5qFmP&Y=3@fxRg{}? zoVwoML71;ygZ3#D6Z%^Y53&9aME{rNhO+ra^zC2OrL%N$KC^FMz}6=>&@+R-!01cf zf2CuHeUH$S|1pzcLhsYJJPGUF=yZ+!q*IPRBhnoe5U$+M$wR`nsboBgJ`2zl2%7yAG zDA)PExs}#Bx)Jeq;+|ps+l>2t9LL#yLFV&)_X+->$@*)k>G+hsPx@c%JDBB&$8>iv z`B^^n_flI`6KFc2Pl0&wD8=MHVT!7QeV?Rzc7?J1mtf1imFzr1=(+#w;M4SdvR+@U zuVnXiJ&JP0)X$E*Pt&2zt(ay0;X@?T=W;}H=?gBHqCjQ*ehlYz&^NDsm%V8ujHFkzFm*@ zL0r$|^)1>a`5>?Aq^%OH+1G z9EkU&RxG#I-zVii?eIR4&q&P!H8dUCI&wpaAP?+~G0JCj;B(jCA5PCc$M^+;L*E}_ z{2VE7kdLpV`3csmQm0p8MBo{{bl6_KNH+T-f9LQRj7fb* z@t(7X)A2pj_m*zn>E!VDfDN$lvs_a*jNsw+P5aPq^+`iUZ5qEj zu;s&em~$X`uBR(+y&eXY;(3|i0jhTdkA$V>qF#P`7~?vFxFO+`y0-`}_Tc#uH8;qk+9Uu3JVMG{oB<& zq%2(XDbBQA8KCW{MA%7XltoN&1;RRRbhx%A7-6K@F_452RCbrJ{#c_40v4{h*Fa3d zcMJI=)oyAYY$q)rIF=tO|s}Qa!Nfm{{mbgt3T?iHWB5c`9!9s*xELqOh z!*zMvAhB)Aq6)-z8X!uH_YPv7s;{u&SGXX!24ZUxsG#pqq3SqZl;?W{lM zH72XITJ4H?&mv|b!shWj%(UQ^>>q9aSNwyIPfIv|cd^Bi;drevyVOf}1`n-&KlVnZcpHqDuLFYn6)_e$HQ=I zjOMfUPuCqMZo8Sc=0iI}&F7l(#nVeB}SA{l56D z!?qb(&1El>+gfO2E!)^DRIkRWe`cK#8sa*qH11KhLx%+rK z6N}G)+wGKrfexDPzTRVX8T7aX47cm)`YehsYMM1Lp7nex!rsfvyGm0fk z_8un0w?f?iKchcwFS=p)@x}k7KR)Y$S=)8DCYvFKrQh?Z_tvd_=J5w8Cj0vbAJk&q z9eLklePFD3Y&qj^Jl3zi!OhfvfMX3MM#z~*-oL0>4gTK|KYRmzuh8`&-W)c8=HG?( zBdYH5RXb_>p{D#lnE$lBBVQNX{OM{&+MfzBHMxeQ-y>#rTSOv;+n|=KyejPHP^(Zl z^7rGR_Nr6~=|pXd%r;scQJZkgf3Pr#V7A`Bl$V6_f`MUjZ4x{~cz-F}0CXiKrE{_R zOFm&gdE(kM=AY62JCjD*Kfd@zw-#xQy)mBq+9kC9#I2>#Sd~U`k?G6Ak|WWKAC7Je zRCn`NoM`&I#vK|Salt4iZU^D@g5jMoo8b9Zd};d3oC@vW;D<>RD^1}4`3~0q%2K!u zRBcSFy=1=bCLY%cQ>ILz^mLrt0`cd)SQHTZ$ zi(HO>qc|`E?Faq89B#ire`40@*#2g?b=r`c#I8w+*@kUVvOT~Ckj1$Tu=im3iEz$lX?SG@@aLxW^sLft?lk9^BWez_= z&i@$u;?ItGC=LpqL)2O?5Vt18?3R9yxGA%qx#JFsLoVcNl&UhukF~*Vol@C}GDp5g z=m++Kt=B&FB;Dpq(_xkbtY`VZEPNPPIbKMInzVB47>ZL%fip>+N6JT-AVtUN6DQt! z2R1{)Y9k!?&uIVu*WT3!MRi^Ar$~w)tD6bCn`!;nj!DM&73*M1Vlxn?Rb$lXW?ol; zE*m#>h#L@#k{}y)jZ{!6S_h0;lx-R+t}arhkTe<8NoS-}rkLt1OF{~a(TIx*j%7gD z<@I;oU-22|W=broS$NBgj;n~EgSMiTvJ+%B&7{>JJt}tt#!fuL+ z#&db)Hp3D7lnS#;upA~+881iLi{b;V1N?kc=I_lDUYN_*PugFM#`k!Af^8{2t->~m zmED$@$>(|b8MqOA*47cI_ygSL>d0+oZ1`XNEV;FA`ReX{{D0i?M$&Np@tKVOLGUMv z>iGrh7ib%o&q0JiXys2~!k~FM&2P{i_C9^Ve43%y$@#CN5tJ+pW&2;_HQo`7b1RZLI#q zyqlKRwvM2yP=(1hMMXs^U&rWgoBp5nTYnI3eggbs{gb52rP?r-T)(5B%5A{NLgn3%3EiSxNIDNwuX~H~#nwo0DeFJkI6+mzG7Y({FZh z`EU1UI)wTd59{B@7#{-`07kFJ{{PY8RxhI!xA~czpB8){hm1zt;}rhN{LR^qY&$)Q zf8i5fIx7e4vZb~CU%}U%bu-#(7J&au$5`+`PMQ>6Ah+R)_bLvr*}(R{HDkhm-%!0{DPX>3{sBYF`a|;{SsvRN9S>M$&l52MqbcoI z=;RIFf57@U%9fZ6tejwBedXnc87)?BEynV~=Lhk3C^pu}%D4M}wi=7SjfNgcD>^hng4&6gMH3_E!@yu;V|F-)}j3;AwAZg zby&Z%Fd-OCVPx}m?B(aT`nqll+}wFNg$=?@oYN%#jr&v>I)Y7_j8gW#Or(WQ?bFa$ zUrYvrX~shEFMt2H#)SW@Hj@7vkbmqkE&sH>*=)(s(JS+p+&Hg<=HfeH^pupLrS2R? zliTL??QRW!-Ilk{Px7*Ia=V*4SXIO5zbD_syCWTprgCY>oyKT#%bPZI@$8=va0WZU ztUGy4mH_hRL>V#vYckp-sc9vp)lz!%@az5k_4OLJB@b}Q=3k5K4=>A{O|bW#qTm0T z^``{m5A{YWqvxZ)LP$*`L;W{DQ>fv;$uc`s&S`RE6ND?^Md<<2dwoN1Y3Zs^Mo_vb zmz&REy~lJ}V&4yp@DsW=avMAI%*#Jl`yW?17V}^GK0AmgJ|1zEWuTKv(l;w^O?ugl z%2V*PeZ~9HA#}8eKkabbYOx72cn>>rGZJyGc#VpZMCy^Th#_vmZ&y zZ61AonSP!7%%Kv^5>}Uf|DRUI!z?5sx{i;`H;0Aryaj7CH*2pg0KM5F)0c3~o=4X< zQNNbVq}+_nB|~CCxdH#lKi_=+e;3P?j{4W;NUX+HSHvuw|A;lx>F$yCB#+gQjqM8JBYIOSRa&jeB!$Y(Ehy+sm!l;ZQ8VK8EgL) zpz&(W3ZzDd8i5}JNsVr^<-1vZ$_BPRE6WZ=@trj3?z!!LG82A#`{t1`NZ*CVkfuMxOrBqO?U{Budj zCLo(dRy)cbF#fDRp8bmaCFx@Jmzc0>ds9-p9&wP-q~_YWC&1_XV?a0Y)>t`BXbR&! z;;A`HV3vSo?qSU`Tk{$JquU3%R*F}6hrj<2=so-DI30`jduwc*Cbi1@?~CHJ+3xT~ zng53~i%zKhx+j8T9_=_A7AoV`CJi_R==~OR$}RAn3JOkN4GQL}BqGYq|jK>yy{vUE{`XNOZI) z#(j?ZHKc9EX;+x2ODKi63>-!zsl=((7OaK!!rK0JCmW{f>@^N)Fw`|IQ}xz}Mpipt zBYVC(xwp5skJX>*+OyJ!<1C|f+g?sdOHWTfSX~(T0yw!ettctpZ_g`9Dal%+)mA=s zY;wx2hzcTcxzvxO-Qqy*DS&LsNmT**^1bNj)!TD25ybY@{o2m>v(?#iy8HNTH?A_n z5%X!@iKkPPBn^_ZMo!B5(i%lu@)LN&RYG0H`deRD;*4*Pw=()}`D#b;iK4z4a}fmXcsFgT~Atc@gcphagkAK0tGDT#ga+-RhG`Sf5zNO&-7C&l gMB2{9LVDKWvjdM8h8x}C!U?sdfQ+_p9=YrM2ah^=4FCWD literal 0 HcmV?d00001 diff --git a/addons/explosives/ExplosivesUI.hpp b/addons/explosives/ExplosivesUI.hpp index c6c76e573c..769b3dc167 100644 --- a/addons/explosives/ExplosivesUI.hpp +++ b/addons/explosives/ExplosivesUI.hpp @@ -4,16 +4,49 @@ #define GUI_GRID_H (0.04) #define ST_CENTER 0x02 +#define X_OFFSET 0.25 class RscText; class RscButton; - -#define X_OFFSET 0.25 - class RscXSliderH; class IGUIBack; +class RscPicture; +class RscEdit; -class Rsc_ACE_Timer_Slider:RscXSliderH{ +class Rsc_ACE_CallScreen_Edit:RscEdit { + canModify = 1; + colorBackground[] = {0,0,0,1}; + colorText[] = {0,0,0,1}; + colorDisabled[] = {1,1,1,0.25}; + colorSelection[] = { + "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])", + "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])", + "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", + 1 + }; + text = ""; + style = "0x00 + 0x40 + 0x200"; + shadow = 1; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 20) * 1)"; + x = 0.288594 * safezoneW + safezoneX; + w = 0.0825 * safezoneW; + h = 0.044 * safezoneH; +}; +class Rsc_ACE_HiddenButton:RscButton { + colorText[] = {0, 0, 0, 0}; + colorDisabled[] = {0, 0, 0, 0}; + colorBackground[] = {0, 0, 0, 0}; + colorBackgroundDisabled[] = {0, 0, 0, 0}; + colorBackgroundActive[] = {0, 0, 0, 0}; + colorFocused[] = {0, 0, 0, 0}; + colorShadow[] = {0, 0, 0, 0}; + colorBorder[] = {0, 0, 0, 0}; + w = 0.095589; + h = 0.039216; + shadow = 0; +}; + +class Rsc_ACE_Timer_Slider:RscXSliderH { x = 0.4; y = 0.2; w = 0.3; @@ -21,8 +54,7 @@ class Rsc_ACE_Timer_Slider:RscXSliderH{ colorBackground[] = {0,0,0,0.5}; }; -class RscACE_SelectTimeUI -{ +class RscACE_SelectTimeUI { idd = 8854; movingEnable = 0; class controls { @@ -72,3 +104,185 @@ class RscACE_SelectTimeUI }; }; }; + +class Rsc_ACE_NumKeyButton: Rsc_ACE_HiddenButton{}; +class Rsc_ACE_PhoneInterface { + idd = 8855; + movingEnable = 1; + onLoad = QUOTE(GVAR(IED_CurrentSpeedDial) = -1); + class controls { + class RscPicture_1200: RscPicture { + idc = 1200; + text = PATHTOF(Data\UI\Cellphone_Background.paa); + x = 0.231875 * safezoneW + safezoneX; + y = 0.104 * safezoneH + safezoneY; + w = 0.195937 * safezoneW; + h = 0.704 * safezoneH; + }; + class numkey_1: Rsc_ACE_NumKeyButton { + idc = 1600; + x = 0.278281 * safezoneW + safezoneX; + y = 0.533 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "1"; + action = "ctrlSetText [1400,((ctrlText 1400) + '1')];"; + }; + class numkey_2: Rsc_ACE_NumKeyButton { + idc = 1601; + x = 0.314375 * safezoneW + safezoneX; + y = 0.533 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "2"; + action = "ctrlSetText [1400,((ctrlText 1400) + '2')];"; + }; + class numkey_3: Rsc_ACE_NumKeyButton { + idc = 1602; + x = 0.350469 * safezoneW + safezoneX; + y = 0.533 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "3"; + action = "ctrlSetText [1400,((ctrlText 1400) + '3')];"; + }; + class numkey_4: Rsc_ACE_NumKeyButton { + idc = 1603; + x = 0.278281 * safezoneW + safezoneX; + y = 0.577 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "4"; + action = "ctrlSetText [1400,((ctrlText 1400) + '4')];"; + }; + class numkey_5: Rsc_ACE_NumKeyButton { + idc = 1604; + x = 0.314375 * safezoneW + safezoneX; + y = 0.577 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "5"; + action = "ctrlSetText [1400,((ctrlText 1400) + '5')];"; + }; + class numkey_6: Rsc_ACE_NumKeyButton { + idc = 1605; + x = 0.350469 * safezoneW + safezoneX; + y = 0.577 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "6"; + action = "ctrlSetText [1400,((ctrlText 1400) + '6')];"; + }; + class numkey_7: Rsc_ACE_NumKeyButton { + idc = 1606; + x = 0.278281 * safezoneW + safezoneX; + y = 0.621 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "7"; + action = "ctrlSetText [1400,((ctrlText 1400) + '7')];"; + }; + class numkey_8: Rsc_ACE_NumKeyButton { + idc = 1607; + x = 0.314375 * safezoneW + safezoneX; + y = 0.621 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "8"; + action = "ctrlSetText [1400,((ctrlText 1400) + '8')];"; + }; + class numkey_9: Rsc_ACE_NumKeyButton { + idc = 1608; + x = 0.350469 * safezoneW + safezoneX; + y = 0.621 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "9"; + action = "ctrlSetText [1400,((ctrlText 1400) + '9')];"; + }; + class numkey_0: Rsc_ACE_NumKeyButton { + idc = 1609; + x = 0.314375 * safezoneW + safezoneX; + y = 0.676 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "0"; + action = "ctrlSetText [1400,((ctrlText 1400) + '0')];"; + }; + class speedDialAdd: Rsc_ACE_NumKeyButton { + idc = 1610; + x = 0.278281 * safezoneW + safezoneX; + y = 0.676 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "$STR_ACE_Explosives_Phone_AddToSpeedDial"; + action = QUOTE([ARR_2(ctrlText 1401,ctrlText 1400)] call FUNC(addToSpeedDial);); + }; + class clear: Rsc_ACE_HiddenButton { + idc = 1610; + x = 0.278281 * safezoneW + safezoneX; + y = 0.445 * safezoneH + safezoneY; + w = 0.020625 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "$STR_ACE_Explosives_Clear"; + action = QUOTE(ctrlSetText [ARR_2(1400,'')];[ctrlText 1401] call FUNC(removeFromSpeedDial);ctrlSetText [ARR_2(1401,'')];); + }; + class dial: Rsc_ACE_HiddenButton { + idc = 1611; + x = 0.309219 * safezoneW + safezoneX; + y = 0.445 * safezoneH + safezoneY; + w = 0.04125 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "$STR_ACE_Explosives_Phone_Dial"; + action = QUOTE([ARR_2(ace_player,ctrlText 1400)] call FUNC(dialPhone);); + }; + class up: Rsc_ACE_HiddenButton { + idc = 1612; + x = 0.360781 * safezoneW + safezoneX; + y = 0.445 * safezoneH + safezoneY; + w = 0.020625 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "$STR_ACE_Explosives_Phone_Up"; + action = QUOTE([true] call FUNC(setSpeedDial)); + }; + class down: Rsc_ACE_HiddenButton { + idc = 1613; + x = 0.345312 * safezoneW + safezoneX; + y = 0.485 * safezoneH + safezoneY; + w = 0.020625 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "$STR_ACE_Explosives_Phone_Down"; + action = QUOTE([false] call FUNC(setSpeedDial)); + }; + class speedDial_Text: RscText { + idc = 1405; + y = 0.302 * safezoneH + safezoneY; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 22) * 1)"; + x = 0.288594 * safezoneW + safezoneX; + w = 0.0825 * safezoneW; + h = 0.044 * safezoneH; + text = "Name"; + }; + class speedDial_edit: Rsc_ACE_CallScreen_Edit { + idc = 1401; + y = 0.302 * safezoneH + safezoneY; + x = 0.318 * safezoneW + safezoneX; + w = 0.1; + }; + class numberEdit_Text: RscText { + idc = 1406; + y = 0.348 * safezoneH + safezoneY; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 22) * 1)"; + x = 0.288594 * safezoneW + safezoneX; + w = 0.0825 * safezoneW; + h = 0.044 * safezoneH; + text = "#"; + }; + class number_edit: Rsc_ACE_CallScreen_Edit { + canModify = 0; + idc = 1400; + y = 0.348 * safezoneH + safezoneY; + x = 0.3 * safezoneW + safezoneX; + }; + }; +}; diff --git a/addons/explosives/XEH_postInit.sqf b/addons/explosives/XEH_postInit.sqf index 2ede878a37..e3b40308c3 100644 --- a/addons/explosives/XEH_postInit.sqf +++ b/addons/explosives/XEH_postInit.sqf @@ -18,6 +18,7 @@ if !(hasInterface) exitWith {}; GVAR(PlacedCount) = 0; GVAR(Setup) = objNull; GVAR(pfeh_running) = false; +GVAR(CurrentSpeedDial) = 0; [{(_this select 0) call FUNC(handleScrollWheel);}] call EFUNC(Common,addScrollWheelEventHandler); player addEventHandler ["Killed", { diff --git a/addons/explosives/XEH_preInit.sqf b/addons/explosives/XEH_preInit.sqf index 801ded6615..d8f8dc1216 100644 --- a/addons/explosives/XEH_preInit.sqf +++ b/addons/explosives/XEH_preInit.sqf @@ -17,11 +17,14 @@ ADDON = false; +PREP(addCellphoneIED); PREP(addClacker); +PREP(addToSpeedDial); PREP(canDefuse); PREP(canDetonate); PREP(defuseExplosive); PREP(detonateExplosive); +PREP(dialPhone); PREP(handleScrollWheel); @@ -30,6 +33,7 @@ PREP(hasPlacedExplosives); PREP(getDetonators); PREP(getPlacedExplosives); +PREP(getSpeedDialExplosive); PREP(openDetonateUI); PREP(openPlaceUI); @@ -41,10 +45,12 @@ PREP(place_Approve); PREP(place_Cancel); PREP(placeExplosive); +PREP(removeFromSpeedDial); PREP(selectTrigger); PREP(setupExplosive); PREP(setPosition); +PREP(setSpeedDial); PREP(startDefuse); PREP(startTimer); PREP(triggerType); diff --git a/addons/explosives/functions/fnc_addCellphoneIED.sqf b/addons/explosives/functions/fnc_addCellphoneIED.sqf new file mode 100644 index 0000000000..0678f56f6b --- /dev/null +++ b/addons/explosives/functions/fnc_addCellphoneIED.sqf @@ -0,0 +1,47 @@ +/* + * Author: Garth 'L-H' de Wet + * Adds an IED to the cellphone list + * + * Arguments: + * 0: Unit + * 1: Explosive + * 2: Magazine classname + * 3: Extra variables + * + * Return Value: + * None + * + * Example: + * Handled by PlaceExplosive. + * + * Public: No + */ +#include "script_component.hpp" +EXPLODE_4_PVT(_this,_unit,_explosive,_magazineClass,_extra); +// Config is the last item in the list of passed in items. +_config = (_this select 3) select (count (_this select 3) - 1); + +_requiredItems = getArray(_config >> "requires"); +_hasRequired = true; +_detonators = [_unit] call FUNC(getDetonators); +{ + if !(_x in _detonators) exitWith{ + _hasRequired = false; + }; +} count _requiredItems; +private ["_code", "_count"]; +_code = str(round (random 9999)); +_count = 4 - count (toArray _code); +while {_count > 0} do { + _code = "0" + _code; + _count = _count - 1; +}; +if (isNil QGVAR(CellphoneIEDs)) then { + GVAR(CellphoneIEDs) = []; +}; +_count = GVAR(CellphoneIEDs) pushBack [_explosive,_code]; +_count = _count + 1; +publicVariable QGVAR(CellphoneIEDs); +_unit sideChat format ["IED %1 code: %2", _count,_code]; +if !(_hasRequired) exitWith {}; +[format ["IED %1", _count],_code] call FUNC(addToSpeedDial); diff --git a/addons/explosives/functions/fnc_addToSpeedDial.sqf b/addons/explosives/functions/fnc_addToSpeedDial.sqf new file mode 100644 index 0000000000..142996e4c3 --- /dev/null +++ b/addons/explosives/functions/fnc_addToSpeedDial.sqf @@ -0,0 +1,37 @@ +/* + * Author: Garth 'L-H' de Wet + * Sets the speed dial for the UI. + * + * Arguments: + * 0: Name of speed dial + * 1: Code to add to speed dial + * + * Return Value: + * None + * + * Example: + * ["My Speed Dial","2131"] call ACE_explosives_fnc_addToSpeedDial; + * + * Public: Yes + */ +#include "script_component.hpp" +private ["_speedDial", "_found"]; +_speedDial = ace_player getVariable [QGVAR(SpeedDial), []]; +_found = false; + +EXPLODE_2_PVT(_this,_name,_code); + +if ((_code) == "") ExitWith { + [_name] call FUNC(removeFromSpeedDial); +}; +{ + if ((_x select 0) == _name) exitWith { + _speedDial set [_foreachindex, _this]; + _found = true; + }; +} foreach _speedDial; +if (!_found) then { + _speedDial pushBack _this; +}; + +ace_player setVariable [QGVAR(SpeedDial), _speedDial]; diff --git a/addons/explosives/functions/fnc_dialPhone.sqf b/addons/explosives/functions/fnc_dialPhone.sqf new file mode 100644 index 0000000000..3bb2cc45e8 --- /dev/null +++ b/addons/explosives/functions/fnc_dialPhone.sqf @@ -0,0 +1,68 @@ +/* + * Author: Garth 'L-H' de Wet + * Dials the number passed and detonates the explosive. + * + * Arguments: + * 0: Unit to do dialing + * 1: Code to dial + * + * Return Value: + * None + * + * Example: + * [ace_player,"2131"] call ACE_explosives_fnc_dialPhone; + * + * Public: Yes + */ +#include "script_component.hpp" +private ["_arr", "_ran", "_i","_speedDial"]; +EXPLODE_2_PVT(_this,_unit,_code); +if (_unit getVariable [QGVAR(Dialing),false]) exitWith {}; +if !(alive _unit) exitWith {}; +_unit setVariable [QGVAR(Dialing), true, true]; + +_ran = (ceil(random 8)) + 1; +_arr = []; +for [{_i=0}, {_i<_ran}, {_i=_i+1}] do { + _arr = _arr + ['.','..','...','']; +}; +if (_unit == ace_player) then { + ctrlSetText [1400,"Calling"]; + [{ + EXPLODE_4_PVT(_this select 0,_unit,_i,_arr,_code); + if ((_i mod 4) == 0) then { + playSound3D [QUOTE(PATHTOF_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; + }; + ctrlSetText [1400,format["Calling%1",_arr select (_i - 4)]]; + if (_i >= (count _arr + 2)) then { + [_this select 1] call CALLSTACK(cba_fnc_removePerFrameHandler); + private "_explosive"; + _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); + if (!isNull (_explosive)) then { + [_unit, -1, [_explosive, 1]] call FUNC(detonateExplosive); + }; + _unit setVariable [QGVAR(Dialing), false, true]; + if (_unit == ace_player) then { + ctrlSetText [1400,"Call Ended!"]; + }; + }; + if (_i == (count _arr)) then { + private "_explosive"; + _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); + if (!isNull (_explosive)) then { + playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL _explosive,3.16228,1,75]; + }; + }; + (_this select 0) set [1, _i + 1]; + }, 0.25, [_unit,4,_arr,_code]] call CALLSTACK(CBA_fnc_addPerFrameHandler); +} else { + private ["_explosive"]; + _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); + if (!isNull (_explosive)) then { + [{ + playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL (_this select 1),3.16228,1,75]; + (_this select 0) setVariable [QGVAR(Dialing), false, true]; + }, [_unit,_explosive], 0.25 * (count _arr - 4), 0] call EFUNC(common,waitAndExecute); + [_explosive,0.25 * (count _arr - 1)] call FUNC(startTimer); + }; +}; diff --git a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf new file mode 100644 index 0000000000..f5b3172c46 --- /dev/null +++ b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf @@ -0,0 +1,28 @@ +/* + * Author: Garth 'L-H' de Wet + * Gets the explosive object or objNull from the speed dial entry. + * + * Arguments: + * 0: Unit + * 1: Speed dial entry + * + * Return Value: + * Associated explosive (or ObjNull) + * + * Example: + * [ace_player, "2113"] call ace_explosives_fnc_getSpeedDialExplosive; + * + * Public: Yes + */ +#include "script_component.hpp" +EXPLODE_2_PVT(_this,_unit,_code); +private ["_explosive"]; +if (isNil QGVAR(CellphoneIEDs)) exitWith {objNull}; +_explosive = objNull; +{ + if ((_x select 1) == _code) exitWith { + _explosive = _x select 0; + }; + false +} count GVAR(CellphoneIEDs); +_explosive diff --git a/addons/explosives/functions/fnc_removeFromSpeedDial.sqf b/addons/explosives/functions/fnc_removeFromSpeedDial.sqf new file mode 100644 index 0000000000..c0a467e6f1 --- /dev/null +++ b/addons/explosives/functions/fnc_removeFromSpeedDial.sqf @@ -0,0 +1,26 @@ +/* + * Author: Garth 'L-H' de Wet + * Removes the specified speed dial from unit's speed dial. + * + * Arguments: + * 0: Speed dial name + * + * Return Value: + * None + * + * Example: + * ["IED 1"] call ACE_explosives_fnc_removeFromSpeedDial; + * + * Public: Yes + */ +#include "script_component.hpp" +private "_speedDial"; +_speedDial = ace_player getVariable [QGVAR(SpeedDial), []]; +if (count _speedDial == 0) exitWith {}; +{ + if ((_x select 0) == (_this select 0)) exitWith { + _speedDial set [_foreachIndex, "x"]; + _speedDial = _speedDial - ["x"]; + ace_player setVariable [QGVAR(SpeedDial),_speedDial]; + }; +} foreach _speedDial; diff --git a/addons/explosives/functions/fnc_setSpeedDial.sqf b/addons/explosives/functions/fnc_setSpeedDial.sqf new file mode 100644 index 0000000000..20a32a1224 --- /dev/null +++ b/addons/explosives/functions/fnc_setSpeedDial.sqf @@ -0,0 +1,28 @@ +/* + * Author: Garth 'L-H' de Wet + * Sets the speed dial for the UI. + * + * Arguments: + * 0: Whether to increase or decrease speed dial index + * + * Return Value: + * None + * + * Example: + * [true] call ACE_explosives_fnc_setSpeedDial; // increase + * [false] call ACE_explosives_fnc_setSpeedDial; // decrease + * + * Public: No + */ + #include "script_component.hpp" +private ["_speedDial", "_amount"]; +_speedDial = ace_player getVariable [QGVAR(SpeedDial), []]; +if (count _speedDial == 0) exitWith {}; +_amount = if((_this select 0))then{1}else{-1}; + +GVAR(CurrentSpeedDial) = GVAR(CurrentSpeedDial) + _amount; +GVAR(CurrentSpeedDial) = if(GVAR(CurrentSpeedDial) < 0)then{(count _speedDial)-1}else{GVAR(CurrentSpeedDial)}; +GVAR(CurrentSpeedDial) = if(GVAR(CurrentSpeedDial) >= (count _speedDial))then{0}else{GVAR(CurrentSpeedDial)}; + +ctrlSetText [1400,(_speedDial select GVAR(CurrentSpeedDial)) select 1]; +ctrlSetText [1401,(_speedDial select GVAR(CurrentSpeedDial)) select 0]; From 4d38e19f8cd7327c16c69c372e953a3e0419833a Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Wed, 4 Feb 2015 02:19:56 +0200 Subject: [PATCH 011/166] Should avoid potential conflicts of IED codes. --- .../explosives/functions/fnc_addCellphoneIED.sqf | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/addons/explosives/functions/fnc_addCellphoneIED.sqf b/addons/explosives/functions/fnc_addCellphoneIED.sqf index 0678f56f6b..b13473cf25 100644 --- a/addons/explosives/functions/fnc_addCellphoneIED.sqf +++ b/addons/explosives/functions/fnc_addCellphoneIED.sqf @@ -29,12 +29,16 @@ _detonators = [_unit] call FUNC(getDetonators); _hasRequired = false; }; } count _requiredItems; -private ["_code", "_count"]; -_code = str(round (random 9999)); -_count = 4 - count (toArray _code); -while {_count > 0} do { - _code = "0" + _code; - _count = _count - 1; +private ["_code", "_count", "_codeSet"]; +_codeSet = false; +while {!_codeSet} do { + _code = str(round (random 9999)); + _count = 4 - count (toArray _code); + while {_count > 0} do { + _code = "0" + _code; + _count = _count - 1; + }; + _codeSet = (isNull [objNull,_code] call FUNC(getSpeedDialExplosive)); }; if (isNil QGVAR(CellphoneIEDs)) then { GVAR(CellphoneIEDs) = []; From 4c727fbff593ff126c017ea3e948e2d91736cfd0 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 3 Feb 2015 23:13:44 -0600 Subject: [PATCH 012/166] remoteFncs -> events --- addons/captives/CfgVehicles.hpp | 286 +++++++++--------- addons/captives/XEH_postInitClient.sqf | 6 + addons/captives/functions/fnc_loadCaptive.sqf | 16 +- addons/captives/functions/fnc_setCaptive.sqf | 50 +-- .../captives/functions/fnc_unloadCaptive.sqf | 11 +- .../functions/fnc_vehicleCaptiveMoveIn.sqf | 28 ++ .../functions/fnc_vehicleCaptiveMoveOut.sqf | 24 ++ 7 files changed, 238 insertions(+), 183 deletions(-) create mode 100644 addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf create mode 100644 addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 8758788b2a..dd4f6361d7 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -1,84 +1,84 @@ class CfgVehicles { - class Man; - class CAManBase: Man { - class ACE_Actions { - class ACE_SetCaptive { - displayName = "$STR_ACE_Captives_SetCaptive"; - distance = 4; - condition = QUOTE(('ACE_CableTie' in (items _player)) && {alive _target} && {!(_target getVariable ['ACE_isCaptive', false])}); - statement = QUOTE(_player removeItem 'ACE_CableTie'; [ARR_2(_target, true)] call FUNC(setCaptive);); - showDisabled = 0; - priority = 2.4; - icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); - hotkey = "C"; - }; - class ACE_ReleaseCaptive { - displayName = "$STR_ACE_Captives_ReleaseCaptive"; - distance = 4; - condition = QUOTE(_target getVariable ['ACE_isCaptive', false] && {isNull (attachedTo _target)}); - statement = QUOTE([ARR_2(_target, false)] call FUNC(setCaptive)); - exceptions[] = {"ACE_Interaction_isNotEscorting"}; - showDisabled = 0; - priority = 2.4; - icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); - hotkey = "R"; - }; - class ACE_EscortCaptive { - displayName = "$STR_ACE_Captives_EscortCaptive"; - distance = 4; - condition = QUOTE((_target getVariable ['ACE_isCaptive', false]) && {isNull (attachedTo _target)} && {alive _target} && {!(_target getVariable ['ACE_isUnconscious', false])}); - statement = QUOTE([ARR_2(_target, true)] call FUNC(escortCaptive)); - exceptions[] = {"ACE_Interaction_isNotEscorting"}; - showDisabled = 0; - icon = QUOTE(PATHTOF(UI\captive_ca.paa)); - priority = 2.3; - hotkey = "E"; - }; - class ACE_StopEscorting { - displayName = "$STR_ACE_Captives_StopEscorting"; - distance = 4; - condition = QUOTE((_target getVariable ['ACE_isCaptive', false]) && {_target in (attachedObjects _player)}); - statement = QUOTE([ARR_2(_target, false)] call FUNC(escortCaptive)); - exceptions[] = {"ACE_Interaction_isNotEscorting"}; - showDisabled = 0; - icon = QUOTE(PATHTOF(UI\captive_ca.paa)); - priority = 2.3; - hotkey = "E"; - }; - class ACE_LoadCaptive { - displayName = "$STR_ACE_Captives_LoadCaptive"; - distance = 4; - condition = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(canLoadCaptive)); - statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(loadCaptive)); - exceptions[] = {"ACE_Interaction_isNotEscorting"}; - showDisabled = 0; - icon = QUOTE(PATHTOF(UI\captive_ca.paa)); - priority = 2.2; - hotkey = "L"; - }; - class ACE_FriskPerson { - displayName = "$STR_ACE_Captives_FriskPerson"; - distance = 2; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canFriskPerson)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(openFriskMenu)); - showDisabled = 0; - //icon = ""; //@todo - priority = 3; - hotkey = "F"; - }; - }; + class Man; + class CAManBase: Man { + class ACE_Actions { + class ACE_SetCaptive { + displayName = "$STR_ACE_Captives_SetCaptive"; + distance = 4; + condition = QUOTE(('ACE_CableTie' in (items _player)) && {alive _target} && {!(_target getVariable ['ACE_isCaptive', false])}); + statement = QUOTE(_player removeItem 'ACE_CableTie'; [ARR_3(QGVAR(SetCaptive), [_target], [ARR_2(_target, true)])] call EFUNC(common,targetEvent);); + showDisabled = 0; + priority = 2.4; + icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); + hotkey = "C"; + }; + class ACE_ReleaseCaptive { + displayName = "$STR_ACE_Captives_ReleaseCaptive"; + distance = 4; + condition = QUOTE(_target getVariable ['ACE_isCaptive', false] && {isNull (attachedTo _target)}); + statement = QUOTE([ARR_2(_target, false)] call FUNC(setCaptive)); + exceptions[] = {"ACE_Interaction_isNotEscorting"}; + showDisabled = 0; + priority = 2.4; + icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); + hotkey = "R"; + }; + class ACE_EscortCaptive { + displayName = "$STR_ACE_Captives_EscortCaptive"; + distance = 4; + condition = QUOTE((_target getVariable ['ACE_isCaptive', false]) && {isNull (attachedTo _target)} && {alive _target} && {!(_target getVariable ['ACE_isUnconscious', false])}); + statement = QUOTE([ARR_2(_target, true)] call FUNC(escortCaptive)); + exceptions[] = {"ACE_Interaction_isNotEscorting"}; + showDisabled = 0; + icon = QUOTE(PATHTOF(UI\captive_ca.paa)); + priority = 2.3; + hotkey = "E"; + }; + class ACE_StopEscorting { + displayName = "$STR_ACE_Captives_StopEscorting"; + distance = 4; + condition = QUOTE((_target getVariable ['ACE_isCaptive', false]) && {_target in (attachedObjects _player)}); + statement = QUOTE([ARR_2(_target, false)] call FUNC(escortCaptive)); + exceptions[] = {"ACE_Interaction_isNotEscorting"}; + showDisabled = 0; + icon = QUOTE(PATHTOF(UI\captive_ca.paa)); + priority = 2.3; + hotkey = "E"; + }; + class ACE_LoadCaptive { + displayName = "$STR_ACE_Captives_LoadCaptive"; + distance = 4; + condition = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(canLoadCaptive)); + statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(loadCaptive)); + exceptions[] = {"ACE_Interaction_isNotEscorting"}; + showDisabled = 0; + icon = QUOTE(PATHTOF(UI\captive_ca.paa)); + priority = 2.2; + hotkey = "L"; + }; + class ACE_FriskPerson { + displayName = "$STR_ACE_Captives_FriskPerson"; + distance = 2; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canFriskPerson)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(openFriskMenu)); + showDisabled = 0; + //icon = ""; //@todo + priority = 3; + hotkey = "F"; + }; + }; - class ACE_SelfActions { - class ACE_StopEscortingSelf { - displayName = "$STR_ACE_Captives_StopEscorting"; - condition = QUOTE(((_player getVariable ['ACE_escortedUnit', objNull]) getVariable ['ACE_isCaptive', false]) && {(_player getVariable ['ACE_escortedUnit', objNull]) in attachedObjects _player}); - statement = QUOTE([ARR_2((_player getVariable ['ACE_escortedUnit', objNull]), false)] call FUNC(_escortCaptive);); - exceptions[] = {"ACE_Interaction_isNotEscorting"}; - showDisabled = 0; - priority = 2.3; - hotkey = "C"; - }; - /*class ACE_LoadCaptiveSelf { + class ACE_SelfActions { + class ACE_StopEscortingSelf { + displayName = "$STR_ACE_Captives_StopEscorting"; + condition = QUOTE(((_player getVariable ['ACE_escortedUnit', objNull]) getVariable ['ACE_isCaptive', false]) && {(_player getVariable ['ACE_escortedUnit', objNull]) in attachedObjects _player}); + statement = QUOTE([ARR_2((_player getVariable ['ACE_escortedUnit', objNull]), false)] call FUNC(_escortCaptive);); + exceptions[] = {"ACE_Interaction_isNotEscorting"}; + showDisabled = 0; + priority = 2.3; + hotkey = "C"; + }; + /*class ACE_LoadCaptiveSelf { displayName = "$STR_ACE_Captives_LoadCaptive"; condition = "[_player, objNull, objNull] call ACE_Captives_fnc_canLoadCaptiveIntoVehicle"; statement = "[_player, objNull, objNull] call ACE_Captives_fnc_loadCaptiveIntoVehicle"; @@ -86,72 +86,72 @@ class CfgVehicles { showDisabled = 0; priority = 2.2; hotkey = "K"; - };*/ - }; - }; - - #define MACRO_LOADUNLOADCAPTIVE \ - class ACE_Actions { \ - class ACE_LoadCaptive { \ - displayName = "$STR_ACE_Captives_LoadCaptive"; \ - distance = 4; \ - condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \ - statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(loadCaptive)); \ - exceptions[] = {"ACE_Interaction_isNotEscorting"}; \ - showDisabled = 0; \ - priority = 1.2; \ - hotkey = "L"; \ - }; \ - class ACE_UnloadCaptive { \ - displayName = "$STR_ACE_Captives_UnloadCaptive"; \ - distance = 4; \ - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive)); \ - statement = QUOTE([ARR_2(_player, _target)] call FUNC(unloadCaptive)); \ - showDisabled = 0; \ - priority = 1.2; \ - hotkey = "C"; \ - }; \ + };*/ + }; }; - class LandVehicle; - class Car: LandVehicle { - MACRO_LOADUNLOADCAPTIVE - }; - class Tank: LandVehicle { - MACRO_LOADUNLOADCAPTIVE - }; +#define MACRO_LOADUNLOADCAPTIVE \ + class ACE_Actions { \ + class ACE_LoadCaptive { \ + displayName = "$STR_ACE_Captives_LoadCaptive"; \ + distance = 4; \ + condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \ + statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(loadCaptive)); \ + exceptions[] = {"ACE_Interaction_isNotEscorting"}; \ + showDisabled = 0; \ + priority = 1.2; \ + hotkey = "L"; \ + }; \ + class ACE_UnloadCaptive { \ + displayName = "$STR_ACE_Captives_UnloadCaptive"; \ + distance = 4; \ + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive)); \ + statement = QUOTE([ARR_2(_player, _target)] call FUNC(unloadCaptive)); \ + showDisabled = 0; \ + priority = 1.2; \ + hotkey = "C"; \ + }; \ + }; - class Air; - class Helicopter: Air { - MACRO_LOADUNLOADCAPTIVE - }; - class Plane: Air { - MACRO_LOADUNLOADCAPTIVE - }; - - class Ship; - class Ship_F: Ship { - MACRO_LOADUNLOADCAPTIVE - }; - - class StaticWeapon: LandVehicle { - MACRO_LOADUNLOADCAPTIVE - }; - - class StaticMortar; - class Mortar_01_base_F: StaticMortar { - MACRO_LOADUNLOADCAPTIVE - }; - - #define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ - name = #ITEM; \ - count = COUNT; \ - }; - - class Box_NATO_Support_F; - class ACE_Box_Misc: Box_NATO_Support_F { - class TransportItems { - MACRO_ADDITEM(ACE_CableTie,12) + class LandVehicle; + class Car: LandVehicle { + MACRO_LOADUNLOADCAPTIVE + }; + class Tank: LandVehicle { + MACRO_LOADUNLOADCAPTIVE + }; + + class Air; + class Helicopter: Air { + MACRO_LOADUNLOADCAPTIVE + }; + class Plane: Air { + MACRO_LOADUNLOADCAPTIVE + }; + + class Ship; + class Ship_F: Ship { + MACRO_LOADUNLOADCAPTIVE + }; + + class StaticWeapon: LandVehicle { + MACRO_LOADUNLOADCAPTIVE + }; + + class StaticMortar; + class Mortar_01_base_F: StaticMortar { + MACRO_LOADUNLOADCAPTIVE + }; + +#define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ + name = #ITEM; \ + count = COUNT; \ + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_CableTie,12) + }; }; - }; }; diff --git a/addons/captives/XEH_postInitClient.sqf b/addons/captives/XEH_postInitClient.sqf index a08c5d4239..a461b36aeb 100644 --- a/addons/captives/XEH_postInitClient.sqf +++ b/addons/captives/XEH_postInitClient.sqf @@ -1,3 +1,9 @@ // by commy2 [missionNamespace, "playerChanged", {_this call ACE_Captives_fnc_handlePlayerChanged}] call ACE_Core_fnc_addCustomEventhandler; + + + +[QGVAR(MoveIn), {_this call FUNC(vehicleCaptiveMoveIn)}] call EFUNC(common,addEventHandler); +[QGVAR(MoveOut), {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); +[QGVAR(SetCaptive), {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); diff --git a/addons/captives/functions/fnc_loadCaptive.sqf b/addons/captives/functions/fnc_loadCaptive.sqf index f2b1a9a0c1..2648255c3b 100644 --- a/addons/captives/functions/fnc_loadCaptive.sqf +++ b/addons/captives/functions/fnc_loadCaptive.sqf @@ -20,17 +20,17 @@ PARAMS_1(_unit,_target,_vehicle); if (isNull _target) then { - // _objects = attachedObjects _unit; - // _objects = [_objects, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); - // _target = _objects select 0; + _objects = attachedObjects _unit; + _objects = [_objects, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); + _target = _objects select 0; }; if (isNull _vehicle) then { - _objects = nearestObjects [_unit, ["Car_F", "Tank_F", "Helicopter_F", "Boat_F", "Plane_F"], 10]; - _vehicle = _objects select 0; + _objects = nearestObjects [_unit, ["Car_F", "Tank_F", "Helicopter_F", "Boat_F", "Plane_F"], 10]; + _vehicle = _objects select 0; }; -if (!isNil "_target" && {!isNil "_vehicle"}) then { - _unit setVariable ["ACE_isEscorting", false]; - [[_target, _vehicle], "{(_this select 0) moveInCargo (_this select 1); (_this select 0) assignAsCargo (_this select 1); (_this select 0) setVariable ['ACE_Captives_CargoIndex', (_this select 1) getCargoIndex (_this select 0), true];}", _target] call ACE_Core_fnc_execRemoteFnc; +if ((!isNil "_target") && {!isNil "_vehicle"}) then { + _unit setVariable ["ACE_isEscorting", false]; + [QGVAR(MoveIn), [_target], [_target, _vehicle]] call EFUNC(common,targetEvent); }; diff --git a/addons/captives/functions/fnc_setCaptive.sqf b/addons/captives/functions/fnc_setCaptive.sqf index 38ce997a88..b4c047dd1b 100644 --- a/addons/captives/functions/fnc_setCaptive.sqf +++ b/addons/captives/functions/fnc_setCaptive.sqf @@ -21,39 +21,39 @@ PARAMS_2(_unit,_state); if (!local _unit) exitWith {[[_unit, _state, true], _fnc_scriptName, _unit] call ACE_Core_fnc_execRemoteFnc}; if (_state) then { - if (_unit getVariable ["ACE_isCaptive", false]) exitWith {}; + if (_unit getVariable ["ACE_isCaptive", false]) exitWith {}; - _unit setVariable ["ACE_isCaptive", true, true]; + _unit setVariable ["ACE_isCaptive", true, true]; - // fix anim on mission start (should work on dedicated servers) - _unit spawn { - [_this, "ACE_Handcuffed", true] call ACE_Core_fnc_setCaptivityStatus; + // fix anim on mission start (should work on dedicated servers) + _unit spawn { + [_this, "ACE_Handcuffed", true] call ACE_Core_fnc_setCaptivityStatus; - if (_this getVariable ["ACE_isCaptive", false] && {vehicle _this == _this}) then { - [_this] call EFUNC(common,fixLoweredRifleAnimation); - [_this, "ACE_AmovPercMstpScapWnonDnon", 0] spawn EFUNC(common,doAnimation); + if (_this getVariable ["ACE_isCaptive", false] && {vehicle _this == _this}) then { + [_this] call EFUNC(common,fixLoweredRifleAnimation); + [_this, "ACE_AmovPercMstpScapWnonDnon", 0] spawn EFUNC(common,doAnimation); + }; }; - }; - _unit setVariable ["ACE_Captives_CargoIndex", vehicle _unit getCargoIndex _unit, true]; + _unit setVariable ["ACE_Captives_CargoIndex", vehicle _unit getCargoIndex _unit, true]; - if (_unit == ACE_player) then { - showHUD false; - }; + if (_unit == ACE_player) then { + showHUD false; + }; } else { - if !(_unit getVariable ["ACE_isCaptive", false]) exitWith {}; + if !(_unit getVariable ["ACE_isCaptive", false]) exitWith {}; - _unit setVariable ["ACE_isCaptive", false, true]; - [_unit, "ACE_Handcuffed", false] call ACE_Core_fnc_setCaptivityStatus; - if (vehicle _unit == _unit) then { - [_unit, "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); - }; + _unit setVariable ["ACE_isCaptive", false, true]; + [_unit, "ACE_Handcuffed", false] call ACE_Core_fnc_setCaptivityStatus; + if (vehicle _unit == _unit) then { + [_unit, "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + }; - if (_unit getVariable ["ACE_Captives_CargoIndex", -1] != -1) then { - _unit setVariable ["ACE_Captives_CargoIndex", -1, true]; - }; + if (_unit getVariable ["ACE_Captives_CargoIndex", -1] != -1) then { + _unit setVariable ["ACE_Captives_CargoIndex", -1, true]; + }; - if (_unit == ACE_player) then { - showHUD true; - }; + if (_unit == ACE_player) then { + showHUD true; + }; }; diff --git a/addons/captives/functions/fnc_unloadCaptive.sqf b/addons/captives/functions/fnc_unloadCaptive.sqf index e6eb4b24a5..2ede9de480 100644 --- a/addons/captives/functions/fnc_unloadCaptive.sqf +++ b/addons/captives/functions/fnc_unloadCaptive.sqf @@ -24,12 +24,9 @@ _cargo = crew _vehicle; // Can also unload from driver, gunner, commander, turr _cargo = [_cargo, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); -if (count _cargo > 0) then { +if ((count _cargo) > 0) then { _target = _cargo select 0; - - _target setVariable ["ACE_Captives_CargoIndex", -1, true]; - - moveOut _target; - [_target, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); - [_target, "{unassignVehicle _this}", _target] call ACE_Core_fnc_execRemoteFnc; + [QGVAR(MoveOut), [_target], [_target]] call EFUNC(common,targetEvent); +} else { + ERROR("No captive to unload"); }; diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf new file mode 100644 index 0000000000..1eb1c2ef2b --- /dev/null +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf @@ -0,0 +1,28 @@ +/* + * Author: PabstMirror + * Loads a captive into a vehicle + * + * Arguments: + * 0: The Captive + * 1: The Vehicle + * + * Return Value: + * Nothing + * + * Example: + * TODO + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_target,_vehicle); + +private ["_cargoIndex"]; + +_target moveInCargo _vehicle; +_target assignAsCargo _vehicle; +_cargoIndex = _vehicle getCargoIndex _target; +_target setVariable ["ACE_Captives_CargoIndex", _cargoIndex, true]; + +TRACE_3("moveinEH",_target,_vehicle,_cargoIndex); diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf new file mode 100644 index 0000000000..0a10572909 --- /dev/null +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf @@ -0,0 +1,24 @@ +/* + * Author: PabstMirror + * Unloads a captive from a vehicle. + * + * Arguments: + * 0: Captive Unit being unloaded + * + * Return Value: + * Nothing + * + * Example: + * TODO + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_unit); + +_unit setVariable ["ACE_Captives_CargoIndex", -1, true]; + +moveOut _unit; +[_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); +unassignVehicle _unit; \ No newline at end of file From 24ab11a1e2740d724d6626c6ba7497dc780d72d5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 3 Feb 2015 23:56:51 -0600 Subject: [PATCH 013/166] More work --- addons/captives/CfgMoves.hpp | 110 +++++++++--------- addons/captives/CfgVehicles.hpp | 16 +-- addons/captives/CfgWeapons.hpp | 22 ++-- addons/captives/README.md | 14 +++ addons/captives/XEH_postInitClient.sqf | 18 ++- addons/captives/XEH_preInit.sqf | 2 + .../functions/fnc_handlePlayerChanged.sqf | 4 +- .../captives/functions/fnc_handleWokeUp.sqf | 4 +- addons/captives/functions/fnc_initPost.sqf | 4 +- addons/captives/functions/fnc_initUnit.sqf | 9 +- addons/captives/functions/fnc_loadCaptive.sqf | 4 +- .../captives/functions/fnc_openFriskMenu.sqf | 28 ++--- addons/captives/functions/fnc_surrender.sqf | 62 +++++----- .../captives/functions/fnc_unloadCaptive.sqf | 2 +- .../functions/fnc_vehicleCaptiveMoveIn.sqf | 4 +- 15 files changed, 161 insertions(+), 142 deletions(-) create mode 100644 addons/captives/README.md diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp index da43b21aae..ab379de6ae 100644 --- a/addons/captives/CfgMoves.hpp +++ b/addons/captives/CfgMoves.hpp @@ -1,90 +1,90 @@ class CfgMovesBasic { - class Actions { - class CivilStandActions; - class ACE_CivilStandCaptiveActions: CivilStandActions { - turnL = ""; - turnR = ""; - stop = "ACE_AmovPercMstpScapWnonDnon"; - StopRelaxed = "ACE_AmovPercMstpScapWnonDnon"; - default = "ACE_AmovPercMstpScapWnonDnon"; - getOver = ""; - throwPrepare = ""; - throwGrenade[] = {"","Gesture"}; + class Actions { + class CivilStandActions; + class ACE_CivilStandCaptiveActions: CivilStandActions { + turnL = ""; + turnR = ""; + stop = "ACE_AmovPercMstpScapWnonDnon"; + StopRelaxed = "ACE_AmovPercMstpScapWnonDnon"; + default = "ACE_AmovPercMstpScapWnonDnon"; + getOver = ""; + throwPrepare = ""; + throwGrenade[] = {"","Gesture"}; + }; }; - }; }; class CfgMovesMaleSdr: CfgMovesBasic { - class StandBase; - class States { - class AmovPercMstpSnonWnonDnon: StandBase { - ConnectTo[] += {"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1}; - }; + class StandBase; + class States { + class AmovPercMstpSnonWnonDnon: StandBase { + ConnectTo[] += {"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1}; + }; - class CutSceneAnimationBase; - class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon: CutSceneAnimationBase { - actions = "ACE_CivilStandCaptiveActions"; - file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_EaseIn"; - speed = 1; - looped = 0; - interpolationRestart = 2; - ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon",0.1}; - InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; - }; + class CutSceneAnimationBase; + class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon: CutSceneAnimationBase { + actions = "ACE_CivilStandCaptiveActions"; + file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_EaseIn"; + speed = 1; + looped = 0; + interpolationRestart = 2; + ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon",0.1}; + InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; + }; - class ACE_AmovPercMstpScapWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon { - file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_Ease"; - speed = 0; - ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; - InterpolateTo[] = {"Unconscious",0.01}; - looped = 1; - }; + class ACE_AmovPercMstpScapWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon { + file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_Ease"; + speed = 0; + ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; + InterpolateTo[] = {"Unconscious",0.01}; + looped = 1; + }; - 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}; + 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}; + }; }; - }; }; /* player playMove "ACE_AmovPercMstpScapWnonDnon"; player switchMove "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon"; -*/ + */ /*class CfgMovesBasic; class CfgMovesMaleSdr: CfgMovesBasic { - class States { +class States { class CutSceneAnimationBase; class AmovPercMstpSnonWnonDnon_EaseIn: CutSceneAnimationBase { - head = "headDefault"; - static = 1; - disableWeapons = 0; - forceAim = 0; - InterpolateTo[] = {"AmovPercMstpSnonWnonDnon_EaseOut",0.02,"Unconscious",0.1}; + head = "headDefault"; + static = 1; + disableWeapons = 0; + forceAim = 0; + InterpolateTo[] = {"AmovPercMstpSnonWnonDnon_EaseOut",0.02,"Unconscious",0.1}; }; class AmovPercMstpSnonWnonDnon_Ease: AmovPercMstpSnonWnonDnon_EaseIn { - looped = 1; - InterpolateTo[] = {"Unconscious",0.1}; + looped = 1; + InterpolateTo[] = {"Unconscious",0.1}; }; class AmovPercMstpSnonWnonDnon_EaseOut: AmovPercMstpSnonWnonDnon_EaseIn { - InterpolateTo[] = {"AmovPercMstpSnonWnonDnon_EaseIn",0.02,"Unconscious",0.1}; + InterpolateTo[] = {"AmovPercMstpSnonWnonDnon_EaseIn",0.02,"Unconscious",0.1}; }; class AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon: CutSceneAnimationBase { - InterpolateTo[] = {"Unconscious",0.01,"AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; + InterpolateTo[] = {"Unconscious",0.01,"AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; }; class AmovPercMstpSsurWnonDnon: AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { - looped = 1; - InterpolateTo[] = {"Unconscious",0.01}; + looped = 1; + InterpolateTo[] = {"Unconscious",0.01}; }; class AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { - InterpolateTo[] = {"Unconscious",0.01,"AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon",0.1}; + InterpolateTo[] = {"Unconscious",0.01,"AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon",0.1}; }; - }; +}; };*/ diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index dd4f6361d7..04b8d4569f 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -5,8 +5,8 @@ class CfgVehicles { class ACE_SetCaptive { displayName = "$STR_ACE_Captives_SetCaptive"; distance = 4; - condition = QUOTE(('ACE_CableTie' in (items _player)) && {alive _target} && {!(_target getVariable ['ACE_isCaptive', false])}); - statement = QUOTE(_player removeItem 'ACE_CableTie'; [ARR_3(QGVAR(SetCaptive), [_target], [ARR_2(_target, true)])] call EFUNC(common,targetEvent);); + condition = QUOTE(('ACE_CableTie' in (items _player)) && {alive _target} && {!(_target getVariable [ARR_2('ACE_isCaptive', false)])}); + statement = QUOTE(_player removeItem 'ACE_CableTie'; [ARR_3('SetCaptive', [_target], [ARR_2(_target, true)])] call EFUNC(common,targetEvent);); showDisabled = 0; priority = 2.4; icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); @@ -15,8 +15,8 @@ class CfgVehicles { class ACE_ReleaseCaptive { displayName = "$STR_ACE_Captives_ReleaseCaptive"; distance = 4; - condition = QUOTE(_target getVariable ['ACE_isCaptive', false] && {isNull (attachedTo _target)}); - statement = QUOTE([ARR_2(_target, false)] call FUNC(setCaptive)); + condition = QUOTE(_target getVariable [ARR_2('ACE_isCaptive', false)] && {isNull (attachedTo _target)}); + statement = QUOTE([ARR_3('SetCaptive', [_target], [ARR_2(_target, false)])] call EFUNC(common,targetEvent);); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; priority = 2.4; @@ -26,7 +26,7 @@ class CfgVehicles { class ACE_EscortCaptive { displayName = "$STR_ACE_Captives_EscortCaptive"; distance = 4; - condition = QUOTE((_target getVariable ['ACE_isCaptive', false]) && {isNull (attachedTo _target)} && {alive _target} && {!(_target getVariable ['ACE_isUnconscious', false])}); + condition = QUOTE((_target getVariable [ARR_2('ACE_isCaptive', false)]) && {isNull (attachedTo _target)} && {alive _target} && {!(_target getVariable [ARR_2('ACE_isUnconscious', false)])}); statement = QUOTE([ARR_2(_target, true)] call FUNC(escortCaptive)); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; @@ -37,7 +37,7 @@ class CfgVehicles { class ACE_StopEscorting { displayName = "$STR_ACE_Captives_StopEscorting"; distance = 4; - condition = QUOTE((_target getVariable ['ACE_isCaptive', false]) && {_target in (attachedObjects _player)}); + condition = QUOTE((_target getVariable [ARR_2('ACE_isCaptive', false)]) && {_target in (attachedObjects _player)}); statement = QUOTE([ARR_2(_target, false)] call FUNC(escortCaptive)); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; @@ -71,8 +71,8 @@ class CfgVehicles { class ACE_SelfActions { class ACE_StopEscortingSelf { displayName = "$STR_ACE_Captives_StopEscorting"; - condition = QUOTE(((_player getVariable ['ACE_escortedUnit', objNull]) getVariable ['ACE_isCaptive', false]) && {(_player getVariable ['ACE_escortedUnit', objNull]) in attachedObjects _player}); - statement = QUOTE([ARR_2((_player getVariable ['ACE_escortedUnit', objNull]), false)] call FUNC(_escortCaptive);); + condition = QUOTE(((_player getVariable [ARR_2('ACE_escortedUnit', objNull)]) getVariable ['ACE_isCaptive', false]) && {(_player getVariable [ARR_2('ACE_escortedUnit', objNull)]) in attachedObjects _player}); + statement = QUOTE([ARR_2((_player getVariable [ARR_2('ACE_escortedUnit', objNull)]), false)] call FUNC(_escortCaptive);); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; priority = 2.3; diff --git a/addons/captives/CfgWeapons.hpp b/addons/captives/CfgWeapons.hpp index 3005a2fa5c..be2149ca88 100644 --- a/addons/captives/CfgWeapons.hpp +++ b/addons/captives/CfgWeapons.hpp @@ -1,15 +1,15 @@ class CfgWeapons { - class ACE_ItemCore; - class InventoryItem_Base_F; + class ACE_ItemCore; + class InventoryItem_Base_F; - class ACE_CableTie: ACE_ItemCore { - displayName = "$STR_ACE_Captives_CableTie"; - descriptionShort = "$STR_ACE_Captives_CableTieDescription"; - model = QUOTE(PATHTOF(models\ace_cabletie.p3d)); - picture = QUOTE(PATHTOF(UI\ace_cabletie_ca.paa)); - scope = 2; - class ItemInfo: InventoryItem_Base_F { - mass = 1; + class ACE_CableTie: ACE_ItemCore { + displayName = "$STR_ACE_Captives_CableTie"; + descriptionShort = "$STR_ACE_Captives_CableTieDescription"; + model = QUOTE(PATHTOF(models\ace_cabletie.p3d)); + picture = QUOTE(PATHTOF(UI\ace_cabletie_ca.paa)); + scope = 2; + class ItemInfo: InventoryItem_Base_F { + mass = 1; + }; }; - }; }; diff --git a/addons/captives/README.md b/addons/captives/README.md new file mode 100644 index 0000000000..3938720f08 --- /dev/null +++ b/addons/captives/README.md @@ -0,0 +1,14 @@ +ace_captives +============ + +Allows taking people captive/handcuffed + +####Items: +`ACE_CableTie` - adds ability to take someone captive + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [PabstMirror](https://github.com/PabstMirror) diff --git a/addons/captives/XEH_postInitClient.sqf b/addons/captives/XEH_postInitClient.sqf index a461b36aeb..ccec1d39d2 100644 --- a/addons/captives/XEH_postInitClient.sqf +++ b/addons/captives/XEH_postInitClient.sqf @@ -1,9 +1,19 @@ -// by commy2 +#include "script_component.hpp" [missionNamespace, "playerChanged", {_this call ACE_Captives_fnc_handlePlayerChanged}] call ACE_Core_fnc_addCustomEventhandler; -[QGVAR(MoveIn), {_this call FUNC(vehicleCaptiveMoveIn)}] call EFUNC(common,addEventHandler); -[QGVAR(MoveOut), {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); -[QGVAR(SetCaptive), {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); +["MoveInCaptive", {_this call FUNC(vehicleCaptiveMoveIn)}] call EFUNC(common,addEventHandler); +["MoveOutCaptive", {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); +["SetCaptive", {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); + +//TODO: Medical Integration Events??? + +// [_unit, "knockedOut", { + // if (local (_this select 0)) then {_this call ACE_Captives_fnc_handleKnockedOut}; +// }] call ACE_Core_fnc_addCustomEventhandler; + +// [_unit, "wokeUp", { + // if (local (_this select 0)) then {_this call ACE_Captives_fnc_handleWokeUp}; +// }] call ACE_Core_fnc_addCustomEventhandler; diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 7f83ce4fad..505d57051e 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -17,5 +17,7 @@ PREP(openFriskMenu); PREP(setCaptive); PREP(surrender); PREP(unloadCaptive); +PREP(vehicleCaptiveMoveIn); +PREP(vehicleCaptiveMoveOut); ADDON = true; diff --git a/addons/captives/functions/fnc_handlePlayerChanged.sqf b/addons/captives/functions/fnc_handlePlayerChanged.sqf index fea03cfe16..f23e380dd3 100644 --- a/addons/captives/functions/fnc_handlePlayerChanged.sqf +++ b/addons/captives/functions/fnc_handlePlayerChanged.sqf @@ -19,7 +19,7 @@ PARAMS_2(_unit,_oldUnit); if (_unit getVariable ["ACE_isCaptive", false]) then { - showHUD false; + showHUD false; } else { - showHUD true; + showHUD true; }; diff --git a/addons/captives/functions/fnc_handleWokeUp.sqf b/addons/captives/functions/fnc_handleWokeUp.sqf index cbcd2a07ae..ea6a1bcb26 100644 --- a/addons/captives/functions/fnc_handleWokeUp.sqf +++ b/addons/captives/functions/fnc_handleWokeUp.sqf @@ -18,6 +18,6 @@ PARAMS_1(_unit); if (_unit getVariable ["ACE_isCaptive", false] && {vehicle _unit == _unit}) then { - [_unit] call EFUNC(common,fixLoweredRifleAnimation); - [_unit, "ACE_AmovPercMstpScapWnonDnon", 0] call EFUNC(common,doAnimation); + [_unit] call EFUNC(common,fixLoweredRifleAnimation); + [_unit, "ACE_AmovPercMstpScapWnonDnon", 0] call EFUNC(common,doAnimation); }; diff --git a/addons/captives/functions/fnc_initPost.sqf b/addons/captives/functions/fnc_initPost.sqf index 5c116be417..8e777a9717 100644 --- a/addons/captives/functions/fnc_initPost.sqf +++ b/addons/captives/functions/fnc_initPost.sqf @@ -19,6 +19,6 @@ PARAMS_1(_unit); // reset status on mission start if (_unit getVariable ["ACE_isCaptive", false]) then { - _unit setVariable ["ACE_isCaptive", false]; - [_unit, true] call ACE_Captives_fnc_setCaptive; + _unit setVariable ["ACE_isCaptive", false]; + [_unit, true] call ACE_Captives_fnc_setCaptive; }; diff --git a/addons/captives/functions/fnc_initUnit.sqf b/addons/captives/functions/fnc_initUnit.sqf index 13777dca1d..df9356ff2a 100644 --- a/addons/captives/functions/fnc_initUnit.sqf +++ b/addons/captives/functions/fnc_initUnit.sqf @@ -17,13 +17,6 @@ PARAMS_1(_unit); -[_unit, "knockedOut", { - if (local (_this select 0)) then {_this call ACE_Captives_fnc_handleKnockedOut}; -}] call ACE_Core_fnc_addCustomEventhandler; - -[_unit, "wokeUp", { - if (local (_this select 0)) then {_this call ACE_Captives_fnc_handleWokeUp}; -}] call ACE_Core_fnc_addCustomEventhandler; // prevent players from throwing grenades -[_unit, "Throw", {(_this select 1) getVariable ["ACE_isCaptive", false]}, {}] call ACE_Core_fnc_addActionEventhandler; +[_unit, "Throw", {(_this select 1) getVariable ["ACE_isCaptive", false]}, {}] call EFUNC(common,addActionEventhandler); diff --git a/addons/captives/functions/fnc_loadCaptive.sqf b/addons/captives/functions/fnc_loadCaptive.sqf index 2648255c3b..05f87a20c6 100644 --- a/addons/captives/functions/fnc_loadCaptive.sqf +++ b/addons/captives/functions/fnc_loadCaptive.sqf @@ -17,7 +17,7 @@ */ #include "script_component.hpp" -PARAMS_1(_unit,_target,_vehicle); +PARAMS_3(_unit,_target,_vehicle); if (isNull _target) then { _objects = attachedObjects _unit; @@ -32,5 +32,5 @@ if (isNull _vehicle) then { if ((!isNil "_target") && {!isNil "_vehicle"}) then { _unit setVariable ["ACE_isEscorting", false]; - [QGVAR(MoveIn), [_target], [_target, _vehicle]] call EFUNC(common,targetEvent); + ["MoveInCaptive", [_target], [_target, _vehicle]] call EFUNC(common,targetEvent); }; diff --git a/addons/captives/functions/fnc_openFriskMenu.sqf b/addons/captives/functions/fnc_openFriskMenu.sqf index 42dda4ab66..d69dbd045c 100644 --- a/addons/captives/functions/fnc_openFriskMenu.sqf +++ b/addons/captives/functions/fnc_openFriskMenu.sqf @@ -22,7 +22,7 @@ PARAMS_2(_player,_unit); _weapon = currentWeapon _player; if (_weapon == primaryWeapon _player && {_weapon != ""}) then { - [_player, "AmovPercMstpSlowWrflDnon", 0] call EFUNC(common,doAnimation); + [_player, "AmovPercMstpSlowWrflDnon", 0] call EFUNC(common,doAnimation); }; _listedItemClasses = []; @@ -32,19 +32,19 @@ _actions = [localize "STR_ACE_Captives_FriskMenuHeader", localize "STR_ACE_Capti _allGear = []; if ((handgunWeapon _unit) != "") then { - _allGear pushBack (handgunWeapon _unit); + _allGear pushBack (handgunWeapon _unit); }; if (count (uniformItems _unit) > 0) then { - _allGear = _allGear + (uniformItems _unit); + _allGear = _allGear + (uniformItems _unit); }; if (count (vestItems _unit) > 0) then { - _allGear = _allGear + (vestItems _unit); + _allGear = _allGear + (vestItems _unit); }; if (count (backpackItems _unit) > 0) then { - _allGear = _allGear + (backpackItems _unit); + _allGear = _allGear + (backpackItems _unit); }; if (count (assignedItems _unit) > 0) then { - _allGear = _allGear + (assignedItems _unit); + _allGear = _allGear + (assignedItems _unit); }; // Handgun @@ -53,15 +53,15 @@ if (count (assignedItems _unit) > 0) then { // Backpack Items // Assigned Items { - if (!(_x in _listedItemClasses)) then { - private "_item"; - _item = configFile >> "CfgMagazines" >> _x; - if (isNil "_item" || str _item == "") then { //str _item ? - _item = configFile >> "CfgWeapons" >> _x; + if (!(_x in _listedItemClasses)) then { + private "_item"; + _item = configFile >> "CfgMagazines" >> _x; + if (isNil "_item" || str _item == "") then { //str _item ? + _item = configFile >> "CfgWeapons" >> _x; + }; + _actions = [_actions, getText(_item >> "displayName"), getText(_item >> "picture"), _x] call ACE_Interaction_fnc_addSelectableItem; + _listedItemClasses pushBack _x; }; - _actions = [_actions, getText(_item >> "displayName"), getText(_item >> "picture"), _x] call ACE_Interaction_fnc_addSelectableItem; - _listedItemClasses pushBack _x; - }; } forEach (_allGear); [_actions, {call ACE_Interaction_fnc_hideMenu;}, {call ACE_Interaction_fnc_hideMenu;}] call ACE_Interaction_fnc_openSelectMenu; diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index b308775040..92f0ea416a 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -21,43 +21,43 @@ PARAMS_2(_unit,_state); if (!local _unit) exitWith {[_this, _fnc_scriptName, _unit] call ACE_Core_fnc_execRemoteFnc}; if (_state) then { - if (_unit getVariable ["ACE_isSurrender", false]) exitWith {}; + if (_unit getVariable ["ACE_isSurrender", false]) exitWith {}; - _unit setVariable ["ACE_isSurrender", true, true]; - [_unit, "ACE_Surrendered", true] call ACE_Core_fnc_setCaptivityStatus; + _unit setVariable ["ACE_isSurrender", true, true]; + [_unit, "ACE_Surrendered", true] call ACE_Core_fnc_setCaptivityStatus; - _unit spawn { - // fix for lowered rifle animation glitch - if (currentWeapon _this != "" && {currentWeapon _this == primaryWeapon _this} && {weaponLowered _this} && {stance _this == "STAND"}) then { - _this playMove "amovpercmstpsraswrfldnon"; + _unit spawn { + // fix for lowered rifle animation glitch + if (currentWeapon _this != "" && {currentWeapon _this == primaryWeapon _this} && {weaponLowered _this} && {stance _this == "STAND"}) then { + _this playMove "amovpercmstpsraswrfldnon"; + }; + + while {_this getVariable ["ACE_isSurrender", false]} do { + sleep 0.001; //sleep in UI + + if (isPlayer _this) then {showHUD false}; + + if (!alive _this || {_this getVariable ["ACE_isUnconscious", false]}) then { + _this setVariable ["ACE_isSurrender", false, true]; + } else { + _this playMove "amovpercmstpsnonwnondnon_amovpercmstpssurwnondnon"; + }; + }; + if !(_this getVariable ["ACE_isUnconscious", false]) then { + _this playMoveNow "AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon"; + } else { + _this playMoveNow "unconscious"; + }; + + [_this, "ACE_Surrendered", false] call ACE_Core_fnc_setCaptivityStatus; + + if (isPlayer _this) then {showHUD true}; }; - - while {_this getVariable ["ACE_isSurrender", false]} do { - sleep 0.001; //sleep in UI - - if (isPlayer _this) then {showHUD false}; - - if (!alive _this || {_this getVariable ["ACE_isUnconscious", false]}) then { - _this setVariable ["ACE_isSurrender", false, true]; - } else { - _this playMove "amovpercmstpsnonwnondnon_amovpercmstpssurwnondnon"; - }; - }; - if !(_this getVariable ["ACE_isUnconscious", false]) then { - _this playMoveNow "AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon"; - } else { - _this playMoveNow "unconscious"; - }; - - [_this, "ACE_Surrendered", false] call ACE_Core_fnc_setCaptivityStatus; - - if (isPlayer _this) then {showHUD true}; - }; } else { - _unit setVariable ["ACE_isSurrender", false, true]; + _unit setVariable ["ACE_isSurrender", false, true]; }; /* player playMove "AmovPercMstpSsurWnonDnon" player switchMove "AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon" -*/ + */ diff --git a/addons/captives/functions/fnc_unloadCaptive.sqf b/addons/captives/functions/fnc_unloadCaptive.sqf index 2ede9de480..057b825d12 100644 --- a/addons/captives/functions/fnc_unloadCaptive.sqf +++ b/addons/captives/functions/fnc_unloadCaptive.sqf @@ -26,7 +26,7 @@ _cargo = [_cargo, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(commo if ((count _cargo) > 0) then { _target = _cargo select 0; - [QGVAR(MoveOut), [_target], [_target]] call EFUNC(common,targetEvent); + ["MoveOutCaptive", [_target], [_target]] call EFUNC(common,targetEvent); } else { ERROR("No captive to unload"); }; diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf index 1eb1c2ef2b..fe4d0528c6 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf @@ -20,8 +20,8 @@ PARAMS_2(_target,_vehicle); private ["_cargoIndex"]; -_target moveInCargo _vehicle; -_target assignAsCargo _vehicle; +_target moveInCargo _vehicle; +_target assignAsCargo _vehicle; _cargoIndex = _vehicle getCargoIndex _target; _target setVariable ["ACE_Captives_CargoIndex", _cargoIndex, true]; From 11cd426b87162ad710e07d28566e69d24c0ef938 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 4 Feb 2015 00:35:51 -0600 Subject: [PATCH 014/166] Redo XEH --- addons/captives/CfgEventHandlers.hpp | 15 ++-------- addons/captives/XEH_preInit.sqf | 5 ++-- addons/captives/config.cpp | 10 +++---- addons/captives/functions/fnc_handleGetIn.sqf | 24 +++++++++++++++ .../captives/functions/fnc_handleGetOut.sqf | 18 ++++++------ .../captives/functions/fnc_handleKilled.sqf | 26 +++++++++++++++++ .../functions/fnc_handleUnitInitPost.sqf | 29 +++++++++++++++++++ addons/captives/functions/fnc_initPost.sqf | 24 --------------- addons/captives/functions/fnc_initUnit.sqf | 22 -------------- addons/captives/functions/fnc_loadCaptive.sqf | 2 +- 10 files changed, 100 insertions(+), 75 deletions(-) create mode 100644 addons/captives/functions/fnc_handleGetIn.sqf create mode 100644 addons/captives/functions/fnc_handleKilled.sqf create mode 100644 addons/captives/functions/fnc_handleUnitInitPost.sqf delete mode 100644 addons/captives/functions/fnc_initPost.sqf delete mode 100644 addons/captives/functions/fnc_initUnit.sqf diff --git a/addons/captives/CfgEventHandlers.hpp b/addons/captives/CfgEventHandlers.hpp index b8c182d1f6..07dbe45fb7 100644 --- a/addons/captives/CfgEventHandlers.hpp +++ b/addons/captives/CfgEventHandlers.hpp @@ -14,7 +14,7 @@ class Extended_PostInit_EventHandlers { class Extended_GetIn_EventHandlers { class All { class GVAR(AutoDetachCaptive) { - getIn = "if (local (_this select 2) && {(_this select 2) getVariable ['ACE_isEscorting', false]}) then {(_this select 2) setVariable ['ACE_isEscorting', false, true]}"; + getIn = QUOTE(_this call FUNC(handleGetIn)); }; }; }; @@ -32,16 +32,7 @@ class Extended_GetOut_EventHandlers { class Extended_Killed_EventHandlers { class CAManBase { class GVAR(AutoDetachCaptive) { - killed = "if ((_this select 0) getVariable ['ACE_isCaptive', false]) then {(_this select 0) setVariable ['ACE_isCaptive', false, true]}; if ((_this select 0) getVariable ['ACE_isEscorting', false]) then {(_this select 0) setVariable ['ACE_isEscorting', false, true]};"; - }; - }; -}; - -//handle captive and unconsciousness state -class Extended_Init_EventHandlers { - class CAManBase { - class GVAR(AutoDetachCaptive) { - init = "_this call ACE_Captives_fnc_initUnit"; + killed = QUOTE(_this call FUNC(handleKilled)); }; }; }; @@ -50,7 +41,7 @@ class Extended_Init_EventHandlers { class Extended_InitPost_EventHandlers { class CAManBase { class GVAR(InitPost) { - init = "if (local (_this select 0)) then {_this call ACE_Captives_fnc_initPost};"; + init = QUOTE(_this call FUNC(handleUnitInitPost)); }; }; }; diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 505d57051e..5ff2379c0b 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -6,12 +6,13 @@ PREP(canFriskPerson); PREP(canLoadCaptive); PREP(canUnloadCaptive); PREP(escortCaptive); +PREP(handleGetIn); PREP(handleGetOut); +PREP(handleKilled); PREP(handleKnockedOut); PREP(handlePlayerChanged); PREP(handleWokeUp); -PREP(initPost); -PREP(initUnit); +PREP(handleUnitInitPost); PREP(loadCaptive); PREP(openFriskMenu); PREP(setCaptive); diff --git a/addons/captives/config.cpp b/addons/captives/config.cpp index 7e5c3382bb..7bef039e37 100644 --- a/addons/captives/config.cpp +++ b/addons/captives/config.cpp @@ -18,14 +18,14 @@ class CfgPatches { #include "CfgWeapons.hpp" -class ACE_Core_canInteractConditions { - class ACE_Interaction_isNotEscorting { - condition = "!(_player getVariable ['ACE_isEscorting', false])"; +class ACE_canInteractConditions { + class GVAR(isNotEscorting) { + condition = QUOTE(!(_player getVariable ['ACE_isEscorting', false])"; }; - class ACE_Interaction_isNotCaptive { + class GVAR(isNotCaptive) { condition = "!(_player getVariable ['ACE_isCaptive', false])"; }; - class ACE_Interaction_isNotSurrendering { + class GVAR(isNotSurrendering) { condition = "!(_player getVariable ['ACE_isSurrender', false])"; }; }; diff --git a/addons/captives/functions/fnc_handleGetIn.sqf b/addons/captives/functions/fnc_handleGetIn.sqf new file mode 100644 index 0000000000..dc0b5aa5af --- /dev/null +++ b/addons/captives/functions/fnc_handleGetIn.sqf @@ -0,0 +1,24 @@ +/* + * Author: commy2 + * Handles when a unit gets in to a vehicle. Release escorted captive when entering a vehicle + * + * Arguments: + * 0: _vehicle + * 2: dunno + * 1: _unit + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_3(_vehicle,_dontcare,_unit); + +if ((local _unit) && (_unit getVariable ["ACE_isEscorting", false])) then { + _unit setVariable ["ACE_isEscorting", false, true]; +}; diff --git a/addons/captives/functions/fnc_handleGetOut.sqf b/addons/captives/functions/fnc_handleGetOut.sqf index f734fa0177..82e6417eab 100644 --- a/addons/captives/functions/fnc_handleGetOut.sqf +++ b/addons/captives/functions/fnc_handleGetOut.sqf @@ -19,16 +19,16 @@ PARAMS_3(_vehicle,_dontcare,_unit); -if (!local _unit) exitWith {}; -if (!(_unit getVariable ["ACE_isCaptive", false])) exitWith {}; +if ((local _unit)&&(_unit getVariable ["ACE_isCaptive", false])) then { -private ["_cargoIndex"]; + private ["_cargoIndex"]; -_cargoIndex = _unit getVariable ["ACE_Captives_CargoIndex", -1]; + _cargoIndex = _unit getVariable ["ACE_Captives_CargoIndex", -1]; -//If captive was not "unloaded", then move them back into the vehicle. -if (_cargoIndex != -1) exitWith { - _unit moveInCargo [_vehicle, _cargoIndex]; -}; + //If captive was not "unloaded", then move them back into the vehicle. + if (_cargoIndex != -1) exitWith { + _unit moveInCargo [_vehicle, _cargoIndex]; + }; -[_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); + [_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); +}; \ No newline at end of file diff --git a/addons/captives/functions/fnc_handleKilled.sqf b/addons/captives/functions/fnc_handleKilled.sqf new file mode 100644 index 0000000000..2d476f662c --- /dev/null +++ b/addons/captives/functions/fnc_handleKilled.sqf @@ -0,0 +1,26 @@ +/* + * Author: PabstMirror + * Handles when a unit is kill. Reset captivity and escorting status when getting killed + * + * Arguments: + * 0: _oldUnit + * + * Return Value: + * None + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_oldUnit); + +if (_oldUnit getVariable ["ACE_isCaptive", false]) then { + _oldUnit setVariable ["ACE_isCaptive", false, true]; +}; + +if (_oldUnit getVariable ["ACE_isEscorting", false]) then { + _oldUnit setVariable ["ACE_isEscorting", false, true] +}; diff --git a/addons/captives/functions/fnc_handleUnitInitPost.sqf b/addons/captives/functions/fnc_handleUnitInitPost.sqf new file mode 100644 index 0000000000..97362b1b96 --- /dev/null +++ b/addons/captives/functions/fnc_handleUnitInitPost.sqf @@ -0,0 +1,29 @@ +/* +* Author: commy2 +* handle captive and unconsciousness state and prevent grenades +* +* Arguments: +* 0: _unit +* +* Return Value: +* The return value +* +* Example: +* TODO +* +* Public: No +*/ +#include "script_component.hpp" + +PARAMS_1(_unit); + +// prevent players from throwing grenades +[_unit, "Throw", {(_this select 1) getVariable ["ACE_isCaptive", false]}, {}] call EFUNC(common,addActionEventhandler); + +if (local _unit) then { + // reset status on mission start + if (_unit getVariable ["ACE_isCaptive", false]) then { + _unit setVariable ["ACE_isCaptive", false]; + [_unit, true] call FUNC(setCaptive); + }; +}; diff --git a/addons/captives/functions/fnc_initPost.sqf b/addons/captives/functions/fnc_initPost.sqf deleted file mode 100644 index 8e777a9717..0000000000 --- a/addons/captives/functions/fnc_initPost.sqf +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Author: commy2 - * TODO - * - * Arguments: - * 0: _unit - * - * Return Value: - * The return value - * - * Example: - * TODO - * - * Public: No - */ -#include "script_component.hpp" - -PARAMS_1(_unit); - -// reset status on mission start -if (_unit getVariable ["ACE_isCaptive", false]) then { - _unit setVariable ["ACE_isCaptive", false]; - [_unit, true] call ACE_Captives_fnc_setCaptive; -}; diff --git a/addons/captives/functions/fnc_initUnit.sqf b/addons/captives/functions/fnc_initUnit.sqf deleted file mode 100644 index df9356ff2a..0000000000 --- a/addons/captives/functions/fnc_initUnit.sqf +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Author: commy2 - * TODO - * - * Arguments: - * 0: _unit - * - * Return Value: - * The return value - * - * Example: - * TODO - * - * Public: No - */ -#include "script_component.hpp" - -PARAMS_1(_unit); - - -// prevent players from throwing grenades -[_unit, "Throw", {(_this select 1) getVariable ["ACE_isCaptive", false]}, {}] call EFUNC(common,addActionEventhandler); diff --git a/addons/captives/functions/fnc_loadCaptive.sqf b/addons/captives/functions/fnc_loadCaptive.sqf index 05f87a20c6..680fee343c 100644 --- a/addons/captives/functions/fnc_loadCaptive.sqf +++ b/addons/captives/functions/fnc_loadCaptive.sqf @@ -31,6 +31,6 @@ if (isNull _vehicle) then { }; if ((!isNil "_target") && {!isNil "_vehicle"}) then { - _unit setVariable ["ACE_isEscorting", false]; + _unit setVariable ["ACE_isEscorting", false, true]; ["MoveInCaptive", [_target], [_target, _vehicle]] call EFUNC(common,targetEvent); }; From 435b3b8b867922ddc0c6ac5ee4d3700809e714ca Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 4 Feb 2015 13:16:19 -0600 Subject: [PATCH 015/166] Move Code out of CfgVehicles --- addons/captives/CfgVehicles.hpp | 20 +++---- addons/captives/XEH_preInit.sqf | 16 ++++-- addons/captives/config.cpp | 8 ++- .../functions/fnc_canEscortCaptive.sqf | 24 ++++++++ .../captives/functions/fnc_canFriskPerson.sqf | 2 +- .../captives/functions/fnc_canLoadCaptive.sqf | 4 +- .../functions/fnc_canReleaseCaptive.sqf | 23 ++++++++ .../functions/fnc_canStopEscorting.sqf | 41 ++++++++++++++ .../captives/functions/fnc_canTakeCaptive.sqf | 23 ++++++++ .../functions/fnc_canUnloadCaptive.sqf | 2 +- .../functions/fnc_doEscortCaptive.sqf | 56 +++++++++++++++++++ ...penFriskMenu.sqf => fnc_doFriskPerson.sqf} | 0 ..._loadCaptive.sqf => fnc_doLoadCaptive.sqf} | 4 +- .../functions/fnc_doReleaseCaptive.sqf | 21 +++++++ .../captives/functions/fnc_doTakeCaptive.sqf | 22 ++++++++ ...oadCaptive.sqf => fnc_doUnloadCaptive.sqf} | 2 +- .../captives/functions/fnc_escortCaptive.sqf | 55 ------------------ addons/captives/functions/fnc_handleGetIn.sqf | 4 +- .../captives/functions/fnc_handleGetOut.sqf | 2 +- .../captives/functions/fnc_handleKilled.sqf | 8 +-- .../functions/fnc_handlePlayerChanged.sqf | 2 +- .../functions/fnc_handleUnitInitPost.sqf | 6 +- .../captives/functions/fnc_handleWokeUp.sqf | 2 +- addons/captives/functions/fnc_setCaptive.sqf | 10 ++-- addons/captives/functions/fnc_surrender.sqf | 10 ++-- addons/interaction/config.cpp | 9 --- 26 files changed, 265 insertions(+), 111 deletions(-) create mode 100644 addons/captives/functions/fnc_canEscortCaptive.sqf create mode 100644 addons/captives/functions/fnc_canReleaseCaptive.sqf create mode 100644 addons/captives/functions/fnc_canStopEscorting.sqf create mode 100644 addons/captives/functions/fnc_canTakeCaptive.sqf create mode 100644 addons/captives/functions/fnc_doEscortCaptive.sqf rename addons/captives/functions/{fnc_openFriskMenu.sqf => fnc_doFriskPerson.sqf} (100%) rename addons/captives/functions/{fnc_loadCaptive.sqf => fnc_doLoadCaptive.sqf} (84%) create mode 100644 addons/captives/functions/fnc_doReleaseCaptive.sqf create mode 100644 addons/captives/functions/fnc_doTakeCaptive.sqf rename addons/captives/functions/{fnc_unloadCaptive.sqf => fnc_doUnloadCaptive.sqf} (87%) delete mode 100644 addons/captives/functions/fnc_escortCaptive.sqf diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 04b8d4569f..059b07cfb8 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -5,8 +5,8 @@ class CfgVehicles { class ACE_SetCaptive { displayName = "$STR_ACE_Captives_SetCaptive"; distance = 4; - condition = QUOTE(('ACE_CableTie' in (items _player)) && {alive _target} && {!(_target getVariable [ARR_2('ACE_isCaptive', false)])}); - statement = QUOTE(_player removeItem 'ACE_CableTie'; [ARR_3('SetCaptive', [_target], [ARR_2(_target, true)])] call EFUNC(common,targetEvent);); + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canTakeCaptive)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doTakeCaptive)); showDisabled = 0; priority = 2.4; icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); @@ -15,8 +15,8 @@ class CfgVehicles { class ACE_ReleaseCaptive { displayName = "$STR_ACE_Captives_ReleaseCaptive"; distance = 4; - condition = QUOTE(_target getVariable [ARR_2('ACE_isCaptive', false)] && {isNull (attachedTo _target)}); - statement = QUOTE([ARR_3('SetCaptive', [_target], [ARR_2(_target, false)])] call EFUNC(common,targetEvent);); + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canReleaseCaptive)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doReleaseCaptive)); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; priority = 2.4; @@ -26,8 +26,8 @@ class CfgVehicles { class ACE_EscortCaptive { displayName = "$STR_ACE_Captives_EscortCaptive"; distance = 4; - condition = QUOTE((_target getVariable [ARR_2('ACE_isCaptive', false)]) && {isNull (attachedTo _target)} && {alive _target} && {!(_target getVariable [ARR_2('ACE_isUnconscious', false)])}); - statement = QUOTE([ARR_2(_target, true)] call FUNC(escortCaptive)); + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canEscortCaptive)); + statement = QUOTE([ARR_2(_target, true)] call FUNC(doEscortCaptive)); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; icon = QUOTE(PATHTOF(UI\captive_ca.paa)); @@ -37,8 +37,8 @@ class CfgVehicles { class ACE_StopEscorting { displayName = "$STR_ACE_Captives_StopEscorting"; distance = 4; - condition = QUOTE((_target getVariable [ARR_2('ACE_isCaptive', false)]) && {_target in (attachedObjects _player)}); - statement = QUOTE([ARR_2(_target, false)] call FUNC(escortCaptive)); + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canStopEscorting)); + statement = QUOTE([ARR_3(_player,_target, false)] call FUNC(doEscortCaptive)); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; icon = QUOTE(PATHTOF(UI\captive_ca.paa)); @@ -71,8 +71,8 @@ class CfgVehicles { class ACE_SelfActions { class ACE_StopEscortingSelf { displayName = "$STR_ACE_Captives_StopEscorting"; - condition = QUOTE(((_player getVariable [ARR_2('ACE_escortedUnit', objNull)]) getVariable ['ACE_isCaptive', false]) && {(_player getVariable [ARR_2('ACE_escortedUnit', objNull)]) in attachedObjects _player}); - statement = QUOTE([ARR_2((_player getVariable [ARR_2('ACE_escortedUnit', objNull)]), false)] call FUNC(_escortCaptive);); + condition = QUOTE([ARR_2(_player, objNull)] call FUNC(canStopEscorting)); + statement = QUOTE([ARR_3(_player,objNull, false)] call FUNC(doEscortCaptive)); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; priority = 2.3; diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 5ff2379c0b..b3de41ae69 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -2,22 +2,28 @@ ADDON = false; +PREP(canEscortCaptive); PREP(canFriskPerson); PREP(canLoadCaptive); +PREP(canReleaseCaptive); +PREP(canStopEscorting); +PREP(canTakeCaptive); PREP(canUnloadCaptive); -PREP(escortCaptive); +PREP(doEscortCaptive); +PREP(doFriskPerson); +PREP(doLoadCaptive); +PREP(doReleaseCaptive); +PREP(doTakeCaptive); +PREP(doUnloadCaptive); PREP(handleGetIn); PREP(handleGetOut); PREP(handleKilled); PREP(handleKnockedOut); PREP(handlePlayerChanged); -PREP(handleWokeUp); PREP(handleUnitInitPost); -PREP(loadCaptive); -PREP(openFriskMenu); +PREP(handleWokeUp); PREP(setCaptive); PREP(surrender); -PREP(unloadCaptive); PREP(vehicleCaptiveMoveIn); PREP(vehicleCaptiveMoveOut); diff --git a/addons/captives/config.cpp b/addons/captives/config.cpp index 7bef039e37..d7cb36371d 100644 --- a/addons/captives/config.cpp +++ b/addons/captives/config.cpp @@ -17,15 +17,17 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" +#define GVARFIX(var1) getVariable [ARR_2(QUOTE(GVAR(var1)), false)] + class ACE_canInteractConditions { class GVAR(isNotEscorting) { - condition = QUOTE(!(_player getVariable ['ACE_isEscorting', false])"; + condition = QUOTE(!(GETVAR(player,QGVAR(isEscorting),false))); }; class GVAR(isNotCaptive) { - condition = "!(_player getVariable ['ACE_isCaptive', false])"; + condition = QUOTE(!(GETVAR(player,QGVAR(isCaptive),false))); }; class GVAR(isNotSurrendering) { - condition = "!(_player getVariable ['ACE_isSurrender', false])"; + condition = QUOTE(!(GETVAR(player,QGVAR(isSurrender),false))); }; }; diff --git a/addons/captives/functions/fnc_canEscortCaptive.sqf b/addons/captives/functions/fnc_canEscortCaptive.sqf new file mode 100644 index 0000000000..40a3e0d560 --- /dev/null +++ b/addons/captives/functions/fnc_canEscortCaptive.sqf @@ -0,0 +1,24 @@ +/* + * Author: PabstMirror + * Tests if can escort target (attach) + * + * Arguments: + * 0: caller (player) + * 1: target + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_target); + +(_target getVariable [QGVAR(isCaptive), false]) && +{isNull (attachedTo _target)} && +{alive _target} && +{!(_target getVariable [QGVAR(ACE_isUnconscious), false])} diff --git a/addons/captives/functions/fnc_canFriskPerson.sqf b/addons/captives/functions/fnc_canFriskPerson.sqf index 62d5a06742..6ee44b2af5 100644 --- a/addons/captives/functions/fnc_canFriskPerson.sqf +++ b/addons/captives/functions/fnc_canFriskPerson.sqf @@ -18,6 +18,6 @@ PARAMS_2(_unit,_target); -_target getVariable ["ACE_isCaptive", false] +_target getVariable [QGVAR(isCaptive), false] || {_target getVariable ["ACE_isSearchable", false]} || {_target getVariable ["ACE_isUnconscious", false]} diff --git a/addons/captives/functions/fnc_canLoadCaptive.sqf b/addons/captives/functions/fnc_canLoadCaptive.sqf index b8021e602f..a05765b195 100644 --- a/addons/captives/functions/fnc_canLoadCaptive.sqf +++ b/addons/captives/functions/fnc_canLoadCaptive.sqf @@ -23,7 +23,7 @@ PARAMS_3(_unit,_target,_vehicle); if (isNull _target) then { _objects = attachedObjects _unit; - _objects = [_objects, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); + _objects = [_objects, {_this getVariable [QGVAR(isCaptive), false]}] call EFUNC(common,filter); _target = _objects select 0; }; @@ -32,7 +32,7 @@ if (isNull _vehicle) then { _vehicle = _objects select 0; }; -_unit getVariable ["ACE_isEscorting", false] +_unit getVariable [QGVAR(isEscorting), false] && {!isNil "_target"} && {!isNil "_vehicle"} && {_vehicle emptyPositions "cargo" > 0} diff --git a/addons/captives/functions/fnc_canReleaseCaptive.sqf b/addons/captives/functions/fnc_canReleaseCaptive.sqf new file mode 100644 index 0000000000..50b4c55310 --- /dev/null +++ b/addons/captives/functions/fnc_canReleaseCaptive.sqf @@ -0,0 +1,23 @@ +/* + * Author: PabstMirror + * Checks the conditions for being able to release a captive + * + * Arguments: + * 0: caller (player) + * 1: target + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_target); + +//Unit is captive and not being escorted +_target getVariable [QGVAR(isCaptive), false] && +{isNull (attachedTo _target)} diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf new file mode 100644 index 0000000000..4f30e7a82a --- /dev/null +++ b/addons/captives/functions/fnc_canStopEscorting.sqf @@ -0,0 +1,41 @@ +/* + * Author: PabstMirror + * Tests if player can stop escorting + * + * Arguments: + * 0: caller (player) + * 1: target + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_unit); +DEFAULT_PARAM(1,_target,objNull); + +private ["_isAttached"]; + + +if (isNull _target) then { + _target = _unit getVariable ["ACE_escortedUnit", objNull]; +}; + +if (isNull _target) exitWith { + ERROR("Null Target (no ACE_escortedUnit)"); + false +}; + +_isAttached = _target in (attachedObjects _unit); + +if (_isAttached && (!(_target getVariable [QGVAR(isCaptive), false]))) exitWith { + ERROR("Attached But Not Captive"); + false +}; + +_isAttached diff --git a/addons/captives/functions/fnc_canTakeCaptive.sqf b/addons/captives/functions/fnc_canTakeCaptive.sqf new file mode 100644 index 0000000000..f67f6110bf --- /dev/null +++ b/addons/captives/functions/fnc_canTakeCaptive.sqf @@ -0,0 +1,23 @@ +/* + * Author: PabstMirror + * Checks the conditions for being able to take a unit captive + * + * Arguments: + * 0: caller (player) + * 1: target + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_target); + +("ACE_CableTie" in (items _unit)) && +{alive _target} && +{!(_target getVariable [QGVAR(isCaptive), false])} diff --git a/addons/captives/functions/fnc_canUnloadCaptive.sqf b/addons/captives/functions/fnc_canUnloadCaptive.sqf index b714ebc8ae..1aef4602e1 100644 --- a/addons/captives/functions/fnc_canUnloadCaptive.sqf +++ b/addons/captives/functions/fnc_canUnloadCaptive.sqf @@ -23,6 +23,6 @@ PARAMS_2(_unit,_vehicle); _cargo = crew _vehicle; // Can also unload from driver, gunner, commander, turret positions. They shouldn't be there anyway. -_cargo = [_cargo, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); +_cargo = [_cargo, {_this getVariable [QGVAR(isCaptive), false]}] call EFUNC(common,filter); count _cargo > 0 diff --git a/addons/captives/functions/fnc_doEscortCaptive.sqf b/addons/captives/functions/fnc_doEscortCaptive.sqf new file mode 100644 index 0000000000..05dc912205 --- /dev/null +++ b/addons/captives/functions/fnc_doEscortCaptive.sqf @@ -0,0 +1,56 @@ +/* + * Author: Nic547 + * Attaches a Captive to the _unit + * + * Arguments: + * 0: _unit-Player + * 1: target + * 2: _state + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_3(_unit,_target,_state); + +if !("ACE_Handcuffed" in ([_target] call ACE_Core_fnc_getCaptivityStatus)) exitWith { + [localize "STR_ACE_Captives_NoCaptive"] call EFUNC(common,displayTextStructured); +}; + +if (_state) then { + if (_unit getVariable [QGVAR(isEscorting), false]) exitWith {}; + + [_unit, _target] call EFUNC(common,claim); + _unit setVariable [QGVAR(isEscorting), true, true]; + + _target attachTo [_unit, [0, 1, 0]]; + + _unit setVariable ["ACE_escortedUnit", _target, true]; + _actionID = _unit addAction [format ["%1", localize "STR_ACE_Captives_StopEscorting"], "[_unit getVariable ['ACE_escortedUnit', objNull], false] call ACE_Captives_fnc_escortCaptive;", nil, 20, false, true, "", "!isNull (_unit getVariable ['ACE_escortedUnit', objNull])"]; + + [_target, _actionID] spawn { + _target = _this select 0; + _actionID = _this select 1; + + while {_unit getVariable [QGVAR(isEscorting), false]} do { + sleep 0.2; + + if (!alive _target || {!alive _unit} || {!canStand _target} || {!canStand _unit} || {_target getVariable ["ACE_isUnconscious", false]} || {_unit getVariable ["ACE_isUnconscious", false]} || {!isNull (attachedTo _unit)}) then { + _unit setVariable [QGVAR(isEscorting), false, true]; + }; + }; + [objNull, _target] call EFUNC(common,claim); + + detach _target; + _unit removeAction _actionID; + }; +} else { + _unit setVariable [QGVAR(isEscorting), false, true]; + _unit setVariable ["ACE_escortedUnit", objNull, true]; +}; diff --git a/addons/captives/functions/fnc_openFriskMenu.sqf b/addons/captives/functions/fnc_doFriskPerson.sqf similarity index 100% rename from addons/captives/functions/fnc_openFriskMenu.sqf rename to addons/captives/functions/fnc_doFriskPerson.sqf diff --git a/addons/captives/functions/fnc_loadCaptive.sqf b/addons/captives/functions/fnc_doLoadCaptive.sqf similarity index 84% rename from addons/captives/functions/fnc_loadCaptive.sqf rename to addons/captives/functions/fnc_doLoadCaptive.sqf index 680fee343c..1ef650b4ee 100644 --- a/addons/captives/functions/fnc_loadCaptive.sqf +++ b/addons/captives/functions/fnc_doLoadCaptive.sqf @@ -21,7 +21,7 @@ PARAMS_3(_unit,_target,_vehicle); if (isNull _target) then { _objects = attachedObjects _unit; - _objects = [_objects, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); + _objects = [_objects, {_this getVariable [QGVAR(isCaptive), false]}] call EFUNC(common,filter); _target = _objects select 0; }; @@ -31,6 +31,6 @@ if (isNull _vehicle) then { }; if ((!isNil "_target") && {!isNil "_vehicle"}) then { - _unit setVariable ["ACE_isEscorting", false, true]; + _unit setVariable [QGVAR(isEscorting), false, true]; ["MoveInCaptive", [_target], [_target, _vehicle]] call EFUNC(common,targetEvent); }; diff --git a/addons/captives/functions/fnc_doReleaseCaptive.sqf b/addons/captives/functions/fnc_doReleaseCaptive.sqf new file mode 100644 index 0000000000..a807959565 --- /dev/null +++ b/addons/captives/functions/fnc_doReleaseCaptive.sqf @@ -0,0 +1,21 @@ +/* + * Author: PabstMirror + * Release a captive + * + * Arguments: + * 0: caller (player) + * 1: target + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_target); + +["SetCaptive", [_target], [_target, false]] call EFUNC(common,targetEvent); diff --git a/addons/captives/functions/fnc_doTakeCaptive.sqf b/addons/captives/functions/fnc_doTakeCaptive.sqf new file mode 100644 index 0000000000..8deb712d09 --- /dev/null +++ b/addons/captives/functions/fnc_doTakeCaptive.sqf @@ -0,0 +1,22 @@ +/* + * Author: PabstMirror + * Checks the conditions for being able to take a unit captive + * + * Arguments: + * 0: caller (player) + * 1: target + * + * Return Value: + * The return value + * + * Example: + * - + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_target); + +_unit removeItem 'ACE_CableTie'; +["SetCaptive", [_target], [_target, true]] call EFUNC(common,targetEvent); diff --git a/addons/captives/functions/fnc_unloadCaptive.sqf b/addons/captives/functions/fnc_doUnloadCaptive.sqf similarity index 87% rename from addons/captives/functions/fnc_unloadCaptive.sqf rename to addons/captives/functions/fnc_doUnloadCaptive.sqf index 057b825d12..1a6b6a2d0c 100644 --- a/addons/captives/functions/fnc_unloadCaptive.sqf +++ b/addons/captives/functions/fnc_doUnloadCaptive.sqf @@ -22,7 +22,7 @@ private ["_cargo", "_target"]; _cargo = crew _vehicle; // Can also unload from driver, gunner, commander, turret positions. They shouldn't be there anyway. -_cargo = [_cargo, {_this getVariable ["ACE_isCaptive", false]}] call EFUNC(common,filter); +_cargo = [_cargo, {_this getVariable [QGVAR(isCaptive), false]}] call EFUNC(common,filter); if ((count _cargo) > 0) then { _target = _cargo select 0; diff --git a/addons/captives/functions/fnc_escortCaptive.sqf b/addons/captives/functions/fnc_escortCaptive.sqf deleted file mode 100644 index c3030a9d33..0000000000 --- a/addons/captives/functions/fnc_escortCaptive.sqf +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Author: Nic547 - * Attaches a Captive to the player - * - * Arguments: - * 0: _unit - * 1: _state - * - * Return Value: - * The return value - * - * Example: - * - - * - * Public: No - */ -#include "script_component.hpp" - -PARAMS_2(_unit,_state); - -if !("ACE_Handcuffed" in ([_unit] call ACE_Core_fnc_getCaptivityStatus)) exitWith { - [localize "STR_ACE_Captives_NoCaptive"] call EFUNC(common,displayTextStructured); -}; - -if (_state) then { - if (player getVariable ["ACE_isEscorting", false]) exitWith {}; - - [player, _unit] call EFUNC(common,claim); - player setVariable ["ACE_isEscorting", true, true]; - - _unit attachTo [player, [0, 1, 0]]; - - player setVariable ["ACE_escortedUnit", _unit, true]; - _actionID = player addAction [format ["%1", localize "STR_ACE_Captives_StopEscorting"], "[player getVariable ['ACE_escortedUnit', objNull], false] call ACE_Captives_fnc_escortCaptive;", nil, 20, false, true, "", "!isNull (player getVariable ['ACE_escortedUnit', objNull])"]; - - [_unit, _actionID] spawn { - _unit = _this select 0; - _actionID = _this select 1; - - while {player getVariable ["ACE_isEscorting", false]} do { - sleep 0.2; - - if (!alive _unit || {!alive player} || {!canStand _unit} || {!canStand player} || {_unit getVariable ["ACE_isUnconscious", false]} || {player getVariable ["ACE_isUnconscious", false]} || {!isNull (attachedTo player)}) then { - player setVariable ["ACE_isEscorting", false, true]; - }; - }; - [objNull, _unit] call EFUNC(common,claim); - - detach _unit; - player removeAction _actionID; - }; -} else { - player setVariable ["ACE_isEscorting", false, true]; - player setVariable ["ACE_escortedUnit", objNull, true]; -}; diff --git a/addons/captives/functions/fnc_handleGetIn.sqf b/addons/captives/functions/fnc_handleGetIn.sqf index dc0b5aa5af..eb3a9ad8b1 100644 --- a/addons/captives/functions/fnc_handleGetIn.sqf +++ b/addons/captives/functions/fnc_handleGetIn.sqf @@ -19,6 +19,6 @@ PARAMS_3(_vehicle,_dontcare,_unit); -if ((local _unit) && (_unit getVariable ["ACE_isEscorting", false])) then { - _unit setVariable ["ACE_isEscorting", false, true]; +if ((local _unit) && (_unit getVariable [QGVAR(isEscorting), false])) then { + _unit setVariable [QGVAR(isEscorting), false, true]; }; diff --git a/addons/captives/functions/fnc_handleGetOut.sqf b/addons/captives/functions/fnc_handleGetOut.sqf index 82e6417eab..84c856ed39 100644 --- a/addons/captives/functions/fnc_handleGetOut.sqf +++ b/addons/captives/functions/fnc_handleGetOut.sqf @@ -19,7 +19,7 @@ PARAMS_3(_vehicle,_dontcare,_unit); -if ((local _unit)&&(_unit getVariable ["ACE_isCaptive", false])) then { +if ((local _unit)&&(_unit getVariable [QGVAR(isCaptive), false])) then { private ["_cargoIndex"]; diff --git a/addons/captives/functions/fnc_handleKilled.sqf b/addons/captives/functions/fnc_handleKilled.sqf index 2d476f662c..6e41fa801a 100644 --- a/addons/captives/functions/fnc_handleKilled.sqf +++ b/addons/captives/functions/fnc_handleKilled.sqf @@ -17,10 +17,10 @@ PARAMS_1(_oldUnit); -if (_oldUnit getVariable ["ACE_isCaptive", false]) then { - _oldUnit setVariable ["ACE_isCaptive", false, true]; +if (_oldUnit getVariable [QGVAR(isCaptive), false]) then { + _oldUnit setVariable [QGVAR(isCaptive), false, true]; }; -if (_oldUnit getVariable ["ACE_isEscorting", false]) then { - _oldUnit setVariable ["ACE_isEscorting", false, true] +if (_oldUnit getVariable [QGVAR(isEscorting), false]) then { + _oldUnit setVariable [QGVAR(isEscorting), false, true] }; diff --git a/addons/captives/functions/fnc_handlePlayerChanged.sqf b/addons/captives/functions/fnc_handlePlayerChanged.sqf index f23e380dd3..d7efa70a5f 100644 --- a/addons/captives/functions/fnc_handlePlayerChanged.sqf +++ b/addons/captives/functions/fnc_handlePlayerChanged.sqf @@ -18,7 +18,7 @@ PARAMS_2(_unit,_oldUnit); -if (_unit getVariable ["ACE_isCaptive", false]) then { +if (_unit getVariable [QGVAR(isCaptive), false]) then { showHUD false; } else { showHUD true; diff --git a/addons/captives/functions/fnc_handleUnitInitPost.sqf b/addons/captives/functions/fnc_handleUnitInitPost.sqf index 97362b1b96..a0e76c0a10 100644 --- a/addons/captives/functions/fnc_handleUnitInitPost.sqf +++ b/addons/captives/functions/fnc_handleUnitInitPost.sqf @@ -18,12 +18,12 @@ PARAMS_1(_unit); // prevent players from throwing grenades -[_unit, "Throw", {(_this select 1) getVariable ["ACE_isCaptive", false]}, {}] call EFUNC(common,addActionEventhandler); +[_unit, "Throw", {(_this select 1) getVariable [QGVAR(isCaptive), false]}, {}] call EFUNC(common,addActionEventhandler); if (local _unit) then { // reset status on mission start - if (_unit getVariable ["ACE_isCaptive", false]) then { - _unit setVariable ["ACE_isCaptive", false]; + if (_unit getVariable [QGVAR(isCaptive), false]) then { + _unit setVariable [QGVAR(isCaptive), false]; [_unit, true] call FUNC(setCaptive); }; }; diff --git a/addons/captives/functions/fnc_handleWokeUp.sqf b/addons/captives/functions/fnc_handleWokeUp.sqf index ea6a1bcb26..2973aa7f83 100644 --- a/addons/captives/functions/fnc_handleWokeUp.sqf +++ b/addons/captives/functions/fnc_handleWokeUp.sqf @@ -17,7 +17,7 @@ PARAMS_1(_unit); -if (_unit getVariable ["ACE_isCaptive", false] && {vehicle _unit == _unit}) then { +if (_unit getVariable [QGVAR(isCaptive), false] && {vehicle _unit == _unit}) then { [_unit] call EFUNC(common,fixLoweredRifleAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 0] call EFUNC(common,doAnimation); }; diff --git a/addons/captives/functions/fnc_setCaptive.sqf b/addons/captives/functions/fnc_setCaptive.sqf index b4c047dd1b..eca34b3bac 100644 --- a/addons/captives/functions/fnc_setCaptive.sqf +++ b/addons/captives/functions/fnc_setCaptive.sqf @@ -21,15 +21,15 @@ PARAMS_2(_unit,_state); if (!local _unit) exitWith {[[_unit, _state, true], _fnc_scriptName, _unit] call ACE_Core_fnc_execRemoteFnc}; if (_state) then { - if (_unit getVariable ["ACE_isCaptive", false]) exitWith {}; + if (_unit getVariable [QGVAR(isCaptive), false]) exitWith {}; - _unit setVariable ["ACE_isCaptive", true, true]; + _unit setVariable [QGVAR(isCaptive), true, true]; // fix anim on mission start (should work on dedicated servers) _unit spawn { [_this, "ACE_Handcuffed", true] call ACE_Core_fnc_setCaptivityStatus; - if (_this getVariable ["ACE_isCaptive", false] && {vehicle _this == _this}) then { + if (_this getVariable [QGVAR(isCaptive), false] && {vehicle _this == _this}) then { [_this] call EFUNC(common,fixLoweredRifleAnimation); [_this, "ACE_AmovPercMstpScapWnonDnon", 0] spawn EFUNC(common,doAnimation); }; @@ -41,9 +41,9 @@ if (_state) then { showHUD false; }; } else { - if !(_unit getVariable ["ACE_isCaptive", false]) exitWith {}; + if !(_unit getVariable [QGVAR(isCaptive), false]) exitWith {}; - _unit setVariable ["ACE_isCaptive", false, true]; + _unit setVariable [QGVAR(isCaptive), false, true]; [_unit, "ACE_Handcuffed", false] call ACE_Core_fnc_setCaptivityStatus; if (vehicle _unit == _unit) then { [_unit, "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index 92f0ea416a..3d3b65ec49 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -21,9 +21,9 @@ PARAMS_2(_unit,_state); if (!local _unit) exitWith {[_this, _fnc_scriptName, _unit] call ACE_Core_fnc_execRemoteFnc}; if (_state) then { - if (_unit getVariable ["ACE_isSurrender", false]) exitWith {}; + if (_unit getVariable [QGVAR(isSurrender), false]) exitWith {}; - _unit setVariable ["ACE_isSurrender", true, true]; + _unit setVariable [QGVAR(isSurrender), true, true]; [_unit, "ACE_Surrendered", true] call ACE_Core_fnc_setCaptivityStatus; _unit spawn { @@ -32,13 +32,13 @@ if (_state) then { _this playMove "amovpercmstpsraswrfldnon"; }; - while {_this getVariable ["ACE_isSurrender", false]} do { + while {_this getVariable [QGVAR(isSurrender), false]} do { sleep 0.001; //sleep in UI if (isPlayer _this) then {showHUD false}; if (!alive _this || {_this getVariable ["ACE_isUnconscious", false]}) then { - _this setVariable ["ACE_isSurrender", false, true]; + _this setVariable [QGVAR(isSurrender), false, true]; } else { _this playMove "amovpercmstpsnonwnondnon_amovpercmstpssurwnondnon"; }; @@ -54,7 +54,7 @@ if (_state) then { if (isPlayer _this) then {showHUD true}; }; } else { - _unit setVariable ["ACE_isSurrender", false, true]; + _unit setVariable [QGVAR(isSurrender), false, true]; }; /* diff --git a/addons/interaction/config.cpp b/addons/interaction/config.cpp index acb41d362f..3b53855eef 100644 --- a/addons/interaction/config.cpp +++ b/addons/interaction/config.cpp @@ -38,15 +38,6 @@ class ACE_Parameters_Boolean { }; class ACE_canInteractConditions { - class GVAR(isNotEscorting) { - condition = QUOTE( !(ACE_player getVariable [ARR_2('ACE_isEscorting', false)]) ); - }; - class GVAR(isNotCaptive) { - condition = QUOTE( !(ACE_player getVariable [ARR_2('ACE_isCaptive', false)]) ); - }; - class GVAR(isNotSurrendering) { - condition = QUOTE( !(ACE_player getVariable [ARR_2('ACE_isSurrender', false)]) ); - }; class GVAR(isNotSwimming) { condition = QUOTE( !underwater ACE_player ); }; From 122a38a6aae70cdd5b978c028a5ca6486965b9a4 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 5 Feb 2015 16:39:45 -0600 Subject: [PATCH 016/166] More Refactoring --- addons/captives/CfgVehicles.hpp | 14 +++++----- addons/captives/XEH_postInitClient.sqf | 7 ++--- addons/captives/XEH_preInit.sqf | 12 ++++---- addons/captives/config.cpp | 6 ++-- ...eCaptive.sqf => fnc_canApplyHandcuffs.sqf} | 6 ++-- .../functions/fnc_canEscortCaptive.sqf | 2 +- .../captives/functions/fnc_canFriskPerson.sqf | 2 +- .../captives/functions/fnc_canLoadCaptive.sqf | 2 +- ...Captive.sqf => fnc_canRemoveHandcuffs.sqf} | 6 ++-- .../functions/fnc_canStopEscorting.sqf | 2 +- .../functions/fnc_canUnloadCaptive.sqf | 2 +- ...keCaptive.sqf => fnc_doApplyHandcuffs.sqf} | 6 ++-- .../functions/fnc_doEscortCaptive.sqf | 2 +- .../captives/functions/fnc_doLoadCaptive.sqf | 8 ++++-- ...eCaptive.sqf => fnc_doRemoveHandcuffs.sqf} | 2 +- .../functions/fnc_doUnloadCaptive.sqf | 2 +- .../captives/functions/fnc_handleGetOut.sqf | 7 ++--- .../captives/functions/fnc_handleKilled.sqf | 4 +-- .../functions/fnc_handlePlayerChanged.sqf | 2 +- .../functions/fnc_handleUnitInitPost.sqf | 10 +++---- .../captives/functions/fnc_handleWokeUp.sqf | 2 +- ...c_setCaptive.sqf => fnc_setHandcuffed.sqf} | 28 +++++++++++-------- addons/captives/functions/fnc_surrender.sqf | 4 +-- 23 files changed, 71 insertions(+), 67 deletions(-) rename addons/captives/functions/{fnc_canTakeCaptive.sqf => fnc_canApplyHandcuffs.sqf} (62%) rename addons/captives/functions/{fnc_canReleaseCaptive.sqf => fnc_canRemoveHandcuffs.sqf} (62%) rename addons/captives/functions/{fnc_doTakeCaptive.sqf => fnc_doApplyHandcuffs.sqf} (58%) rename addons/captives/functions/{fnc_doReleaseCaptive.sqf => fnc_doRemoveHandcuffs.sqf} (76%) rename addons/captives/functions/{fnc_setCaptive.sqf => fnc_setHandcuffed.sqf} (60%) diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 059b07cfb8..b4a120bc22 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -2,21 +2,21 @@ class CfgVehicles { class Man; class CAManBase: Man { class ACE_Actions { - class ACE_SetCaptive { + class ACE_ApplyHandcuffs { displayName = "$STR_ACE_Captives_SetCaptive"; distance = 4; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canTakeCaptive)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doTakeCaptive)); + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doApplyHandcuffs)); showDisabled = 0; priority = 2.4; icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); hotkey = "C"; }; - class ACE_ReleaseCaptive { + class ACE_RemoveHandcuffs { displayName = "$STR_ACE_Captives_ReleaseCaptive"; distance = 4; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canReleaseCaptive)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doReleaseCaptive)); + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs)); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; priority = 2.4; @@ -27,7 +27,7 @@ class CfgVehicles { displayName = "$STR_ACE_Captives_EscortCaptive"; distance = 4; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canEscortCaptive)); - statement = QUOTE([ARR_2(_target, true)] call FUNC(doEscortCaptive)); + statement = QUOTE([ARR_3(_target, _target, true)] call FUNC(doEscortCaptive)); exceptions[] = {"ACE_Interaction_isNotEscorting"}; showDisabled = 0; icon = QUOTE(PATHTOF(UI\captive_ca.paa)); diff --git a/addons/captives/XEH_postInitClient.sqf b/addons/captives/XEH_postInitClient.sqf index ccec1d39d2..b55c9eb10c 100644 --- a/addons/captives/XEH_postInitClient.sqf +++ b/addons/captives/XEH_postInitClient.sqf @@ -1,12 +1,9 @@ #include "script_component.hpp" -[missionNamespace, "playerChanged", {_this call ACE_Captives_fnc_handlePlayerChanged}] call ACE_Core_fnc_addCustomEventhandler; - - - +["playerChanged", {_this call FUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler); ["MoveInCaptive", {_this call FUNC(vehicleCaptiveMoveIn)}] call EFUNC(common,addEventHandler); ["MoveOutCaptive", {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); -["SetCaptive", {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); +["SetHandcuffed", {_this call FUNC(setHandcuffed)}] call EFUNC(common,addEventHandler); //TODO: Medical Integration Events??? diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index b3de41ae69..e894cd1c31 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -1,19 +1,19 @@ #include "script_component.hpp" ADDON = false; - + +PREP(canApplyHandcuffs); PREP(canEscortCaptive); PREP(canFriskPerson); PREP(canLoadCaptive); -PREP(canReleaseCaptive); +PREP(canRemoveHandcuffs); PREP(canStopEscorting); -PREP(canTakeCaptive); PREP(canUnloadCaptive); +PREP(doApplyHandcuffs); PREP(doEscortCaptive); PREP(doFriskPerson); PREP(doLoadCaptive); -PREP(doReleaseCaptive); -PREP(doTakeCaptive); +PREP(doRemoveHandcuffs); PREP(doUnloadCaptive); PREP(handleGetIn); PREP(handleGetOut); @@ -22,7 +22,7 @@ PREP(handleKnockedOut); PREP(handlePlayerChanged); PREP(handleUnitInitPost); PREP(handleWokeUp); -PREP(setCaptive); +PREP(setHandcuffed); PREP(surrender); PREP(vehicleCaptiveMoveIn); PREP(vehicleCaptiveMoveOut); diff --git a/addons/captives/config.cpp b/addons/captives/config.cpp index d7cb36371d..bceeda3b2b 100644 --- a/addons/captives/config.cpp +++ b/addons/captives/config.cpp @@ -17,15 +17,13 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" -#define GVARFIX(var1) getVariable [ARR_2(QUOTE(GVAR(var1)), false)] - class ACE_canInteractConditions { class GVAR(isNotEscorting) { condition = QUOTE(!(GETVAR(player,QGVAR(isEscorting),false))); }; - class GVAR(isNotCaptive) { - condition = QUOTE(!(GETVAR(player,QGVAR(isCaptive),false))); + class GVAR(isNotHandcuffed) { + condition = QUOTE(!(GETVAR(player,QGVAR(isHandcuffed),false))); }; class GVAR(isNotSurrendering) { condition = QUOTE(!(GETVAR(player,QGVAR(isSurrender),false))); diff --git a/addons/captives/functions/fnc_canTakeCaptive.sqf b/addons/captives/functions/fnc_canApplyHandcuffs.sqf similarity index 62% rename from addons/captives/functions/fnc_canTakeCaptive.sqf rename to addons/captives/functions/fnc_canApplyHandcuffs.sqf index f67f6110bf..8a3d143e96 100644 --- a/addons/captives/functions/fnc_canTakeCaptive.sqf +++ b/addons/captives/functions/fnc_canApplyHandcuffs.sqf @@ -1,6 +1,6 @@ /* * Author: PabstMirror - * Checks the conditions for being able to take a unit captive + * Checks the conditions for being able to apply handcuffs * * Arguments: * 0: caller (player) @@ -18,6 +18,8 @@ PARAMS_2(_unit,_target); +//Player has cableTie, target is alive and not already handcuffed + ("ACE_CableTie" in (items _unit)) && {alive _target} && -{!(_target getVariable [QGVAR(isCaptive), false])} +{!(_target getVariable [QGVAR(isHandcuffed), false])} diff --git a/addons/captives/functions/fnc_canEscortCaptive.sqf b/addons/captives/functions/fnc_canEscortCaptive.sqf index 40a3e0d560..9bcb1d258a 100644 --- a/addons/captives/functions/fnc_canEscortCaptive.sqf +++ b/addons/captives/functions/fnc_canEscortCaptive.sqf @@ -18,7 +18,7 @@ PARAMS_2(_unit,_target); -(_target getVariable [QGVAR(isCaptive), false]) && +(_target getVariable [QGVAR(isHandcuffed), false]) && {isNull (attachedTo _target)} && {alive _target} && {!(_target getVariable [QGVAR(ACE_isUnconscious), false])} diff --git a/addons/captives/functions/fnc_canFriskPerson.sqf b/addons/captives/functions/fnc_canFriskPerson.sqf index 6ee44b2af5..9bbf5389c3 100644 --- a/addons/captives/functions/fnc_canFriskPerson.sqf +++ b/addons/captives/functions/fnc_canFriskPerson.sqf @@ -18,6 +18,6 @@ PARAMS_2(_unit,_target); -_target getVariable [QGVAR(isCaptive), false] +_target getVariable [QGVAR(isHandcuffed), false] || {_target getVariable ["ACE_isSearchable", false]} || {_target getVariable ["ACE_isUnconscious", false]} diff --git a/addons/captives/functions/fnc_canLoadCaptive.sqf b/addons/captives/functions/fnc_canLoadCaptive.sqf index a05765b195..3b1521e2be 100644 --- a/addons/captives/functions/fnc_canLoadCaptive.sqf +++ b/addons/captives/functions/fnc_canLoadCaptive.sqf @@ -23,7 +23,7 @@ PARAMS_3(_unit,_target,_vehicle); if (isNull _target) then { _objects = attachedObjects _unit; - _objects = [_objects, {_this getVariable [QGVAR(isCaptive), false]}] call EFUNC(common,filter); + _objects = [_objects, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); _target = _objects select 0; }; diff --git a/addons/captives/functions/fnc_canReleaseCaptive.sqf b/addons/captives/functions/fnc_canRemoveHandcuffs.sqf similarity index 62% rename from addons/captives/functions/fnc_canReleaseCaptive.sqf rename to addons/captives/functions/fnc_canRemoveHandcuffs.sqf index 50b4c55310..f36488fbf1 100644 --- a/addons/captives/functions/fnc_canReleaseCaptive.sqf +++ b/addons/captives/functions/fnc_canRemoveHandcuffs.sqf @@ -1,6 +1,6 @@ /* * Author: PabstMirror - * Checks the conditions for being able to release a captive + * Checks the conditions for being able to remove handcuffs * * Arguments: * 0: caller (player) @@ -18,6 +18,6 @@ PARAMS_2(_unit,_target); -//Unit is captive and not being escorted -_target getVariable [QGVAR(isCaptive), false] && +//Unit is handcuffed and not currently being escorted +_target getVariable [QGVAR(isHandcuffed), false] && {isNull (attachedTo _target)} diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf index 4f30e7a82a..66cf12c9fc 100644 --- a/addons/captives/functions/fnc_canStopEscorting.sqf +++ b/addons/captives/functions/fnc_canStopEscorting.sqf @@ -33,7 +33,7 @@ if (isNull _target) exitWith { _isAttached = _target in (attachedObjects _unit); -if (_isAttached && (!(_target getVariable [QGVAR(isCaptive), false]))) exitWith { +if (_isAttached && (!(_target getVariable [QGVAR(isHandcuffed), false]))) exitWith { ERROR("Attached But Not Captive"); false }; diff --git a/addons/captives/functions/fnc_canUnloadCaptive.sqf b/addons/captives/functions/fnc_canUnloadCaptive.sqf index 1aef4602e1..3e014d72c7 100644 --- a/addons/captives/functions/fnc_canUnloadCaptive.sqf +++ b/addons/captives/functions/fnc_canUnloadCaptive.sqf @@ -23,6 +23,6 @@ PARAMS_2(_unit,_vehicle); _cargo = crew _vehicle; // Can also unload from driver, gunner, commander, turret positions. They shouldn't be there anyway. -_cargo = [_cargo, {_this getVariable [QGVAR(isCaptive), false]}] call EFUNC(common,filter); +_cargo = [_cargo, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); count _cargo > 0 diff --git a/addons/captives/functions/fnc_doTakeCaptive.sqf b/addons/captives/functions/fnc_doApplyHandcuffs.sqf similarity index 58% rename from addons/captives/functions/fnc_doTakeCaptive.sqf rename to addons/captives/functions/fnc_doApplyHandcuffs.sqf index 8deb712d09..9ae82916f7 100644 --- a/addons/captives/functions/fnc_doTakeCaptive.sqf +++ b/addons/captives/functions/fnc_doApplyHandcuffs.sqf @@ -1,6 +1,6 @@ /* * Author: PabstMirror - * Checks the conditions for being able to take a unit captive + * Checks the conditions for being able to apply handcuffs * * Arguments: * 0: caller (player) @@ -18,5 +18,5 @@ PARAMS_2(_unit,_target); -_unit removeItem 'ACE_CableTie'; -["SetCaptive", [_target], [_target, true]] call EFUNC(common,targetEvent); +_unit removeItem "ACE_CableTie"; +["SetHandcuffed", [_target], [_target, true]] call EFUNC(common,targetEvent); diff --git a/addons/captives/functions/fnc_doEscortCaptive.sqf b/addons/captives/functions/fnc_doEscortCaptive.sqf index 05dc912205..d782bd8c62 100644 --- a/addons/captives/functions/fnc_doEscortCaptive.sqf +++ b/addons/captives/functions/fnc_doEscortCaptive.sqf @@ -19,7 +19,7 @@ PARAMS_3(_unit,_target,_state); -if !("ACE_Handcuffed" in ([_target] call ACE_Core_fnc_getCaptivityStatus)) exitWith { +if !("ACE_Handcuffed" in ([_target] call EFUNC(common,getCaptivityStatus))) exitWith { [localize "STR_ACE_Captives_NoCaptive"] call EFUNC(common,displayTextStructured); }; diff --git a/addons/captives/functions/fnc_doLoadCaptive.sqf b/addons/captives/functions/fnc_doLoadCaptive.sqf index 1ef650b4ee..92d1adecf8 100644 --- a/addons/captives/functions/fnc_doLoadCaptive.sqf +++ b/addons/captives/functions/fnc_doLoadCaptive.sqf @@ -21,14 +21,16 @@ PARAMS_3(_unit,_target,_vehicle); if (isNull _target) then { _objects = attachedObjects _unit; - _objects = [_objects, {_this getVariable [QGVAR(isCaptive), false]}] call EFUNC(common,filter); - _target = _objects select 0; + _objects = [_objects, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); + if ((count _objects) > 0) then {_target = _objects select 0;}; }; +if (isNull _target) exitWith {}; if (isNull _vehicle) then { _objects = nearestObjects [_unit, ["Car_F", "Tank_F", "Helicopter_F", "Boat_F", "Plane_F"], 10]; - _vehicle = _objects select 0; + if ((count _objects) > 0) then {_vehicle = _objects select 0;}; }; +if (isNull _vehicle) exitWith {}; if ((!isNil "_target") && {!isNil "_vehicle"}) then { _unit setVariable [QGVAR(isEscorting), false, true]; diff --git a/addons/captives/functions/fnc_doReleaseCaptive.sqf b/addons/captives/functions/fnc_doRemoveHandcuffs.sqf similarity index 76% rename from addons/captives/functions/fnc_doReleaseCaptive.sqf rename to addons/captives/functions/fnc_doRemoveHandcuffs.sqf index a807959565..01ca4ef436 100644 --- a/addons/captives/functions/fnc_doReleaseCaptive.sqf +++ b/addons/captives/functions/fnc_doRemoveHandcuffs.sqf @@ -18,4 +18,4 @@ PARAMS_2(_unit,_target); -["SetCaptive", [_target], [_target, false]] call EFUNC(common,targetEvent); +["SetHandcuffed", [_target], [_target, false]] call EFUNC(common,targetEvent); diff --git a/addons/captives/functions/fnc_doUnloadCaptive.sqf b/addons/captives/functions/fnc_doUnloadCaptive.sqf index 1a6b6a2d0c..b4814fc564 100644 --- a/addons/captives/functions/fnc_doUnloadCaptive.sqf +++ b/addons/captives/functions/fnc_doUnloadCaptive.sqf @@ -22,7 +22,7 @@ private ["_cargo", "_target"]; _cargo = crew _vehicle; // Can also unload from driver, gunner, commander, turret positions. They shouldn't be there anyway. -_cargo = [_cargo, {_this getVariable [QGVAR(isCaptive), false]}] call EFUNC(common,filter); +_cargo = [_cargo, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); if ((count _cargo) > 0) then { _target = _cargo select 0; diff --git a/addons/captives/functions/fnc_handleGetOut.sqf b/addons/captives/functions/fnc_handleGetOut.sqf index 84c856ed39..00368532e7 100644 --- a/addons/captives/functions/fnc_handleGetOut.sqf +++ b/addons/captives/functions/fnc_handleGetOut.sqf @@ -19,12 +19,11 @@ PARAMS_3(_vehicle,_dontcare,_unit); -if ((local _unit)&&(_unit getVariable [QGVAR(isCaptive), false])) then { - +if ((local _unit) && {_unit getVariable [QGVAR(isHandcuffed), false]}) then { private ["_cargoIndex"]; - + _cargoIndex = _unit getVariable ["ACE_Captives_CargoIndex", -1]; - + //If captive was not "unloaded", then move them back into the vehicle. if (_cargoIndex != -1) exitWith { _unit moveInCargo [_vehicle, _cargoIndex]; diff --git a/addons/captives/functions/fnc_handleKilled.sqf b/addons/captives/functions/fnc_handleKilled.sqf index 6e41fa801a..5ac2935a2e 100644 --- a/addons/captives/functions/fnc_handleKilled.sqf +++ b/addons/captives/functions/fnc_handleKilled.sqf @@ -17,8 +17,8 @@ PARAMS_1(_oldUnit); -if (_oldUnit getVariable [QGVAR(isCaptive), false]) then { - _oldUnit setVariable [QGVAR(isCaptive), false, true]; +if (_oldUnit getVariable [QGVAR(isHandcuffed), false]) then { + _oldUnit setVariable [QGVAR(isHandcuffed), false, true]; }; if (_oldUnit getVariable [QGVAR(isEscorting), false]) then { diff --git a/addons/captives/functions/fnc_handlePlayerChanged.sqf b/addons/captives/functions/fnc_handlePlayerChanged.sqf index d7efa70a5f..c3e148d6c4 100644 --- a/addons/captives/functions/fnc_handlePlayerChanged.sqf +++ b/addons/captives/functions/fnc_handlePlayerChanged.sqf @@ -18,7 +18,7 @@ PARAMS_2(_unit,_oldUnit); -if (_unit getVariable [QGVAR(isCaptive), false]) then { +if (_unit getVariable [QGVAR(isHandcuffed), false]) then { showHUD false; } else { showHUD true; diff --git a/addons/captives/functions/fnc_handleUnitInitPost.sqf b/addons/captives/functions/fnc_handleUnitInitPost.sqf index a0e76c0a10..4450378129 100644 --- a/addons/captives/functions/fnc_handleUnitInitPost.sqf +++ b/addons/captives/functions/fnc_handleUnitInitPost.sqf @@ -17,13 +17,13 @@ PARAMS_1(_unit); -// prevent players from throwing grenades -[_unit, "Throw", {(_this select 1) getVariable [QGVAR(isCaptive), false]}, {}] call EFUNC(common,addActionEventhandler); +// prevent players from throwing grenades (added to all units) +[_unit, "Throw", {(_this select 1) getVariable [QGVAR(isHandcuffed), false]}, {}] call EFUNC(common,addActionEventhandler); if (local _unit) then { // reset status on mission start - if (_unit getVariable [QGVAR(isCaptive), false]) then { - _unit setVariable [QGVAR(isCaptive), false]; - [_unit, true] call FUNC(setCaptive); + if (_unit getVariable [QGVAR(isHandcuffed), false]) then { + _unit setVariable [QGVAR(isHandcuffed), false]; + [_unit, true] call FUNC(setHandcuffed); }; }; diff --git a/addons/captives/functions/fnc_handleWokeUp.sqf b/addons/captives/functions/fnc_handleWokeUp.sqf index 2973aa7f83..af59b5c56e 100644 --- a/addons/captives/functions/fnc_handleWokeUp.sqf +++ b/addons/captives/functions/fnc_handleWokeUp.sqf @@ -17,7 +17,7 @@ PARAMS_1(_unit); -if (_unit getVariable [QGVAR(isCaptive), false] && {vehicle _unit == _unit}) then { +if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then { [_unit] call EFUNC(common,fixLoweredRifleAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 0] call EFUNC(common,doAnimation); }; diff --git a/addons/captives/functions/fnc_setCaptive.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf similarity index 60% rename from addons/captives/functions/fnc_setCaptive.sqf rename to addons/captives/functions/fnc_setHandcuffed.sqf index eca34b3bac..94967dfb20 100644 --- a/addons/captives/functions/fnc_setCaptive.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -1,6 +1,6 @@ /* * Author: Nic547, commy2 - * Makes a civilian unable to move. + * Handcuffs a unit * * Arguments: * 0: Unit @@ -18,18 +18,26 @@ PARAMS_2(_unit,_state); -if (!local _unit) exitWith {[[_unit, _state, true], _fnc_scriptName, _unit] call ACE_Core_fnc_execRemoteFnc}; +systemChat format ["set %1", _this]; + +if (!local _unit) exitWith { + ERROR("setHandcuffed unit not local"); +}; + +systemChat format ["set %1 %2 ", _state, (_unit getVariable [QGVAR(isHandcuffed), false])]; + +if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) exitWith { + ERROR("new state equals current"); +}; if (_state) then { - if (_unit getVariable [QGVAR(isCaptive), false]) exitWith {}; - - _unit setVariable [QGVAR(isCaptive), true, true]; + _unit setVariable [QGVAR(isHandcuffed), true, true]; // fix anim on mission start (should work on dedicated servers) _unit spawn { - [_this, "ACE_Handcuffed", true] call ACE_Core_fnc_setCaptivityStatus; + [_this, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); - if (_this getVariable [QGVAR(isCaptive), false] && {vehicle _this == _this}) then { + if (_this getVariable [QGVAR(isHandcuffed), false] && {vehicle _this == _this}) then { [_this] call EFUNC(common,fixLoweredRifleAnimation); [_this, "ACE_AmovPercMstpScapWnonDnon", 0] spawn EFUNC(common,doAnimation); }; @@ -41,10 +49,8 @@ if (_state) then { showHUD false; }; } else { - if !(_unit getVariable [QGVAR(isCaptive), false]) exitWith {}; - - _unit setVariable [QGVAR(isCaptive), false, true]; - [_unit, "ACE_Handcuffed", false] call ACE_Core_fnc_setCaptivityStatus; + _unit setVariable [QGVAR(isHandcuffed), false, true]; + [_unit, "ACE_Handcuffed", false] call EFUNC(common,setCaptivityStatus); if (vehicle _unit == _unit) then { [_unit, "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); }; diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index 3d3b65ec49..69098c19a1 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -24,7 +24,7 @@ if (_state) then { if (_unit getVariable [QGVAR(isSurrender), false]) exitWith {}; _unit setVariable [QGVAR(isSurrender), true, true]; - [_unit, "ACE_Surrendered", true] call ACE_Core_fnc_setCaptivityStatus; + [_unit, "ACE_Surrendered", true] call EFUNC(common,setCaptivityStatus); _unit spawn { // fix for lowered rifle animation glitch @@ -49,7 +49,7 @@ if (_state) then { _this playMoveNow "unconscious"; }; - [_this, "ACE_Surrendered", false] call ACE_Core_fnc_setCaptivityStatus; + [_this, "ACE_Surrendered", false] call EFUNC(common,setCaptivityStatus); if (isPlayer _this) then {showHUD true}; }; From 82a8fc8ca315d21fee1ccf53a204ee093e976bc5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 5 Feb 2015 23:11:28 -0600 Subject: [PATCH 017/166] exceptions --- addons/captives/CfgVehicles.hpp | 17 ++++--- .../functions/fnc_canEscortCaptive.sqf | 2 + .../functions/fnc_canStopEscorting.sqf | 2 +- .../functions/fnc_doEscortCaptive.sqf | 49 +++++++++---------- .../captives/functions/fnc_setHandcuffed.sqf | 5 +- addons/interaction/XEH_clientInit.sqf | 8 +-- 6 files changed, 41 insertions(+), 42 deletions(-) diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index b4a120bc22..8bd97b0b58 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -7,6 +7,7 @@ class CfgVehicles { distance = 4; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs)); statement = QUOTE([ARR_2(_player, _target)] call FUNC(doApplyHandcuffs)); + exceptions[] = {}; showDisabled = 0; priority = 2.4; icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); @@ -17,7 +18,7 @@ class CfgVehicles { distance = 4; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs)); - exceptions[] = {"ACE_Interaction_isNotEscorting"}; + exceptions[] = {}; showDisabled = 0; priority = 2.4; icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); @@ -27,8 +28,8 @@ class CfgVehicles { displayName = "$STR_ACE_Captives_EscortCaptive"; distance = 4; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canEscortCaptive)); - statement = QUOTE([ARR_3(_target, _target, true)] call FUNC(doEscortCaptive)); - exceptions[] = {"ACE_Interaction_isNotEscorting"}; + statement = QUOTE([ARR_3(_player, _target, true)] call FUNC(doEscortCaptive)); + exceptions[] = {}; showDisabled = 0; icon = QUOTE(PATHTOF(UI\captive_ca.paa)); priority = 2.3; @@ -39,7 +40,7 @@ class CfgVehicles { distance = 4; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canStopEscorting)); statement = QUOTE([ARR_3(_player,_target, false)] call FUNC(doEscortCaptive)); - exceptions[] = {"ACE_Interaction_isNotEscorting"}; + exceptions[] = {QGVAR(isNotEscorting)}; showDisabled = 0; icon = QUOTE(PATHTOF(UI\captive_ca.paa)); priority = 2.3; @@ -50,7 +51,7 @@ class CfgVehicles { distance = 4; condition = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(canLoadCaptive)); statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(loadCaptive)); - exceptions[] = {"ACE_Interaction_isNotEscorting"}; + exceptions[] = {QGVAR(isNotEscorting)}; showDisabled = 0; icon = QUOTE(PATHTOF(UI\captive_ca.paa)); priority = 2.2; @@ -73,7 +74,7 @@ class CfgVehicles { displayName = "$STR_ACE_Captives_StopEscorting"; condition = QUOTE([ARR_2(_player, objNull)] call FUNC(canStopEscorting)); statement = QUOTE([ARR_3(_player,objNull, false)] call FUNC(doEscortCaptive)); - exceptions[] = {"ACE_Interaction_isNotEscorting"}; + exceptions[] = {QGVAR(isNotEscorting)}; showDisabled = 0; priority = 2.3; hotkey = "C"; @@ -82,7 +83,7 @@ class CfgVehicles { displayName = "$STR_ACE_Captives_LoadCaptive"; condition = "[_player, objNull, objNull] call ACE_Captives_fnc_canLoadCaptiveIntoVehicle"; statement = "[_player, objNull, objNull] call ACE_Captives_fnc_loadCaptiveIntoVehicle"; - exceptions[] = {"ACE_Interaction_isNotEscorting"}; + exceptions[] = {QGVAR(isNotEscorting)}; showDisabled = 0; priority = 2.2; hotkey = "K"; @@ -97,7 +98,7 @@ class CfgVehicles { distance = 4; \ condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \ statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(loadCaptive)); \ - exceptions[] = {"ACE_Interaction_isNotEscorting"}; \ + exceptions[] = {QGVAR(isNotEscorting)}; \ showDisabled = 0; \ priority = 1.2; \ hotkey = "L"; \ diff --git a/addons/captives/functions/fnc_canEscortCaptive.sqf b/addons/captives/functions/fnc_canEscortCaptive.sqf index 9bcb1d258a..2d2fd5abe4 100644 --- a/addons/captives/functions/fnc_canEscortCaptive.sqf +++ b/addons/captives/functions/fnc_canEscortCaptive.sqf @@ -18,6 +18,8 @@ PARAMS_2(_unit,_target); +//Alive, handcuffed, not being escored, and not unconsious + (_target getVariable [QGVAR(isHandcuffed), false]) && {isNull (attachedTo _target)} && {alive _target} && diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf index 66cf12c9fc..bb48244a25 100644 --- a/addons/captives/functions/fnc_canStopEscorting.sqf +++ b/addons/captives/functions/fnc_canStopEscorting.sqf @@ -23,7 +23,7 @@ private ["_isAttached"]; if (isNull _target) then { - _target = _unit getVariable ["ACE_escortedUnit", objNull]; + _target = _unit getVariable [QGVAR(escortedUnit), objNull]; }; if (isNull _target) exitWith { diff --git a/addons/captives/functions/fnc_doEscortCaptive.sqf b/addons/captives/functions/fnc_doEscortCaptive.sqf index d782bd8c62..72a0cd0c6c 100644 --- a/addons/captives/functions/fnc_doEscortCaptive.sqf +++ b/addons/captives/functions/fnc_doEscortCaptive.sqf @@ -19,38 +19,37 @@ PARAMS_3(_unit,_target,_state); -if !("ACE_Handcuffed" in ([_target] call EFUNC(common,getCaptivityStatus))) exitWith { - [localize "STR_ACE_Captives_NoCaptive"] call EFUNC(common,displayTextStructured); -}; - if (_state) then { - if (_unit getVariable [QGVAR(isEscorting), false]) exitWith {}; + if (_unit getVariable [QGVAR(isEscorting), false]) exitWith {}; - [_unit, _target] call EFUNC(common,claim); - _unit setVariable [QGVAR(isEscorting), true, true]; + [_unit, _target] call EFUNC(common,claim); + _unit setVariable [QGVAR(isEscorting), true, true]; - _target attachTo [_unit, [0, 1, 0]]; + _target attachTo [_unit, [0, 1, 0]]; - _unit setVariable ["ACE_escortedUnit", _target, true]; - _actionID = _unit addAction [format ["%1", localize "STR_ACE_Captives_StopEscorting"], "[_unit getVariable ['ACE_escortedUnit', objNull], false] call ACE_Captives_fnc_escortCaptive;", nil, 20, false, true, "", "!isNull (_unit getVariable ['ACE_escortedUnit', objNull])"]; + _unit setVariable [QGVAR(escortedUnit), _target, true]; - [_target, _actionID] spawn { - _target = _this select 0; - _actionID = _this select 1; + //Add Actionmenu to release captive + _actionID = _unit addAction [format ["%1", localize "STR_ACE_Captives_StopEscorting"], + {[(_this select 0), ((_this select 0) getVariable [QGVAR(escortedUnit), objNull]), false] call FUNC(doEscortCaptive);}, + nil, 20, false, true, "", QUOTE(!isNull (GETVAR(_target,QGVAR(escortedUnit),objNull)))]; - while {_unit getVariable [QGVAR(isEscorting), false]} do { - sleep 0.2; + [_unit, _target, _actionID] spawn { + PARAMS_3(_unit,_target,_actionID); - if (!alive _target || {!alive _unit} || {!canStand _target} || {!canStand _unit} || {_target getVariable ["ACE_isUnconscious", false]} || {_unit getVariable ["ACE_isUnconscious", false]} || {!isNull (attachedTo _unit)}) then { - _unit setVariable [QGVAR(isEscorting), false, true]; - }; + while {_unit getVariable [QGVAR(isEscorting), false]} do { + sleep 0.2; + + if (!alive _target || {!alive _unit} || {!canStand _target} || {!canStand _unit} || {_target getVariable ["ACE_isUnconscious", false]} || {_unit getVariable ["ACE_isUnconscious", false]} || {!isNull (attachedTo _unit)}) then { + _unit setVariable [QGVAR(isEscorting), false, true]; + }; + }; + [objNull, _target] call EFUNC(common,claim); + + detach _target; + _unit removeAction _actionID; }; - [objNull, _target] call EFUNC(common,claim); - - detach _target; - _unit removeAction _actionID; - }; } else { - _unit setVariable [QGVAR(isEscorting), false, true]; - _unit setVariable ["ACE_escortedUnit", objNull, true]; + _unit setVariable [QGVAR(isEscorting), false, true]; + _unit setVariable [QGVAR(escortedUnit), objNull, true]; }; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 94967dfb20..c28a26909f 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -18,14 +18,11 @@ PARAMS_2(_unit,_state); -systemChat format ["set %1", _this]; if (!local _unit) exitWith { ERROR("setHandcuffed unit not local"); }; -systemChat format ["set %1 %2 ", _state, (_unit getVariable [QGVAR(isHandcuffed), false])]; - if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) exitWith { ERROR("new state equals current"); }; @@ -50,7 +47,7 @@ if (_state) then { }; } else { _unit setVariable [QGVAR(isHandcuffed), false, true]; - [_unit, "ACE_Handcuffed", false] call EFUNC(common,setCaptivityStatus); + [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); if (vehicle _unit == _unit) then { [_unit, "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); }; diff --git a/addons/interaction/XEH_clientInit.sqf b/addons/interaction/XEH_clientInit.sqf index bcc3f47def..71be601ac7 100644 --- a/addons/interaction/XEH_clientInit.sqf +++ b/addons/interaction/XEH_clientInit.sqf @@ -20,7 +20,7 @@ GVAR(isOpeningDoor) = false; localize "STR_ACE_Interaction_InteractionMenu", { // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", "ACE_Interaction_isNotEscorting", "ACE_Interaction_isNotSwimming"]; + _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), "ACE_Interaction_isNotSwimming"]; if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; // Conditions: specific if !(isNull (findDisplay 1713999)) exitWith {false}; @@ -38,7 +38,7 @@ GVAR(isOpeningDoor) = false; localize "STR_ACE_Interaction_InteractionMenu", { // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", "ACE_Interaction_isNotEscorting", "ACE_Interaction_isNotSwimming"]; + _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), "ACE_Interaction_isNotSwimming"]; if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; // Conditions: specific if !(!isNull (findDisplay 1713999) && {profileNamespace getVariable [QGVAR(AutoCloseMenu), 0] > 0}) exitWith {false}; @@ -56,7 +56,7 @@ GVAR(isOpeningDoor) = false; localize "STR_ACE_Interaction_InteractionMenuSelf", { // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", "ACE_Interaction_isNotEscorting", "ACE_Interaction_isNotSwimming", "ACE_Common_notOnMap"]; + _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), "ACE_Interaction_isNotSwimming", "ACE_Common_notOnMap"]; if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; // Conditions: specific if !(isNull (findDisplay 1713999)) exitWith {false}; @@ -74,7 +74,7 @@ GVAR(isOpeningDoor) = false; localize "STR_ACE_Interaction_InteractionMenuSelf", { // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", "ACE_Interaction_isNotEscorting", "ACE_Interaction_isNotSwimming"]; + _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), "ACE_Interaction_isNotSwimming"]; if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; // Conditions: specific if !(!isNull (findDisplay 1713999) && {profileNamespace getVariable [QGVAR(AutoCloseMenu), 0] > 0}) exitWith {false}; From 7a3029b9fdbdc5ac21cf546ccac5ea0130f9b17f Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 6 Feb 2015 03:38:27 -0600 Subject: [PATCH 018/166] replace spawns --- addons/captives/CfgEventHandlers.hpp | 2 +- addons/captives/CfgVehicles.hpp | 8 ++-- addons/captives/XEH_postInit.sqf | 32 +++++++++++++ addons/captives/XEH_postInitClient.sqf | 16 ------- .../functions/fnc_canApplyHandcuffs.sqf | 4 +- .../functions/fnc_canEscortCaptive.sqf | 6 +-- .../captives/functions/fnc_canLoadCaptive.sqf | 15 ++++--- .../functions/fnc_canRemoveHandcuffs.sqf | 2 +- .../functions/fnc_doApplyHandcuffs.sqf | 2 +- .../functions/fnc_doEscortCaptive.sqf | 22 +++++---- .../captives/functions/fnc_handleGetOut.sqf | 6 +-- .../captives/functions/fnc_handleKilled.sqf | 4 +- .../functions/fnc_handlePlayerChanged.sqf | 8 ++-- .../functions/fnc_handleUnitInitPost.sqf | 30 ++++++------- .../captives/functions/fnc_setHandcuffed.sqf | 23 +++++----- addons/captives/functions/fnc_surrender.sqf | 45 ++++++++----------- .../functions/fnc_vehicleCaptiveMoveIn.sqf | 2 +- .../functions/fnc_vehicleCaptiveMoveOut.sqf | 2 +- 18 files changed, 123 insertions(+), 106 deletions(-) create mode 100644 addons/captives/XEH_postInit.sqf delete mode 100644 addons/captives/XEH_postInitClient.sqf diff --git a/addons/captives/CfgEventHandlers.hpp b/addons/captives/CfgEventHandlers.hpp index 07dbe45fb7..722750f915 100644 --- a/addons/captives/CfgEventHandlers.hpp +++ b/addons/captives/CfgEventHandlers.hpp @@ -6,7 +6,7 @@ class Extended_PreInit_EventHandlers { class Extended_PostInit_EventHandlers { class ADDON { - clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient)); + init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 8bd97b0b58..65d574fab0 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -50,7 +50,7 @@ class CfgVehicles { displayName = "$STR_ACE_Captives_LoadCaptive"; distance = 4; condition = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(canLoadCaptive)); - statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(loadCaptive)); + statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(doLoadCaptive)); exceptions[] = {QGVAR(isNotEscorting)}; showDisabled = 0; icon = QUOTE(PATHTOF(UI\captive_ca.paa)); @@ -61,7 +61,7 @@ class CfgVehicles { displayName = "$STR_ACE_Captives_FriskPerson"; distance = 2; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canFriskPerson)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(openFriskMenu)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doFriskPerson)); showDisabled = 0; //icon = ""; //@todo priority = 3; @@ -97,7 +97,7 @@ class CfgVehicles { displayName = "$STR_ACE_Captives_LoadCaptive"; \ distance = 4; \ condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \ - statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(loadCaptive)); \ + statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(doLoadCaptive)); \ exceptions[] = {QGVAR(isNotEscorting)}; \ showDisabled = 0; \ priority = 1.2; \ @@ -107,7 +107,7 @@ class CfgVehicles { displayName = "$STR_ACE_Captives_UnloadCaptive"; \ distance = 4; \ condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive)); \ - statement = QUOTE([ARR_2(_player, _target)] call FUNC(unloadCaptive)); \ + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doUnloadCaptive)); \ showDisabled = 0; \ priority = 1.2; \ hotkey = "C"; \ diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf new file mode 100644 index 0000000000..9d1a242d4d --- /dev/null +++ b/addons/captives/XEH_postInit.sqf @@ -0,0 +1,32 @@ +#include "script_component.hpp" + +["playerChanged", {_this call FUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler); +["MoveInCaptive", {_this call FUNC(vehicleCaptiveMoveIn)}] call EFUNC(common,addEventHandler); +["MoveOutCaptive", {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); +["SetHandcuffed", {_this call FUNC(setHandcuffed)}] call EFUNC(common,addEventHandler); + +//Handles when someone starts escorting and then disconnects, leaving the captive attached +//This is normaly handled by the PFEH in doEscortCaptive, but that won't be running if they DC +if (isServer) then { + addMissionEventHandler ["HandleDisconnect", { + PARAMS_1(_disconnectedPlayer); + _escortedUnit = _disconnectedPlayer getVariable [QGVAR(escortedUnit), objNull]; + if ((!isNull _escortedUnit) && {(attachedTo _escortedUnit) == _disconnectedPlayer}) then { + detach _escortedUnit; + systemChat "debug: DC detach"; + }; + if (_disconnectedPlayer getVariable [QGVAR(isEscorting), false]) then { + _disconnectedPlayer setVariable [QGVAR(isEscorting), false, true]; + }; + }]; +}; + +//TODO: Medical Integration Events??? + +// [_unit, "knockedOut", { +// if (local (_this select 0)) then {_this call ACE_Captives_fnc_handleKnockedOut}; +// }] call ACE_Core_fnc_addCustomEventhandler; + +// [_unit, "wokeUp", { +// if (local (_this select 0)) then {_this call ACE_Captives_fnc_handleWokeUp}; +// }] call ACE_Core_fnc_addCustomEventhandler; diff --git a/addons/captives/XEH_postInitClient.sqf b/addons/captives/XEH_postInitClient.sqf deleted file mode 100644 index b55c9eb10c..0000000000 --- a/addons/captives/XEH_postInitClient.sqf +++ /dev/null @@ -1,16 +0,0 @@ -#include "script_component.hpp" - -["playerChanged", {_this call FUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler); -["MoveInCaptive", {_this call FUNC(vehicleCaptiveMoveIn)}] call EFUNC(common,addEventHandler); -["MoveOutCaptive", {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); -["SetHandcuffed", {_this call FUNC(setHandcuffed)}] call EFUNC(common,addEventHandler); - -//TODO: Medical Integration Events??? - -// [_unit, "knockedOut", { - // if (local (_this select 0)) then {_this call ACE_Captives_fnc_handleKnockedOut}; -// }] call ACE_Core_fnc_addCustomEventhandler; - -// [_unit, "wokeUp", { - // if (local (_this select 0)) then {_this call ACE_Captives_fnc_handleWokeUp}; -// }] call ACE_Core_fnc_addCustomEventhandler; diff --git a/addons/captives/functions/fnc_canApplyHandcuffs.sqf b/addons/captives/functions/fnc_canApplyHandcuffs.sqf index 8a3d143e96..8f503d8fd0 100644 --- a/addons/captives/functions/fnc_canApplyHandcuffs.sqf +++ b/addons/captives/functions/fnc_canApplyHandcuffs.sqf @@ -20,6 +20,6 @@ PARAMS_2(_unit,_target); //Player has cableTie, target is alive and not already handcuffed -("ACE_CableTie" in (items _unit)) && -{alive _target} && +("ACE_CableTie" in (items _unit)) && +{alive _target} && {!(_target getVariable [QGVAR(isHandcuffed), false])} diff --git a/addons/captives/functions/fnc_canEscortCaptive.sqf b/addons/captives/functions/fnc_canEscortCaptive.sqf index 2d2fd5abe4..3d026e3d54 100644 --- a/addons/captives/functions/fnc_canEscortCaptive.sqf +++ b/addons/captives/functions/fnc_canEscortCaptive.sqf @@ -20,7 +20,7 @@ PARAMS_2(_unit,_target); //Alive, handcuffed, not being escored, and not unconsious -(_target getVariable [QGVAR(isHandcuffed), false]) && -{isNull (attachedTo _target)} && -{alive _target} && +(_target getVariable [QGVAR(isHandcuffed), false]) && +{isNull (attachedTo _target)} && +{alive _target} && {!(_target getVariable [QGVAR(ACE_isUnconscious), false])} diff --git a/addons/captives/functions/fnc_canLoadCaptive.sqf b/addons/captives/functions/fnc_canLoadCaptive.sqf index 3b1521e2be..902ec36331 100644 --- a/addons/captives/functions/fnc_canLoadCaptive.sqf +++ b/addons/captives/functions/fnc_canLoadCaptive.sqf @@ -4,8 +4,8 @@ * * Arguments: * 0: Unit that wants to load a captive - * 1: A captive. ObjNull for the first escorted captive - * 2: Vehicle to load the captive into. ObjNull for the nearest vehicle + * 1: A captive. ObjNull for the first escorted captive (may be null) + * 2: Vehicle to load the captive into. ObjNull for the nearest vehicle (may be null) * * Return Value: * The return value @@ -24,15 +24,16 @@ PARAMS_3(_unit,_target,_vehicle); if (isNull _target) then { _objects = attachedObjects _unit; _objects = [_objects, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); - _target = _objects select 0; + if ((count _objects) > 0) then {_target = _objects select 0;}; }; if (isNull _vehicle) then { _objects = nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship_F"], 10]; - _vehicle = _objects select 0; + if ((count _objects) > 0) then {_vehicle = _objects select 0;}; }; -_unit getVariable [QGVAR(isEscorting), false] -&& {!isNil "_target"} -&& {!isNil "_vehicle"} +(!isNull _target) +&& {!isNull _vehicle} +&& {_unit getVariable [QGVAR(isEscorting), false]} +&& {_target getVariable [QGVAR(isHandcuffed), false]} && {_vehicle emptyPositions "cargo" > 0} diff --git a/addons/captives/functions/fnc_canRemoveHandcuffs.sqf b/addons/captives/functions/fnc_canRemoveHandcuffs.sqf index f36488fbf1..d36042b0ab 100644 --- a/addons/captives/functions/fnc_canRemoveHandcuffs.sqf +++ b/addons/captives/functions/fnc_canRemoveHandcuffs.sqf @@ -19,5 +19,5 @@ PARAMS_2(_unit,_target); //Unit is handcuffed and not currently being escorted -_target getVariable [QGVAR(isHandcuffed), false] && +_target getVariable [QGVAR(isHandcuffed), false] && {isNull (attachedTo _target)} diff --git a/addons/captives/functions/fnc_doApplyHandcuffs.sqf b/addons/captives/functions/fnc_doApplyHandcuffs.sqf index 9ae82916f7..6c44df3dc5 100644 --- a/addons/captives/functions/fnc_doApplyHandcuffs.sqf +++ b/addons/captives/functions/fnc_doApplyHandcuffs.sqf @@ -18,5 +18,5 @@ PARAMS_2(_unit,_target); -_unit removeItem "ACE_CableTie"; +_unit removeItem "ACE_CableTie"; ["SetHandcuffed", [_target], [_target, true]] call EFUNC(common,targetEvent); diff --git a/addons/captives/functions/fnc_doEscortCaptive.sqf b/addons/captives/functions/fnc_doEscortCaptive.sqf index 72a0cd0c6c..fbbcd09947 100644 --- a/addons/captives/functions/fnc_doEscortCaptive.sqf +++ b/addons/captives/functions/fnc_doEscortCaptive.sqf @@ -34,21 +34,25 @@ if (_state) then { {[(_this select 0), ((_this select 0) getVariable [QGVAR(escortedUnit), objNull]), false] call FUNC(doEscortCaptive);}, nil, 20, false, true, "", QUOTE(!isNull (GETVAR(_target,QGVAR(escortedUnit),objNull)))]; - [_unit, _target, _actionID] spawn { - PARAMS_3(_unit,_target,_actionID); - - while {_unit getVariable [QGVAR(isEscorting), false]} do { - sleep 0.2; - + private "_escortFnc"; + _escortFnc = { + EXPLODE_3_PVT((_this select 0),_unit,_target,_actionID); + if (_unit getVariable [QGVAR(isEscorting), false]) then { if (!alive _target || {!alive _unit} || {!canStand _target} || {!canStand _unit} || {_target getVariable ["ACE_isUnconscious", false]} || {_unit getVariable ["ACE_isUnconscious", false]} || {!isNull (attachedTo _unit)}) then { _unit setVariable [QGVAR(isEscorting), false, true]; }; }; - [objNull, _target] call EFUNC(common,claim); - detach _target; - _unit removeAction _actionID; + if (!(_unit getVariable [QGVAR(isEscorting), false])) then { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + [objNull, _target] call EFUNC(common,claim); + detach _target; + _unit removeAction _actionID; + _unit setVariable [QGVAR(escortedUnit), objNull, true]; + }; }; + [_escortFnc, 0.2, [_unit, _target, _actionID]] call CBA_fnc_addPerFrameHandler; + } else { _unit setVariable [QGVAR(isEscorting), false, true]; _unit setVariable [QGVAR(escortedUnit), objNull, true]; diff --git a/addons/captives/functions/fnc_handleGetOut.sqf b/addons/captives/functions/fnc_handleGetOut.sqf index 00368532e7..b212377dd2 100644 --- a/addons/captives/functions/fnc_handleGetOut.sqf +++ b/addons/captives/functions/fnc_handleGetOut.sqf @@ -21,9 +21,9 @@ PARAMS_3(_vehicle,_dontcare,_unit); if ((local _unit) && {_unit getVariable [QGVAR(isHandcuffed), false]}) then { private ["_cargoIndex"]; - - _cargoIndex = _unit getVariable ["ACE_Captives_CargoIndex", -1]; - + + _cargoIndex = _unit getVariable [QGVAR(CargoIndex), -1]; + //If captive was not "unloaded", then move them back into the vehicle. if (_cargoIndex != -1) exitWith { _unit moveInCargo [_vehicle, _cargoIndex]; diff --git a/addons/captives/functions/fnc_handleKilled.sqf b/addons/captives/functions/fnc_handleKilled.sqf index 5ac2935a2e..219bd2eb60 100644 --- a/addons/captives/functions/fnc_handleKilled.sqf +++ b/addons/captives/functions/fnc_handleKilled.sqf @@ -1,6 +1,6 @@ /* * Author: PabstMirror - * Handles when a unit is kill. Reset captivity and escorting status when getting killed + * Handles when a unit is kill. Reset captivity and escorting status * * Arguments: * 0: _oldUnit @@ -22,5 +22,5 @@ if (_oldUnit getVariable [QGVAR(isHandcuffed), false]) then { }; if (_oldUnit getVariable [QGVAR(isEscorting), false]) then { - _oldUnit setVariable [QGVAR(isEscorting), false, true] + _oldUnit setVariable [QGVAR(isEscorting), false, true]; }; diff --git a/addons/captives/functions/fnc_handlePlayerChanged.sqf b/addons/captives/functions/fnc_handlePlayerChanged.sqf index c3e148d6c4..af6472c211 100644 --- a/addons/captives/functions/fnc_handlePlayerChanged.sqf +++ b/addons/captives/functions/fnc_handlePlayerChanged.sqf @@ -1,9 +1,9 @@ /* * Author: commy2 - * TODO + * Handles playerChanged. Resets "showHUD" based on handcuff status * * Arguments: - * 0: _unit + * 0: _newUnit * 1: _oldUnit * * Return Value: @@ -16,9 +16,9 @@ */ #include "script_component.hpp" -PARAMS_2(_unit,_oldUnit); +PARAMS_2(_newUnit,_oldUnit); -if (_unit getVariable [QGVAR(isHandcuffed), false]) then { +if (_newUnit getVariable [QGVAR(isHandcuffed), false]) then { showHUD false; } else { showHUD true; diff --git a/addons/captives/functions/fnc_handleUnitInitPost.sqf b/addons/captives/functions/fnc_handleUnitInitPost.sqf index 4450378129..d34eebeb4a 100644 --- a/addons/captives/functions/fnc_handleUnitInitPost.sqf +++ b/addons/captives/functions/fnc_handleUnitInitPost.sqf @@ -1,24 +1,24 @@ /* -* Author: commy2 -* handle captive and unconsciousness state and prevent grenades -* -* Arguments: -* 0: _unit -* -* Return Value: -* The return value -* -* Example: -* TODO -* -* Public: No -*/ + * Author: commy2 + * handle captive and unconsciousness state and prevent grenades + * + * Arguments: + * 0: _unit + * + * Return Value: + * The return value + * + * Example: + * TODO + * + * Public: No + */ #include "script_component.hpp" PARAMS_1(_unit); // prevent players from throwing grenades (added to all units) -[_unit, "Throw", {(_this select 1) getVariable [QGVAR(isHandcuffed), false]}, {}] call EFUNC(common,addActionEventhandler); +[_unit, "Throw", {(_this select 1) getVariable [QGVAR(isHandcuffed), false]}, {hint format ["%1 - debug throw prevented",time];}] call EFUNC(common,addActionEventhandler); if (local _unit) then { // reset status on mission start diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index c28a26909f..98a12168d3 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -29,31 +29,34 @@ if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) exitWith if (_state) then { _unit setVariable [QGVAR(isHandcuffed), true, true]; + [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); // fix anim on mission start (should work on dedicated servers) - _unit spawn { - [_this, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); - if (_this getVariable [QGVAR(isHandcuffed), false] && {vehicle _this == _this}) then { - [_this] call EFUNC(common,fixLoweredRifleAnimation); - [_this, "ACE_AmovPercMstpScapWnonDnon", 0] spawn EFUNC(common,doAnimation); + _fixAnimationFnc = { + PARAMS_1(_unit); + if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then { + [_unit] call EFUNC(common,fixLoweredRifleAnimation); + [_unit, "ACE_AmovPercMstpScapWnonDnon", 0] call EFUNC(common,doAnimation); }; }; - _unit setVariable ["ACE_Captives_CargoIndex", vehicle _unit getCargoIndex _unit, true]; + [_fixAnimationFnc, [_unit], 0.05, 0] call EFUNC(common,waitAndExecute); + + _unit setVariable [QGVAR(CargoIndex), ((vehicle _unit) getCargoIndex _unit), true]; if (_unit == ACE_player) then { showHUD false; }; } else { _unit setVariable [QGVAR(isHandcuffed), false, true]; - [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); - if (vehicle _unit == _unit) then { + [_unit, QGVAR(Handcuffed), false] call EFUNC(common,setCaptivityStatus); + if ((vehicle _unit) == _unit) then { [_unit, "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); }; - if (_unit getVariable ["ACE_Captives_CargoIndex", -1] != -1) then { - _unit setVariable ["ACE_Captives_CargoIndex", -1, true]; + if (_unit getVariable [QGVAR(CargoIndex), -1] != -1) then { + _unit setVariable [QGVAR(CargoIndex), -1, true]; }; if (_unit == ACE_player) then { diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index 69098c19a1..7c5adc08de 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -26,38 +26,31 @@ if (_state) then { _unit setVariable [QGVAR(isSurrender), true, true]; [_unit, "ACE_Surrendered", true] call EFUNC(common,setCaptivityStatus); - _unit spawn { - // fix for lowered rifle animation glitch - if (currentWeapon _this != "" && {currentWeapon _this == primaryWeapon _this} && {weaponLowered _this} && {stance _this == "STAND"}) then { - _this playMove "amovpercmstpsraswrfldnon"; - }; - while {_this getVariable [QGVAR(isSurrender), false]} do { - sleep 0.001; //sleep in UI - - if (isPlayer _this) then {showHUD false}; - - if (!alive _this || {_this getVariable ["ACE_isUnconscious", false]}) then { - _this setVariable [QGVAR(isSurrender), false, true]; + private "_surrenderFnc"; + _surrenderFnc = { + EXPLODE_1_PVT((_this select 0),_unit); + if (_unit getVariable [QGVAR(isSurrender), false]) then { + if ((!alive _unit) || {_unit getVariable ["ACE_isUnconscious", false]} || {_unit getVariable [QGVAR(isHandcuffed), false]}) then { + _unit setVariable [QGVAR(isSurrender), false, true]; } else { - _this playMove "amovpercmstpsnonwnondnon_amovpercmstpssurwnondnon"; + [_unit, "amovpercmstpsnonwnondnon_amovpercmstpssurwnondnon", 0] call EFUNC(common,doAnimation); }; }; - if !(_this getVariable ["ACE_isUnconscious", false]) then { - _this playMoveNow "AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon"; - } else { - _this playMoveNow "unconscious"; + + if (!(_unit getVariable [QGVAR(isSurrender), false])) then { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + + if !(_unit getVariable ["ACE_isUnconscious", false]) then { + [_unit, "AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 1] call EFUNC(common,doAnimation); + } else { + [_unit, "unconscious", 1] call EFUNC(common,doAnimation); + }; + [_unit, "ACE_Surrendered", false] call EFUNC(common,setCaptivityStatus); + if (isPlayer _unit) then {showHUD true}; }; - - [_this, "ACE_Surrendered", false] call EFUNC(common,setCaptivityStatus); - - if (isPlayer _this) then {showHUD true}; }; + [_surrenderFnc, 0.0, [_unit]] call CBA_fnc_addPerFrameHandler; } else { _unit setVariable [QGVAR(isSurrender), false, true]; }; - -/* -player playMove "AmovPercMstpSsurWnonDnon" -player switchMove "AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon" - */ diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf index fe4d0528c6..dd3b6e6818 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf @@ -23,6 +23,6 @@ private ["_cargoIndex"]; _target moveInCargo _vehicle; _target assignAsCargo _vehicle; _cargoIndex = _vehicle getCargoIndex _target; -_target setVariable ["ACE_Captives_CargoIndex", _cargoIndex, true]; +_target setVariable [QGVAR(CargoIndex), _cargoIndex, true]; TRACE_3("moveinEH",_target,_vehicle,_cargoIndex); diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf index 0a10572909..4210e8da15 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf @@ -17,7 +17,7 @@ PARAMS_1(_unit); -_unit setVariable ["ACE_Captives_CargoIndex", -1, true]; +_unit setVariable [QGVAR(CargoIndex), -1, true]; moveOut _unit; [_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); From 98564fae683a212798f3c29542972cbefa40d20e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 6 Feb 2015 15:54:26 -0600 Subject: [PATCH 019/166] Surrendering --- addons/captives/CfgMoves.hpp | 79 ++++++++----------- addons/captives/CfgVehicles.hpp | 25 +++--- addons/captives/XEH_preInit.sqf | 1 + addons/captives/config.cpp | 2 +- .../captives/functions/fnc_canSurrender.sqf | 22 ++++++ .../functions/fnc_handleUnitInitPost.sqf | 7 +- .../captives/functions/fnc_setHandcuffed.sqf | 1 - addons/captives/functions/fnc_surrender.sqf | 51 ++++++------ addons/captives/stringtable.xml | 12 ++- addons/interaction/XEH_clientInit.sqf | 4 +- 10 files changed, 121 insertions(+), 83 deletions(-) create mode 100644 addons/captives/functions/fnc_canSurrender.sqf diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp index ab379de6ae..bb6b8669e0 100644 --- a/addons/captives/CfgMoves.hpp +++ b/addons/captives/CfgMoves.hpp @@ -1,7 +1,7 @@ class CfgMovesBasic { class Actions { class CivilStandActions; - class ACE_CivilStandCaptiveActions: CivilStandActions { + class ACE_CivilStandHandcuffedActions: CivilStandActions { turnL = ""; turnR = ""; stop = "ACE_AmovPercMstpScapWnonDnon"; @@ -11,6 +11,11 @@ class CfgMovesBasic { throwPrepare = ""; throwGrenade[] = {"","Gesture"}; }; + class ACE_CivilStandSurrenderActions: ACE_CivilStandHandcuffedActions { + stop = "ACE_AmovPercMstpScapWnonDnon"; + StopRelaxed = "ACE_AmovPercMstpScapWnonDnon"; + default = "ACE_AmovPercMstpScapWnonDnon"; + }; }; }; @@ -18,12 +23,14 @@ class CfgMovesMaleSdr: CfgMovesBasic { class StandBase; class States { class AmovPercMstpSnonWnonDnon: StandBase { - ConnectTo[] += {"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1}; + ConnectTo[] += {"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon",0.1}; }; class CutSceneAnimationBase; + + //Handcuffed Anims: class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon: CutSceneAnimationBase { - actions = "ACE_CivilStandCaptiveActions"; + actions = "ACE_CivilStandHandcuffedActions"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_EaseIn"; speed = 1; looped = 0; @@ -31,7 +38,6 @@ class CfgMovesMaleSdr: CfgMovesBasic { ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; }; - class ACE_AmovPercMstpScapWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon { file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_Ease"; speed = 0; @@ -39,52 +45,37 @@ class CfgMovesMaleSdr: CfgMovesBasic { InterpolateTo[] = {"Unconscious",0.01}; looped = 1; }; - 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}; }; + + //Surrender Anims: + class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon: CutSceneAnimationBase { + actions = "ACE_CivilStandSurrenderActions"; + file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon"; + speed = 1; + looped = 0; + interpolationRestart = 2; + ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon",0.1}; + InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; + }; + class ACE_AmovPercMstpSsurWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { + file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon"; + speed = 0; + looped = 1; + ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; + InterpolateTo[] = {"Unconscious",0.01}; + }; + class ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { + speed = 0.4; //for gameplay reasons, slow this down + actions = "CivilStandActions"; + 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}; + }; }; }; -/* -player playMove "ACE_AmovPercMstpScapWnonDnon"; -player switchMove "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon"; - */ - -/*class CfgMovesBasic; -class CfgMovesMaleSdr: CfgMovesBasic { -class States { - class CutSceneAnimationBase; - class AmovPercMstpSnonWnonDnon_EaseIn: CutSceneAnimationBase { - head = "headDefault"; - static = 1; - disableWeapons = 0; - forceAim = 0; - InterpolateTo[] = {"AmovPercMstpSnonWnonDnon_EaseOut",0.02,"Unconscious",0.1}; - }; - class AmovPercMstpSnonWnonDnon_Ease: AmovPercMstpSnonWnonDnon_EaseIn { - looped = 1; - InterpolateTo[] = {"Unconscious",0.1}; - }; - class AmovPercMstpSnonWnonDnon_EaseOut: AmovPercMstpSnonWnonDnon_EaseIn { - InterpolateTo[] = {"AmovPercMstpSnonWnonDnon_EaseIn",0.02,"Unconscious",0.1}; - }; - - class AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon: CutSceneAnimationBase { - InterpolateTo[] = {"Unconscious",0.01,"AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; - }; - - class AmovPercMstpSsurWnonDnon: AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { - looped = 1; - InterpolateTo[] = {"Unconscious",0.01}; - }; - - class AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { - InterpolateTo[] = {"Unconscious",0.01,"AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon",0.1}; - }; -}; -};*/ - diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 65d574fab0..934e1215d2 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -78,16 +78,23 @@ class CfgVehicles { showDisabled = 0; priority = 2.3; hotkey = "C"; + }; + class ACE_StartSurrenderingSelf { + displayName = "$STR_ACE_Captives_StartSurrendering"; + condition = QUOTE([ARR_2(_player, true)] call FUNC(canSurrender)); + statement = QUOTE([ARR_2(_player, true)] call FUNC(surrender)); + exceptions[] = {}; + showDisabled = 0; + priority = 0; + }; + class ACE_StopSurrenderingSelf { + displayName = "$STR_ACE_Captives_StopSurrendering"; + condition = QUOTE([ARR_2(_player, false)] call FUNC(canSurrender)); + statement = QUOTE([ARR_2(_player, false)] call FUNC(surrender)); + exceptions[] = {QGVAR(isNotSurrendering)}; + showDisabled = 0; + priority = 0; }; - /*class ACE_LoadCaptiveSelf { - displayName = "$STR_ACE_Captives_LoadCaptive"; - condition = "[_player, objNull, objNull] call ACE_Captives_fnc_canLoadCaptiveIntoVehicle"; - statement = "[_player, objNull, objNull] call ACE_Captives_fnc_loadCaptiveIntoVehicle"; - exceptions[] = {QGVAR(isNotEscorting)}; - showDisabled = 0; - priority = 2.2; - hotkey = "K"; - };*/ }; }; diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index e894cd1c31..a98bf73443 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -8,6 +8,7 @@ PREP(canFriskPerson); PREP(canLoadCaptive); PREP(canRemoveHandcuffs); PREP(canStopEscorting); +PREP(canSurrender); PREP(canUnloadCaptive); PREP(doApplyHandcuffs); PREP(doEscortCaptive); diff --git a/addons/captives/config.cpp b/addons/captives/config.cpp index bceeda3b2b..c0a34e3222 100644 --- a/addons/captives/config.cpp +++ b/addons/captives/config.cpp @@ -26,6 +26,6 @@ class ACE_canInteractConditions { condition = QUOTE(!(GETVAR(player,QGVAR(isHandcuffed),false))); }; class GVAR(isNotSurrendering) { - condition = QUOTE(!(GETVAR(player,QGVAR(isSurrender),false))); + condition = QUOTE(!(GETVAR(player,QGVAR(isSurrendering),false))); }; }; diff --git a/addons/captives/functions/fnc_canSurrender.sqf b/addons/captives/functions/fnc_canSurrender.sqf new file mode 100644 index 0000000000..60dcd7c938 --- /dev/null +++ b/addons/captives/functions/fnc_canSurrender.sqf @@ -0,0 +1,22 @@ +/* + * Author: PabstMirror + * Checks the conditions for being able to surrender + * + * Arguments: + * 0: caller (player) + * 1: New Surrender State to test + * + * Return Value: + * The return value + * + * Example: + * [player, true] call ACE_captives_fnc_canSurrender; + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_newSurrenderState); + +//TODO: any other conditions?? +(!((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _newSurrenderState)) diff --git a/addons/captives/functions/fnc_handleUnitInitPost.sqf b/addons/captives/functions/fnc_handleUnitInitPost.sqf index d34eebeb4a..635d7b0439 100644 --- a/addons/captives/functions/fnc_handleUnitInitPost.sqf +++ b/addons/captives/functions/fnc_handleUnitInitPost.sqf @@ -18,7 +18,7 @@ PARAMS_1(_unit); // prevent players from throwing grenades (added to all units) -[_unit, "Throw", {(_this select 1) getVariable [QGVAR(isHandcuffed), false]}, {hint format ["%1 - debug throw prevented",time];}] call EFUNC(common,addActionEventhandler); +[_unit, "Throw", {((_this select 1) getVariable [QGVAR(isHandcuffed), false]) || {(_this select 1) getVariable [QGVAR(isSurrendering), false]}}, {}] call EFUNC(common,addActionEventhandler); if (local _unit) then { // reset status on mission start @@ -26,4 +26,9 @@ if (local _unit) then { _unit setVariable [QGVAR(isHandcuffed), false]; [_unit, true] call FUNC(setHandcuffed); }; + + if (_unit getVariable [QGVAR(isSurrendering), false]) then { + _unit setVariable [QGVAR(isSurrendering), false]; + [_unit, true] call FUNC(surrender); + }; }; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 98a12168d3..1be72ca7c9 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -32,7 +32,6 @@ if (_state) then { [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); // fix anim on mission start (should work on dedicated servers) - _fixAnimationFnc = { PARAMS_1(_unit); if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then { diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index 7c5adc08de..bb782d85da 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -1,6 +1,6 @@ /* - * Author: commy2 - * TODO + * Author: commy2 PabstMirror + * Lets a unit surrender * * Arguments: * 0: Unit @@ -18,39 +18,42 @@ PARAMS_2(_unit,_state); -if (!local _unit) exitWith {[_this, _fnc_scriptName, _unit] call ACE_Core_fnc_execRemoteFnc}; - if (_state) then { - if (_unit getVariable [QGVAR(isSurrender), false]) exitWith {}; - - _unit setVariable [QGVAR(isSurrender), true, true]; - [_unit, "ACE_Surrendered", true] call EFUNC(common,setCaptivityStatus); + if (_unit getVariable [QGVAR(isSurrendering), false]) exitWith {}; + _unit setVariable [QGVAR(isSurrendering), true, true]; + [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); + [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); private "_surrenderFnc"; _surrenderFnc = { EXPLODE_1_PVT((_this select 0),_unit); - if (_unit getVariable [QGVAR(isSurrender), false]) then { + + if (_unit getVariable [QGVAR(isSurrendering), false]) then { if ((!alive _unit) || {_unit getVariable ["ACE_isUnconscious", false]} || {_unit getVariable [QGVAR(isHandcuffed), false]}) then { - _unit setVariable [QGVAR(isSurrender), false, true]; - } else { - [_unit, "amovpercmstpsnonwnondnon_amovpercmstpssurwnondnon", 0] call EFUNC(common,doAnimation); + [_unit, false] call FUNC(surrender); + [(_this select 1)] call cba_fnc_removePerFrameHandler; }; - }; - - if (!(_unit getVariable [QGVAR(isSurrender), false])) then { + } else { [(_this select 1)] call cba_fnc_removePerFrameHandler; - - if !(_unit getVariable ["ACE_isUnconscious", false]) then { - [_unit, "AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 1] call EFUNC(common,doAnimation); - } else { - [_unit, "unconscious", 1] call EFUNC(common,doAnimation); - }; - [_unit, "ACE_Surrendered", false] call EFUNC(common,setCaptivityStatus); - if (isPlayer _unit) then {showHUD true}; }; }; [_surrenderFnc, 0.0, [_unit]] call CBA_fnc_addPerFrameHandler; } else { - _unit setVariable [QGVAR(isSurrender), false, true]; + _unit setVariable [QGVAR(isSurrendering), false, true]; + + if !(_unit getVariable ["ACE_isUnconscious", false]) then { + //Break out of hands up animation loop + //don't want to step on animations from medical (TODO: testing medical integration) + [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + }; + + [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); + + if (_unit == ACE_player) then { + //only enable if not handcuffed + if (!(_unit getVariable [QGVAR(isHandcuffed), false])) then { + showHUD true; + }; + }; }; diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index eaf63b2d41..7d8096b3e6 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -1,5 +1,5 @@  - + @@ -71,6 +71,7 @@ Naložit zajatce Fogoly berakása Загрузить пленного + Embarcar Prisioneiro Unload Captive @@ -81,6 +82,7 @@ Vyložit zajatce Fogoly kivevése Выгрузить пленного + Desembarcar Prisioneiro Cable Tie @@ -115,6 +117,7 @@ Inventář prohledávané osoby Ekwipunek rewidowanej osoby Инвентарь обысканных лиц + Inventário da pessoa revistada Frisk person @@ -125,6 +128,13 @@ Rewiduj osobę Motozás Обыскать человека + Revistar + + + Surrender + + + Stop Surrendering \ No newline at end of file diff --git a/addons/interaction/XEH_clientInit.sqf b/addons/interaction/XEH_clientInit.sqf index 71be601ac7..1c314078a4 100644 --- a/addons/interaction/XEH_clientInit.sqf +++ b/addons/interaction/XEH_clientInit.sqf @@ -56,7 +56,7 @@ GVAR(isOpeningDoor) = false; localize "STR_ACE_Interaction_InteractionMenuSelf", { // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), "ACE_Interaction_isNotSwimming", "ACE_Common_notOnMap"]; + _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), QEGVAR(captives,isNotSurrendering), "ACE_Interaction_isNotSwimming", "ACE_Common_notOnMap"]; if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; // Conditions: specific if !(isNull (findDisplay 1713999)) exitWith {false}; @@ -74,7 +74,7 @@ GVAR(isOpeningDoor) = false; localize "STR_ACE_Interaction_InteractionMenuSelf", { // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), "ACE_Interaction_isNotSwimming"]; + _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), QEGVAR(captives,isNotSurrendering), "ACE_Interaction_isNotSwimming"]; if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; // Conditions: specific if !(!isNull (findDisplay 1713999) && {profileNamespace getVariable [QGVAR(AutoCloseMenu), 0] > 0}) exitWith {false}; From c117e9bf160e293239561946014e0b244928bcca Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 6 Feb 2015 17:03:56 -0600 Subject: [PATCH 020/166] Header Examples --- addons/captives/functions/fnc_canApplyHandcuffs.sqf | 2 +- addons/captives/functions/fnc_canEscortCaptive.sqf | 4 ++-- addons/captives/functions/fnc_canFriskPerson.sqf | 2 +- addons/captives/functions/fnc_canLoadCaptive.sqf | 2 +- addons/captives/functions/fnc_canRemoveHandcuffs.sqf | 2 +- addons/captives/functions/fnc_canStopEscorting.sqf | 3 +-- addons/captives/functions/fnc_canSurrender.sqf | 2 +- addons/captives/functions/fnc_canUnloadCaptive.sqf | 2 +- addons/captives/functions/fnc_doApplyHandcuffs.sqf | 2 +- addons/captives/functions/fnc_doEscortCaptive.sqf | 2 +- addons/captives/functions/fnc_doFriskPerson.sqf | 2 +- addons/captives/functions/fnc_doLoadCaptive.sqf | 2 +- addons/captives/functions/fnc_doRemoveHandcuffs.sqf | 7 +++---- addons/captives/functions/fnc_doUnloadCaptive.sqf | 2 +- addons/captives/functions/fnc_handleGetIn.sqf | 2 +- addons/captives/functions/fnc_handleGetOut.sqf | 4 ++-- addons/captives/functions/fnc_handleKilled.sqf | 6 +++++- .../captives/functions/fnc_handlePlayerChanged.sqf | 4 ++-- addons/captives/functions/fnc_handleUnitInitPost.sqf | 2 +- addons/captives/functions/fnc_handleWokeUp.sqf | 2 +- addons/captives/functions/fnc_setHandcuffed.sqf | 2 +- addons/captives/functions/fnc_surrender.sqf | 12 +++++++++--- .../captives/functions/fnc_vehicleCaptiveMoveIn.sqf | 4 +--- .../captives/functions/fnc_vehicleCaptiveMoveOut.sqf | 4 ++-- 24 files changed, 42 insertions(+), 36 deletions(-) diff --git a/addons/captives/functions/fnc_canApplyHandcuffs.sqf b/addons/captives/functions/fnc_canApplyHandcuffs.sqf index 8f503d8fd0..f69bb2544d 100644 --- a/addons/captives/functions/fnc_canApplyHandcuffs.sqf +++ b/addons/captives/functions/fnc_canApplyHandcuffs.sqf @@ -10,7 +10,7 @@ * The return value * * Example: - * - + * [player, bob] call ACE_captives_fnc_canApplyHandcuffs * * Public: No */ diff --git a/addons/captives/functions/fnc_canEscortCaptive.sqf b/addons/captives/functions/fnc_canEscortCaptive.sqf index 3d026e3d54..cbb098881f 100644 --- a/addons/captives/functions/fnc_canEscortCaptive.sqf +++ b/addons/captives/functions/fnc_canEscortCaptive.sqf @@ -4,13 +4,13 @@ * * Arguments: * 0: caller (player) - * 1: target + * 1: target * * Return Value: * The return value * * Example: - * - + * [player, bob] call ACE_captives_fnc_canEscortCaptive * * Public: No */ diff --git a/addons/captives/functions/fnc_canFriskPerson.sqf b/addons/captives/functions/fnc_canFriskPerson.sqf index 9bbf5389c3..28a9ee0134 100644 --- a/addons/captives/functions/fnc_canFriskPerson.sqf +++ b/addons/captives/functions/fnc_canFriskPerson.sqf @@ -10,7 +10,7 @@ * The return value * * Example: - * - + * [player, bob] call ACE_captives_fnc_canFriskPerson * * Public: No */ diff --git a/addons/captives/functions/fnc_canLoadCaptive.sqf b/addons/captives/functions/fnc_canLoadCaptive.sqf index 902ec36331..04b33ad42d 100644 --- a/addons/captives/functions/fnc_canLoadCaptive.sqf +++ b/addons/captives/functions/fnc_canLoadCaptive.sqf @@ -11,7 +11,7 @@ * The return value * * Example: - * - + * [player, bob] call ACE_captives_fnc_canLoadCaptive * * Public: No */ diff --git a/addons/captives/functions/fnc_canRemoveHandcuffs.sqf b/addons/captives/functions/fnc_canRemoveHandcuffs.sqf index d36042b0ab..4642cd90fd 100644 --- a/addons/captives/functions/fnc_canRemoveHandcuffs.sqf +++ b/addons/captives/functions/fnc_canRemoveHandcuffs.sqf @@ -10,7 +10,7 @@ * The return value * * Example: - * - + * [player, bob] call ACE_captives_fnc_canRemoveHandcuffs * * Public: No */ diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf index bb48244a25..e6a5a0e568 100644 --- a/addons/captives/functions/fnc_canStopEscorting.sqf +++ b/addons/captives/functions/fnc_canStopEscorting.sqf @@ -10,7 +10,7 @@ * The return value * * Example: - * - + * [player, bob] call ACE_captives_fnc_canStopEscorting * * Public: No */ @@ -21,7 +21,6 @@ DEFAULT_PARAM(1,_target,objNull); private ["_isAttached"]; - if (isNull _target) then { _target = _unit getVariable [QGVAR(escortedUnit), objNull]; }; diff --git a/addons/captives/functions/fnc_canSurrender.sqf b/addons/captives/functions/fnc_canSurrender.sqf index 60dcd7c938..238087c62b 100644 --- a/addons/captives/functions/fnc_canSurrender.sqf +++ b/addons/captives/functions/fnc_canSurrender.sqf @@ -10,7 +10,7 @@ * The return value * * Example: - * [player, true] call ACE_captives_fnc_canSurrender; + * [Jean, true] call ACE_captives_fnc_canSurrender; * * Public: No */ diff --git a/addons/captives/functions/fnc_canUnloadCaptive.sqf b/addons/captives/functions/fnc_canUnloadCaptive.sqf index 3e014d72c7..a86bdae588 100644 --- a/addons/captives/functions/fnc_canUnloadCaptive.sqf +++ b/addons/captives/functions/fnc_canUnloadCaptive.sqf @@ -11,7 +11,7 @@ * The return value * * Example: - * - + * [player, bob, car1] call ACE_captives_fnc_canUnloadCaptive; * * Public: No */ diff --git a/addons/captives/functions/fnc_doApplyHandcuffs.sqf b/addons/captives/functions/fnc_doApplyHandcuffs.sqf index 6c44df3dc5..8abf8c836c 100644 --- a/addons/captives/functions/fnc_doApplyHandcuffs.sqf +++ b/addons/captives/functions/fnc_doApplyHandcuffs.sqf @@ -10,7 +10,7 @@ * The return value * * Example: - * - + * [player, bob] call ACE_captives_fnc_doApplyHandcuffs; * * Public: No */ diff --git a/addons/captives/functions/fnc_doEscortCaptive.sqf b/addons/captives/functions/fnc_doEscortCaptive.sqf index fbbcd09947..299aa81631 100644 --- a/addons/captives/functions/fnc_doEscortCaptive.sqf +++ b/addons/captives/functions/fnc_doEscortCaptive.sqf @@ -11,7 +11,7 @@ * The return value * * Example: - * - + * [player, bob, true] call ACE_captives_fnc_doEscorteCaptive; * * Public: No */ diff --git a/addons/captives/functions/fnc_doFriskPerson.sqf b/addons/captives/functions/fnc_doFriskPerson.sqf index d69dbd045c..14b18ffd0e 100644 --- a/addons/captives/functions/fnc_doFriskPerson.sqf +++ b/addons/captives/functions/fnc_doFriskPerson.sqf @@ -10,7 +10,7 @@ * Nothing * * Example: - * TODO + * [player, bob] call ACE_captives_fnc_doFristPerson; * * Public: No */ diff --git a/addons/captives/functions/fnc_doLoadCaptive.sqf b/addons/captives/functions/fnc_doLoadCaptive.sqf index 92d1adecf8..9fd65a130d 100644 --- a/addons/captives/functions/fnc_doLoadCaptive.sqf +++ b/addons/captives/functions/fnc_doLoadCaptive.sqf @@ -11,7 +11,7 @@ * Nothing * * Example: - * TODO + * [bob, tom, car] call ACE_captives_fnc_doLoadCaptive * * Public: No */ diff --git a/addons/captives/functions/fnc_doRemoveHandcuffs.sqf b/addons/captives/functions/fnc_doRemoveHandcuffs.sqf index 01ca4ef436..a69decf620 100644 --- a/addons/captives/functions/fnc_doRemoveHandcuffs.sqf +++ b/addons/captives/functions/fnc_doRemoveHandcuffs.sqf @@ -1,16 +1,15 @@ /* * Author: PabstMirror - * Release a captive + * Remove handcuffs from a target * * Arguments: - * 0: caller (player) - * 1: target + * 0: target * * Return Value: * The return value * * Example: - * - + * [bob, false] call ACE_captives_fnc_doRemoveHandcuffs * * Public: No */ diff --git a/addons/captives/functions/fnc_doUnloadCaptive.sqf b/addons/captives/functions/fnc_doUnloadCaptive.sqf index b4814fc564..b7fa57a7bb 100644 --- a/addons/captives/functions/fnc_doUnloadCaptive.sqf +++ b/addons/captives/functions/fnc_doUnloadCaptive.sqf @@ -10,7 +10,7 @@ * Nothing * * Example: - * TODO + * [bob, car] call ACE_captives_fnc_doUnloadCaptive * * Public: No */ diff --git a/addons/captives/functions/fnc_handleGetIn.sqf b/addons/captives/functions/fnc_handleGetIn.sqf index eb3a9ad8b1..54133e2362 100644 --- a/addons/captives/functions/fnc_handleGetIn.sqf +++ b/addons/captives/functions/fnc_handleGetIn.sqf @@ -11,7 +11,7 @@ * The return value * * Example: - * - + * [car2, x, player] call ACE_captives_fnc_handleGetIn * * Public: No */ diff --git a/addons/captives/functions/fnc_handleGetOut.sqf b/addons/captives/functions/fnc_handleGetOut.sqf index b212377dd2..4bf9a1fa19 100644 --- a/addons/captives/functions/fnc_handleGetOut.sqf +++ b/addons/captives/functions/fnc_handleGetOut.sqf @@ -11,7 +11,7 @@ * The return value * * Example: - * - + * [car2, x, player] call ACE_captives_fnc_handleGetOut * * Public: No */ @@ -30,4 +30,4 @@ if ((local _unit) && {_unit getVariable [QGVAR(isHandcuffed), false]}) then { }; [_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); -}; \ No newline at end of file +}; diff --git a/addons/captives/functions/fnc_handleKilled.sqf b/addons/captives/functions/fnc_handleKilled.sqf index 219bd2eb60..9e9c5e1ac8 100644 --- a/addons/captives/functions/fnc_handleKilled.sqf +++ b/addons/captives/functions/fnc_handleKilled.sqf @@ -9,7 +9,7 @@ * None * * Example: - * - + * [bob1] call ACE_captives_fnc_handleKilled * * Public: No */ @@ -24,3 +24,7 @@ if (_oldUnit getVariable [QGVAR(isHandcuffed), false]) then { if (_oldUnit getVariable [QGVAR(isEscorting), false]) then { _oldUnit setVariable [QGVAR(isEscorting), false, true]; }; + +if (_oldUnit getVariable [QGVAR(isSurrendering), false]) then { + _oldUnit setVariable [QGVAR(isSurrendering), false, true]; +}; diff --git a/addons/captives/functions/fnc_handlePlayerChanged.sqf b/addons/captives/functions/fnc_handlePlayerChanged.sqf index af6472c211..9c4f02546f 100644 --- a/addons/captives/functions/fnc_handlePlayerChanged.sqf +++ b/addons/captives/functions/fnc_handlePlayerChanged.sqf @@ -10,7 +10,7 @@ * The return value * * Example: - * TODO + * [bob1, bob2] call ACE_captives_fnc_handlePlayerChange * * Public: No */ @@ -18,7 +18,7 @@ PARAMS_2(_newUnit,_oldUnit); -if (_newUnit getVariable [QGVAR(isHandcuffed), false]) then { +if ((_newUnit getVariable [QGVAR(isHandcuffed), false]) || {_unit getVariable [QGVAR(isSurrendering), false]}) then { showHUD false; } else { showHUD true; diff --git a/addons/captives/functions/fnc_handleUnitInitPost.sqf b/addons/captives/functions/fnc_handleUnitInitPost.sqf index 635d7b0439..1a5a8f2ecd 100644 --- a/addons/captives/functions/fnc_handleUnitInitPost.sqf +++ b/addons/captives/functions/fnc_handleUnitInitPost.sqf @@ -9,7 +9,7 @@ * The return value * * Example: - * TODO + * [bob] call ACE_captives_fnc_handleUnitInitPost * * Public: No */ diff --git a/addons/captives/functions/fnc_handleWokeUp.sqf b/addons/captives/functions/fnc_handleWokeUp.sqf index af59b5c56e..9bf2e1a2bc 100644 --- a/addons/captives/functions/fnc_handleWokeUp.sqf +++ b/addons/captives/functions/fnc_handleWokeUp.sqf @@ -9,7 +9,7 @@ * The return value * * Example: - * TODO + * [bob] call ACE_captives_fnc_handleWokeUp * * Public: No */ diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 1be72ca7c9..cf03704a85 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -10,7 +10,7 @@ * Nothing * * Example: - * TODO + * [bob, true] call ACE_captives_fnc_setHandcuffed; * * Public: No */ diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index bb782d85da..8b9d870cd5 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -10,7 +10,7 @@ * Nothing * * Example: - * TODO + * [Pierre, true] call ACE_captives_fnc_surrender; * * Public: No */ @@ -19,12 +19,18 @@ PARAMS_2(_unit,_state); if (_state) then { - if (_unit getVariable [QGVAR(isSurrendering), false]) exitWith {}; + if (_unit getVariable [QGVAR(isSurrendering), false]) exitWith { + ERROR("Already Surrendering"); + }; _unit setVariable [QGVAR(isSurrendering), true, true]; [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); + if (_unit == ACE_player) then { + showHUD false; + }; + private "_surrenderFnc"; _surrenderFnc = { EXPLODE_1_PVT((_this select 0),_unit); @@ -49,7 +55,7 @@ if (_state) then { }; [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); - + if (_unit == ACE_player) then { //only enable if not handcuffed if (!(_unit getVariable [QGVAR(isHandcuffed), false])) then { diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf index dd3b6e6818..626a0b34e4 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf @@ -10,7 +10,7 @@ * Nothing * * Example: - * TODO + * [bob, car1] call ACE_captives_fnc_vehicleCaptiveMoveIn; * * Public: No */ @@ -24,5 +24,3 @@ _target moveInCargo _vehicle; _target assignAsCargo _vehicle; _cargoIndex = _vehicle getCargoIndex _target; _target setVariable [QGVAR(CargoIndex), _cargoIndex, true]; - -TRACE_3("moveinEH",_target,_vehicle,_cargoIndex); diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf index 4210e8da15..5ef6f01406 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf @@ -9,7 +9,7 @@ * Nothing * * Example: - * TODO + * [bob] call ACE_captives_fnc_vehicleCaptiveMoveOut; * * Public: No */ @@ -21,4 +21,4 @@ _unit setVariable [QGVAR(CargoIndex), -1, true]; moveOut _unit; [_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); -unassignVehicle _unit; \ No newline at end of file +unassignVehicle _unit; From ed3f28ec6d1633a48ee3bc41a37f8497fb5719b6 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 6 Feb 2015 22:24:27 -0600 Subject: [PATCH 021/166] Minor Cleanup --- addons/captives/CfgMoves.hpp | 2 +- .../functions/fnc_canEscortCaptive.sqf | 4 +- .../captives/functions/fnc_canFriskPerson.sqf | 1 + .../captives/functions/fnc_setHandcuffed.sqf | 35 +++++++-------- addons/captives/functions/fnc_surrender.sqf | 45 ++++++++++++------- 5 files changed, 49 insertions(+), 38 deletions(-) diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp index bb6b8669e0..288d153d7b 100644 --- a/addons/captives/CfgMoves.hpp +++ b/addons/captives/CfgMoves.hpp @@ -70,7 +70,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { InterpolateTo[] = {"Unconscious",0.01}; }; class ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { - speed = 0.4; //for gameplay reasons, slow this down + speed = 0.333; //for gameplay reasons, slow this down actions = "CivilStandActions"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon"; ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1}; diff --git a/addons/captives/functions/fnc_canEscortCaptive.sqf b/addons/captives/functions/fnc_canEscortCaptive.sqf index cbb098881f..85bd8bbd3e 100644 --- a/addons/captives/functions/fnc_canEscortCaptive.sqf +++ b/addons/captives/functions/fnc_canEscortCaptive.sqf @@ -18,9 +18,9 @@ PARAMS_2(_unit,_target); -//Alive, handcuffed, not being escored, and not unconsious +//Alive, handcuffed, not being escored, and not unconscious (_target getVariable [QGVAR(isHandcuffed), false]) && {isNull (attachedTo _target)} && {alive _target} && -{!(_target getVariable [QGVAR(ACE_isUnconscious), false])} +{!(_target getVariable ["ACE_isUnconscious", false])} diff --git a/addons/captives/functions/fnc_canFriskPerson.sqf b/addons/captives/functions/fnc_canFriskPerson.sqf index 28a9ee0134..5eecc453d4 100644 --- a/addons/captives/functions/fnc_canFriskPerson.sqf +++ b/addons/captives/functions/fnc_canFriskPerson.sqf @@ -19,5 +19,6 @@ PARAMS_2(_unit,_target); _target getVariable [QGVAR(isHandcuffed), false] +|| {_target getVariable [QGVAR(isSurrendering), false]} || {_target getVariable ["ACE_isSearchable", false]} || {_target getVariable ["ACE_isUnconscious", false]} diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index cf03704a85..912b00662f 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -1,6 +1,6 @@ /* * Author: Nic547, commy2 - * Handcuffs a unit + * Handcuffs a unit. * * Arguments: * 0: Unit @@ -18,39 +18,38 @@ PARAMS_2(_unit,_state); - -if (!local _unit) exitWith { - ERROR("setHandcuffed unit not local"); +// We only want this function to work on local machines +if (!local _unit) exitwith { + [_this, QUOTE(FUNC(setHandcuffed)), _unit] call EFUNC(common,execRemoteFnc); + TRACE_2("running setHandcuffed on remote unit",_unit,_state); }; -if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) exitWith { - ERROR("new state equals current"); +if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) then { + LOG("setHandcuffed: current state same as new"); }; if (_state) then { _unit setVariable [QGVAR(isHandcuffed), true, true]; [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); - - // fix anim on mission start (should work on dedicated servers) - _fixAnimationFnc = { - PARAMS_1(_unit); - if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then { - [_unit] call EFUNC(common,fixLoweredRifleAnimation); - [_unit, "ACE_AmovPercMstpScapWnonDnon", 0] call EFUNC(common,doAnimation); - }; - }; - - [_fixAnimationFnc, [_unit], 0.05, 0] call EFUNC(common,waitAndExecute); - _unit setVariable [QGVAR(CargoIndex), ((vehicle _unit) getCargoIndex _unit), true]; if (_unit == ACE_player) then { showHUD false; }; + + // fix anim on mission start (should work on dedicated servers) + [{ + PARAMS_1(_unit); + if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then { + [_unit] call EFUNC(common,fixLoweredRifleAnimation); + [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); + }; + }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); } else { _unit setVariable [QGVAR(isHandcuffed), false, true]; [_unit, QGVAR(Handcuffed), false] call EFUNC(common,setCaptivityStatus); if ((vehicle _unit) == _unit) then { + //Break out of hands up animation loop (doAnimation handles Unconscious prioity) [_unit, "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); }; diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index 8b9d870cd5..1f0e232926 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -18,46 +18,57 @@ PARAMS_2(_unit,_state); -if (_state) then { - if (_unit getVariable [QGVAR(isSurrendering), false]) exitWith { - ERROR("Already Surrendering"); - }; +// We only want this function to work on local machines +if (!local _unit) exitwith { + [_this, QUOTE(FUNC(surrender)), _unit] call EFUNC(common,execRemoteFnc); + TRACE_2("running surrender on remote unit",_unit,_state); +}; +if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) then { + LOG("Surrender: current state same as new"); +}; + +if (_state) then { _unit setVariable [QGVAR(isSurrendering), true, true]; [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); - [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); if (_unit == ACE_player) then { showHUD false; }; - private "_surrenderFnc"; - _surrenderFnc = { - EXPLODE_1_PVT((_this select 0),_unit); + // fix anim on mission start (should work on dedicated servers) + [{ + PARAMS_1(_unit); + if (_unit getVariable [QGVAR(isSurrendering), false] && {vehicle _unit == _unit}) then { + [_unit] call EFUNC(common,fixLoweredRifleAnimation); + [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); + }; + }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); + //PFEH - (TODO: move to event system?) + [{ + EXPLODE_1_PVT((_this select 0),_unit); if (_unit getVariable [QGVAR(isSurrendering), false]) then { + //If unit dies, gets knocked out, or is handcuffed then end surrender if ((!alive _unit) || {_unit getVariable ["ACE_isUnconscious", false]} || {_unit getVariable [QGVAR(isHandcuffed), false]}) then { [_unit, false] call FUNC(surrender); - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [(_this select 1)] call CBA_fnc_removePerFrameHandler; }; } else { [(_this select 1)] call cba_fnc_removePerFrameHandler; }; - }; - [_surrenderFnc, 0.0, [_unit]] call CBA_fnc_addPerFrameHandler; + }, 0.0, [_unit]] call CBA_fnc_addPerFrameHandler; } else { _unit setVariable [QGVAR(isSurrendering), false, true]; + [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); - if !(_unit getVariable ["ACE_isUnconscious", false]) then { - //Break out of hands up animation loop - //don't want to step on animations from medical (TODO: testing medical integration) + if ((vehicle _unit) == _unit) then { + //Break out of hands up animation loop (doAnimation handles Unconscious prioity) [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); }; - [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); - if (_unit == ACE_player) then { - //only enable if not handcuffed + //only re-enable HUD if not handcuffed if (!(_unit getVariable [QGVAR(isHandcuffed), false])) then { showHUD true; }; From fcf39a39164eeef998f71a1ee1582b937a32c515 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 6 Feb 2015 23:23:33 -0600 Subject: [PATCH 022/166] #118 Sound Effect from CSE --- .../captives/functions/fnc_doApplyHandcuffs.sqf | 3 +++ addons/captives/sounds/cable_tie_zipping.ogg | Bin 0 -> 17543 bytes 2 files changed, 3 insertions(+) create mode 100644 addons/captives/sounds/cable_tie_zipping.ogg diff --git a/addons/captives/functions/fnc_doApplyHandcuffs.sqf b/addons/captives/functions/fnc_doApplyHandcuffs.sqf index 8abf8c836c..0d15f503e8 100644 --- a/addons/captives/functions/fnc_doApplyHandcuffs.sqf +++ b/addons/captives/functions/fnc_doApplyHandcuffs.sqf @@ -19,4 +19,7 @@ PARAMS_2(_unit,_target); _unit removeItem "ACE_CableTie"; + +playSound3D [QUOTE(PATHTO_R(sounds\cable_tie_zipping.ogg)), objNull, false, (getPosASL _target), 1, 1, 10]; + ["SetHandcuffed", [_target], [_target, true]] call EFUNC(common,targetEvent); diff --git a/addons/captives/sounds/cable_tie_zipping.ogg b/addons/captives/sounds/cable_tie_zipping.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4f76037eb1cd1809e68c2d977e17aedcc759f18e GIT binary patch literal 17543 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�SjMoGq{U*=H>$wT7pM|E}Q6wJt;Pv`V(-r+zBZ6`GE*GO(lP+7{X*!JN=o71I zLULM3kG9x(Fb6rT81qICnrIon&s|h!fFyF(#>slJ(xu0ID$*63fM>f98)^QQeROLP zR05@lH)&AN-Rc~I$;DYW8`y(GCQ;_c@GycUOes~OiN?f^n-b%D^7fdmeX-xp-}Oi) z8*q=cKG62SHPRZ&Cx!*V7zLM8ANK)R$#hXJZa!-aDdHXxfO~N>MkA>X8MM3T zlskT33y@kzEb|l_nTn@h-Nz*L1|D=cN^DwB)6IF6Tzh?>IhWsL_ejm&19zP2 zwZ?9bS!N!xvOK!&w|aV0-kVK|bZAg9q+pkZU-AFehbZ7##v3ESgTqqu}sw8 z&c3k>)QBQS)pvM5hdx_;ER6$DX(j$Vd1QQU^T8E|l6m^EiSy4J9bNG`;vZsh z$-K1Vlf^ejJ71hrT_D0Om#@^ITkAt^T(f&mS!C&M|I)g5_2LPQ9UM1{pvikCZCbAP z-s`pCcb{)CYQcI^MtA_8*nP)lPWidX35wi4p!>S*(wR)rgxz zBiGhh^|n~^KTdSY!{_?(ljufY9=(I7hX$UXX}J91>-hT4I-S|hZZ4HD7=bqPLP5Lo zlh5=Slh-N^dU6{t>}CzT&UBqTsURC^z8s-L;Db080zTbs&uo9X^Stuyx{j#NIk4ly zN{Wy^tcVSBf+CZ3j>DWGVw;9O&dE;3D5!?e!O)}gjy5EUDgTkTH@DjpRYu-E{=Cig zT*0Nc#bHO6M~0$3Bv(%=X$tjWGvHjTIOH{k)l|PCV?Q3nTwYO7jv1<&EQro#2MKDEcqIl6ojM~290Nf#z;ggcBZV8ZYFK;&bclg~cQZtg0b#(cR{n+u`Y^ z_eP|dZq);CX-7L4k~|Q{@_S zO^g@LvNc0c3ZFC<^6c47$#dC94_}{cGkr1{Ua)&fN>^b(5qr60|J^2DIn`I-DYe90<;ApPx0O&G$5+|nyy^n&-0+(pTZ+S#L*@JLS8z~iJr#of}} zX|T#|DF%F!yw(O{o5~LArt7$Gq&T7&mE|+PA};qHonowRYJ{(dXMm!F5s zeO?^>GrTkC_2Z{zLcU4;YsuQT>E9?whPJII5;$60l%^BgQ#DVYK0Ppy41%hwmtGEE*y+|4^W)RYVdb?A!Or(J z2O1(GBfp&i5l;ZuKmt0s(Z8b4d?T%XT_GD71aVEQcS2XcZfphFf%Wxu-PMha9h^0= d#sh*^?mYhW>(^dj^w+Nro)2IM9(xt|{{T~b6N~@= literal 0 HcmV?d00001 From 6d534e88466dfce5414f4522666600fe3fbdaadb Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 7 Feb 2015 15:20:51 -0600 Subject: [PATCH 023/166] #130 - Surrender Module Prototype --- addons/captives/CfgVehicles.hpp | 30 +++++++++++- addons/captives/XEH_preInit.sqf | 1 + addons/captives/config.cpp | 2 +- .../functions/fnc_handlePlayerChanged.sqf | 6 ++- .../functions/fnc_moduleSurrender.sqf | 46 +++++++++++++++++++ 5 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 addons/captives/functions/fnc_moduleSurrender.sqf diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 934e1215d2..d292402bcf 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -78,7 +78,7 @@ class CfgVehicles { showDisabled = 0; priority = 2.3; hotkey = "C"; - }; + }; class ACE_StartSurrenderingSelf { displayName = "$STR_ACE_Captives_StartSurrendering"; condition = QUOTE([ARR_2(_player, true)] call FUNC(canSurrender)); @@ -86,7 +86,7 @@ class CfgVehicles { exceptions[] = {}; showDisabled = 0; priority = 0; - }; + }; class ACE_StopSurrenderingSelf { displayName = "$STR_ACE_Captives_StopSurrendering"; condition = QUOTE([ARR_2(_player, false)] call FUNC(canSurrender)); @@ -162,4 +162,30 @@ class CfgVehicles { MACRO_ADDITEM(ACE_CableTie,12) }; }; + + + class Logic; + class Module_F: Logic { + class ArgumentsBaseUnits {}; + class ModuleDescription {}; + }; + + class GVAR(ModuleSurrender): Module_F { + author = "$STR_ACE_Common_ACETeam"; + category = "ACE"; + displayName = "Make Unit Surrender"; + function = QUOTE(DFUNC(moduleSurrender)); + scope = 2; //show in editor + scopeCurator = 2; //show in zeus + curatorCost = 0; //??? + isGlobal = 1; //run global + isTriggerActivated = 1; //Wait for triggers + // icon = QUOTE(PATHTOF(ui\todo.paa)); + functionPriority = 0; + class Arguments {}; + class ModuleDescription: ModuleDescription { + description = "Sync a unit to make them surrender.
Source: ace_captives"; + sync[] = {"AnyAI"}; + }; + }; }; diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index a98bf73443..75ee77e9bc 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -23,6 +23,7 @@ PREP(handleKnockedOut); PREP(handlePlayerChanged); PREP(handleUnitInitPost); PREP(handleWokeUp); +PREP(moduleSurrender); PREP(setHandcuffed); PREP(surrender); PREP(vehicleCaptiveMoveIn); diff --git a/addons/captives/config.cpp b/addons/captives/config.cpp index c0a34e3222..27b7c4ec60 100644 --- a/addons/captives/config.cpp +++ b/addons/captives/config.cpp @@ -2,7 +2,7 @@ class CfgPatches { class ADDON { - units[] = {}; + units[] = {QGVAR(ModuleSurrender)}; weapons[] = {"ACE_CableTie"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ACE_Interaction"}; diff --git a/addons/captives/functions/fnc_handlePlayerChanged.sqf b/addons/captives/functions/fnc_handlePlayerChanged.sqf index 9c4f02546f..13e284ef80 100644 --- a/addons/captives/functions/fnc_handlePlayerChanged.sqf +++ b/addons/captives/functions/fnc_handlePlayerChanged.sqf @@ -18,8 +18,10 @@ PARAMS_2(_newUnit,_oldUnit); -if ((_newUnit getVariable [QGVAR(isHandcuffed), false]) || {_unit getVariable [QGVAR(isSurrendering), false]}) then { - showHUD false; +if ((_newUnit getVariable [QGVAR(isHandcuffed), false]) || {_newUnit getVariable [QGVAR(isSurrendering), false]}) then { + TRACE_1("Player Change (showHUD false)",_newUnit); + showHUD false; } else { + TRACE_1("Player Change (showHUD true)",_newUnit); showHUD true; }; diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf new file mode 100644 index 0000000000..5cbf43aacc --- /dev/null +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -0,0 +1,46 @@ +/* + * Author: PabstMirror + * Module Function to make a unit surrender (can be called from editor, or placed with zeus) + * + * Arguments: + * 0: The Module Logic Object + * 1: synced objects + * 2: Activated + * + * Return Value: + * Nothing + * + * Example: + * Called from module + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_3(_logic,_units,_activated); + +if (!_activated) exitWith {}; + +if (local _logic) then { + if ((!isnull curatorcamera) && {((count curatorMouseOver) == 2) && {(curatorMouseOver select 1) == _logic}}) then {//in zeus interface and we placed the module + _bisMouseOver = missionNamespace getVariable ["bis_fnc_curatorObjectPlaced_mouseOver", []];//bis caches the previous curatorMouseOver + if ((count _bisMouseOver) == 2) then {//check what mouse was over before the module was placed + _mouseOverObject = _bisMouseOver select 1; + if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then { + systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)]; + [_mouseOverObject, true] call FUNC(surrender); + } else { + systemChat format ["Only use on dismounted inf"]; + }; + } else { + systemChat format ["Nothing under mouse"]; + }; + } else {//an editor module + { + systemChat format ["Debug - module surrendering %1", (name _x)]; + [_x, true] call FUNC(surrender); + } forEach _units; + }; + + deleteVehicle _logic; +}; From 3f6ffa6ac2eb4d425005afc75c7de260d1213f5a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 8 Feb 2015 13:48:53 -0600 Subject: [PATCH 024/166] Mag Repack - Keep Progress prototype Ideas from AGM and CSE Keeps Progress While Repacking if interrupted Added sounds from CSE --- addons/magazinerepack/CfgEventHandlers.hpp | 1 - addons/magazinerepack/CfgSounds.hpp | 15 +++ addons/magazinerepack/CfgVehicles.hpp | 29 +++-- addons/magazinerepack/README.md | 2 +- addons/magazinerepack/XEH_preInit.sqf | 5 +- addons/magazinerepack/config.cpp | 1 + .../functions/fnc_magazineRepack.sqf | 77 ------------- .../functions/fnc_magazineRepackCallback.sqf | 106 ------------------ .../functions/fnc_magazineRepackProgress.sqf | 70 ++++++++++++ .../functions/fnc_openSelectMagazineUI.sqf | 69 +++++++----- .../functions/fnc_simulateRepackEvents.sqf | 52 +++++++++ .../functions/fnc_startRepackingMagazine.sqf | 39 +++++++ addons/magazinerepack/script_component.hpp | 2 + .../sounds/magrepack_finished.wav | Bin 0 -> 152166 bytes .../sounds/magrepack_single.wav | Bin 0 -> 95466 bytes 15 files changed, 235 insertions(+), 233 deletions(-) create mode 100644 addons/magazinerepack/CfgSounds.hpp delete mode 100644 addons/magazinerepack/functions/fnc_magazineRepack.sqf delete mode 100644 addons/magazinerepack/functions/fnc_magazineRepackCallback.sqf create mode 100644 addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf create mode 100644 addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf create mode 100644 addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf create mode 100644 addons/magazinerepack/sounds/magrepack_finished.wav create mode 100644 addons/magazinerepack/sounds/magrepack_single.wav diff --git a/addons/magazinerepack/CfgEventHandlers.hpp b/addons/magazinerepack/CfgEventHandlers.hpp index f0a9f14d91..b928bc2de6 100644 --- a/addons/magazinerepack/CfgEventHandlers.hpp +++ b/addons/magazinerepack/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preInit)); diff --git a/addons/magazinerepack/CfgSounds.hpp b/addons/magazinerepack/CfgSounds.hpp new file mode 100644 index 0000000000..bc1d0fe0ee --- /dev/null +++ b/addons/magazinerepack/CfgSounds.hpp @@ -0,0 +1,15 @@ +class CfgSounds +{ + class GVAR(soundMagazineFinished) + { + name = QGVAR(soundMagazineFinished); + sound[]={QUOTE(PATHTOF(sounds\magrepack_finished.wav)),1,1}; + titles[]={}; + }; + class GVAR(soundRoundFinished) + { + name = QGVAR(soundRoundFinished); + sound[] = {QUOTE(PATHTOF(sounds\magrepack_single.wav)),1,1}; + titles[] = {}; + }; +}; \ No newline at end of file diff --git a/addons/magazinerepack/CfgVehicles.hpp b/addons/magazinerepack/CfgVehicles.hpp index ecb732f8fd..acd1c76c3d 100644 --- a/addons/magazinerepack/CfgVehicles.hpp +++ b/addons/magazinerepack/CfgVehicles.hpp @@ -1,18 +1,17 @@ - class CfgVehicles { - class Man; - class CAManBase: Man { - class ACE_SelfActions { - class ACE_RepackMagazines { - displayName = "$STR_ACE_MagazineRepack_RepackMagazines"; - condition = QUOTE(true); - statement = QUOTE([_player] call FUNC(magazineRepack)); - showDisabled = 0; - priority = -2; - icon = PATHTOF(UI\repack_ca.paa); - hotkey = "R"; - enableInside = 1; - }; + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_RepackMagazines { + displayName = "$STR_ACE_MagazineRepack_RepackMagazines"; + condition = QUOTE(true); + statement = QUOTE([_player] call FUNC(openSelectMagazineUI)); + showDisabled = 0; + priority = -2; + icon = QUOTE(PATHTOF(UI\repack_ca.paa)); + hotkey = "R"; + enableInside = 1; + }; + }; }; - }; }; diff --git a/addons/magazinerepack/README.md b/addons/magazinerepack/README.md index 49a3c9d531..28b7c3115a 100644 --- a/addons/magazinerepack/README.md +++ b/addons/magazinerepack/README.md @@ -3,10 +3,10 @@ ace_magazinerepack Adds the ability to consolidate multiple half-empty magazines. - ## Maintainers The people responsible for merging changes to this component or answering potential questions. - [commy2](https://github.com/commy2) - [esteldunedain](https://github.com/esteldunedain) +- [PabstMirror](https://github.com/PabstMirror) diff --git a/addons/magazinerepack/XEH_preInit.sqf b/addons/magazinerepack/XEH_preInit.sqf index 5caba1ffac..e2dfd721f3 100644 --- a/addons/magazinerepack/XEH_preInit.sqf +++ b/addons/magazinerepack/XEH_preInit.sqf @@ -2,8 +2,9 @@ ADDON = false; -PREP(magazineRepack); -PREP(magazineRepackCallback); +PREP(magazineRepackProgress); PREP(openSelectMagazineUI); +PREP(simulateRepackEvents); +PREP(startRepackingMagazine); ADDON = true; diff --git a/addons/magazinerepack/config.cpp b/addons/magazinerepack/config.cpp index 5f2c6edc7d..2df0d62bff 100644 --- a/addons/magazinerepack/config.cpp +++ b/addons/magazinerepack/config.cpp @@ -13,6 +13,7 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" +#include "CfgSounds.hpp" #include "CfgVehicles.hpp" class ACE_Parameters_Numeric { diff --git a/addons/magazinerepack/functions/fnc_magazineRepack.sqf b/addons/magazinerepack/functions/fnc_magazineRepack.sqf deleted file mode 100644 index 472b80e2bd..0000000000 --- a/addons/magazinerepack/functions/fnc_magazineRepack.sqf +++ /dev/null @@ -1,77 +0,0 @@ -// by commy2, esteldunedain -#include "script_component.hpp" - -private ["_unit", "_magazines", "_ammos", "_repackTime", "_magazine", "_ammo", "_count", "_index", "_i", "_j", "_ammoToTransfer", "_ammoAvailable", "_ammoNeeded"]; - -_unit = _this select 0; - -_magazines = []; -_ammos = []; -_repackTime = []; - -// get all mags and ammo count -{ - _magazine = _x select 0; - _ammo = _x select 1; - - _count = getNumber (configfile >> "CfgMagazines" >> _magazine >> "count"); - - if (_ammo != _count && {_count > 1}) then { // additional checks here - if !(_magazine in _magazines) then { - _index = count _magazines; - _magazines set [_index, _magazine]; - _ammos set [_index, [_ammo]]; - } else { - _index = _magazines find _magazine; - _ammos set [_index, (_ammos select _index) + [_ammo]]; - }; - }; -} forEach magazinesAmmoFull _unit; - -// Remove invalid magazines -{ - if (count _x < 2) then { - _magazines set [_forEachIndex, -1]; - _ammos set [_forEachIndex, [-1]]; - }; -} forEach _ammos; -_magazines = _magazines - [-1]; -_ammos = _ammos - [[-1]]; - -{ - // Calculate actual ammo to transfer during repack - _count = getNumber (configfile >> "CfgMagazines" >> (_magazines select _forEachIndex) >> "count"); - - // Sort Ascending - _list = _x call BIS_fnc_sortNum; - - ["MagazineRepack", _list] call EFUNC(common,log); - - _i = 0; - _j = count _x - 1; - _ammoToTransfer = 0; - _ammoAvailable = 0; - while {_i < _j} do { - _ammoNeeded = _count - (_list select _j); - _exit = false; - while {_i < _j && {!_exit}} do { - _ammoAvailable = _list select _i; - if (_ammoAvailable >= _ammoNeeded) then { - _list set [_i, _ammoAvailable - _ammoNeeded]; - _ammoToTransfer = _ammoToTransfer + _ammoNeeded; - _exit = true; - } else { - _ammoNeeded = _ammoNeeded - _ammoAvailable; - _ammoToTransfer = _ammoToTransfer + _ammoAvailable; - _i = _i + 1; - }; - }; - _j = _j - 1; - }; - - _repackTime set [_forEachIndex, _ammoToTransfer * GVAR(TimePerAmmo) + (count _x) * GVAR(TimePerMagazine)]; -} forEach _ammos; - -["MagazineRepack", [_magazines, _repackTime]] call EFUNC(common,log); - -[_unit, _magazines, _repackTime] call FUNC(openSelectMagazineUI); diff --git a/addons/magazinerepack/functions/fnc_magazineRepackCallback.sqf b/addons/magazinerepack/functions/fnc_magazineRepackCallback.sqf deleted file mode 100644 index f209806f9c..0000000000 --- a/addons/magazinerepack/functions/fnc_magazineRepackCallback.sqf +++ /dev/null @@ -1,106 +0,0 @@ -// by commy2 -#include "script_component.hpp" - -private ["_unit", "_magazine", "_ammo", "_ammoCount", "_fullMagazinesCount", "_restAmmo", "_isLoaded", "_weapon", "_reloadAction", "_text", "_picture"]; - -_unit = ACE_player; //_this select 0; -_magazine = _this select 1; - -// exit if the last magazine of this type was taken out of the backpack -if !(_magazine in magazines _unit) exitWith {}; - -// get current ammo count -_ammo = 0; -{ - if (_x select 0 == _magazine) then { - _ammo = _ammo + (_x select 1); - }; -} forEach magazinesAmmoFull _unit; - -// how many rounds fit in one mag -_ammoCount = getNumber (configFile >> "CfgMagazines" >> _magazine >> "count"); - -// calculate new vaules -_fullMagazinesCount = floor (_ammo / _ammoCount); -_restAmmo = _ammo - _fullMagazinesCount * _ammoCount; - -// remove old magazines -_unit removeMagazines _magazine; - -_isLoaded = false; -// reload rifle -if (_magazine in primaryWeaponMagazine _unit) then { - _weapon = primaryWeapon _unit; - - if (_fullMagazinesCount > 0) then { - _unit setAmmo [_weapon, _ammoCount]; - _fullMagazinesCount = _fullMagazinesCount - 1; - } else { - _unit setAmmo [_weapon, _restAmmo]; - _restAmmo = 0; - }; - - if (_weapon == currentWeapon _unit) then { - _reloadAction = getText (configFile >> "CfgWeapons" >> _weapon >> "reloadAction"); - _unit playActionNow _reloadAction; - }; - - _isLoaded = true; -}; - -// reload pistol -if (_magazine in handgunMagazine _unit) then { - _weapon = handgunWeapon _unit; - - if (_fullMagazinesCount > 0) then { - _unit setAmmo [_weapon, _ammoCount]; - _fullMagazinesCount = _fullMagazinesCount - 1; - } else { - _unit setAmmo [_weapon, _restAmmo]; - _restAmmo = 0; - }; - - if (_weapon == currentWeapon _unit) then { - _reloadAction = getText (configFile >> "CfgWeapons" >> _weapon >> "reloadAction"); - _unit playActionNow _reloadAction; - }; - - _isLoaded = true; -}; - -// reload rocket launcher (just in case ...) -if (_magazine in secondaryWeaponMagazine _unit) then { - _weapon = secondaryWeapon _unit; - - if (_fullMagazinesCount > 0) then { - _unit setAmmo [_weapon, _ammoCount]; - _fullMagazinesCount = _fullMagazinesCount - 1; - } else { - _unit setAmmo [_weapon, _restAmmo]; - _restAmmo = 0; - }; - - if (_weapon == currentWeapon _unit) then { - _reloadAction = getText (configFile >> "CfgWeapons" >> _weapon >> "reloadAction"); - _unit playActionNow _reloadAction; - }; - - _isLoaded = true; -}; - -// add new magazines -for "_a" from 1 to _fullMagazinesCount do { - _unit addMagazine _magazine; -}; - -if (_restAmmo > 0) then { - _unit addMagazine [_magazine, _restAmmo]; -}; - -// display text if successful -_text = format [localize "STR_ACE_MagazineRepack_RepackedMagazinesDetail", [_fullMagazinesCount, _fullMagazinesCount + 1] select _isLoaded, _restAmmo]; -_picture = getText (configFile >> "CfgMagazines" >> _magazine >> "picture"); - -_text = parseText format ["
%2
%3", _picture, localize "STR_ACE_MagazineRepack_RepackedMagazines", _text]; - -[_text] call EFUNC(common,displayTextStructured); diff --git a/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf b/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf new file mode 100644 index 0000000000..f965305eda --- /dev/null +++ b/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf @@ -0,0 +1,70 @@ +// by commy2, esteldunedain +#include "script_component.hpp" + +PARAMS_3(_args,_elapsedTime,_totalTime); +EXPLODE_3_PVT(_args,_magazineClassname,_lastAmmoCount,_simEvents); + +if ((count _simEvents) == 0) exitWith {ERROR("No Event"); false}; +EXPLODE_3_PVT((_simEvents select 0),_nextEventTime,_nextEventType,_nextEventMags); + + + +if (_nextEventTime > _elapsedTime) exitWith {true};//waiting on next event +systemChat format ["Event %1-%2-%3", _nextEventTime,_nextEventType,_nextEventMags]; + + +//Verify we aren't missing any ammo +_currentAmmoCount = []; +{ + EXPLODE_2_PVT(_x,_xClassname,_xCount); + if (_xClassname == _magazineClassname) then { + _currentAmmoCount pushBack _xCount; + }; +} forEach (magazinesAmmo ACE_player); //only inventory mags + +_addedMagazines = +_currentAmmoCount; +_missingAmmo = false; +{ + if (_x > 0) then { + _index = _addedMagazines find _x; + if (_index != -1) then { + _addedMagazines deleteAt _index; + } else { + _missingAmmo = true; + }; + }; +} forEach _lastAmmoCount; + +if (_missingAmmo) exitWith {false}; //something removed ammo that was being repacked +if ((count _addedMagazines) > 0) then { + TRACE_1("Added Magazine While Repacking",_addedMagazines); +}; + +_updateMagazinesOnPlayer = { + systemChat format ["Updating mags"]; + _newMagazineList = _addedMagazines + _nextEventMags; + ACE_player removeMagazines _magazineClassname; + { + if (_x > 0) then { + ACE_player addMagazine [_magazineClassname, _x]; + }; + } forEach _newMagazineList; + _args set [1, _nextEventMags]; +}; + + +if (_nextEventType == 0) then { + systemChat "reloading bullet"; + playSound QGVAR(soundMagazineFinished); + if (((count _simEvents) % 3) == 0) then { + call _updateMagazinesOnPlayer; + }; +} else { + systemChat "Moving to next mag"; + playSound QGVAR(soundRoundFinished); + call _updateMagazinesOnPlayer; +}; + +_simEvents deleteAt 0; //pop off the event + +true; diff --git a/addons/magazinerepack/functions/fnc_openSelectMagazineUI.sqf b/addons/magazinerepack/functions/fnc_openSelectMagazineUI.sqf index b1a31c266c..931a0149cf 100644 --- a/addons/magazinerepack/functions/fnc_openSelectMagazineUI.sqf +++ b/addons/magazinerepack/functions/fnc_openSelectMagazineUI.sqf @@ -1,40 +1,47 @@ -// by commy2 +// by commy2, esteldunedain #include "script_component.hpp" -private ["_unit", "_magazines", "_repackTime", "_listIDC", "_count", "_index", "_magazine", "_time", "_displayName", "_picture"]; +private ["_unit", "_magazines", "_ammos", "_repackTime", "_magazine", "_ammo", "_count", "_index", "_i", "_j", "_ammoToTransfer", "_ammoAvailable", "_ammoNeeded"]; -_unit = _this select 0; -_magazines = _this select 1; -_repackTime = _this select 2; +PARAMS_1(_unit); -_count = count _magazines; +_unitMagazines = []; +_unitMagCounts = []; + +// get all mags and ammo count +{ + _xClassname = _x select 0; + _xCount = _x select 1; + _fullMagazineCount = getNumber (configfile >> "CfgMagazines" >> _xClassname >> "count"); + + if ((_xCount != _fullMagazineCount) && {_xCount > 1}) then {//for every partial magazine + _index = _unitMagazines find _xClassname; + if (_index == -1) then { + _unitMagazines pushBack _xClassname; + _unitMagCounts pushBack [_xCount]; + } else { + (_unitMagCounts select _index) pushBack _xCount; + }; + }; +} forEach magazinesAmmoFull _unit; _actions = [localize "STR_ACE_MagazineRepack_SelectMagazineMenu", localize "STR_ACE_MagazineRepack_SelectMagazine"] call EFUNC(interaction,prepareSelectMenu); -for "_index" from 0 to (_count - 1) do { - _magazine = _magazines select _index; - _time = _repackTime select _index; - _displayName = getText (configFile >> "CfgMagazines" >> _magazine >> "displayName"); - _picture = getText (configFile >> "CfgMagazines" >> _magazine >> "picture"); - _actions = [ - _actions, - _displayName, - _picture, - [str _unit, _magazine, _time] - ] call EFUNC(interaction,addSelectableItem); -}; + +systemChat format ["%1 - %2", _unitMagazines, _unitMagCounts]; + +{ + if ((count (_unitMagCounts select _forEachIndex)) >= 2) then {// Ignore invalid magazines types (need 2+ partial mags to do anything) + _displayName = getText (configFile >> "CfgMagazines" >> _x >> "displayName"); + _picture = getText (configFile >> "CfgMagazines" >> _x >> "picture"); + _actions = [_actions, _displayName, _picture, _x] call EFUNC(interaction,addSelectableItem); + }; +} forEach _unitMagazines; [ - _actions, - { - _data = _this; - call EFUNC(interaction,hideMenu); - if (isNil "_data") exitWith {}; - _data set [2, [_data select 2] call EFUNC(common,toNumber)]; - [(_data select 2), _data, {(_this select 0) call FUNC(magazineRepackCallback)}, {}, (localize "STR_ACE_MagazineRepack_RepackingMagazine")] call EFUNC(common,progressBar); - [ACE_player] call EFUNC(common,goKneeling); - }, - { - call EFUNC(interaction,hideMenu); - if !(profileNamespace getVariable [QGVAR(AutoCloseMenu), false]) then {"Default" call EFUNC(interaction,openMenuSelf)}; - } +_actions, +{ [ACE_player, _this] call FUNC(startRepackingMagazine); }, +{ + call EFUNC(interaction,hideMenu); + if !(profileNamespace getVariable [QGVAR(AutoCloseMenu), false]) then {"Default" call EFUNC(interaction,openMenuSelf)}; +} ] call EFUNC(interaction,openSelectMenu); diff --git a/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf b/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf new file mode 100644 index 0000000000..9df248bd6c --- /dev/null +++ b/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf @@ -0,0 +1,52 @@ +#include "script_component.hpp" + +private ["_fullMagazineCount", "_magazines", "_newMag", "_time", "_events", "_swapAmmo", "_ammoSwaped", "_lowIndex", "_highIndex", "_ammoToTransfer", "_ammoAvailable", "_ammoNeeded"]; + +PARAMS_2(_magazineClassname,_arrayOfAmmoCounts); + +// Calculate actual ammo to transfer during repack +_fullMagazineCount = getNumber (configfile >> "CfgMagazines" >> _magazineClassname >> "count"); + +// Sort Ascending - Don't modify orginal +_arrayOfAmmoCounts = (+_arrayOfAmmoCounts) call BIS_fnc_sortNum; + +_newMag = { + _time = _time + GVAR(TimePerMagazine); + _events pushBack [_time, 1, +_arrayOfAmmoCounts]; +}; +_swapAmmo = { + for "_swapProgress" from 1 to _ammoSwaped do { + _time = _time + GVAR(TimePerAmmo); + _arrayOfAmmoCounts set [_lowIndex, ((_arrayOfAmmoCounts select _lowIndex) - 1)]; + _arrayOfAmmoCounts set [_highIndex, ((_arrayOfAmmoCounts select _highIndex) + 1)]; + _events pushBack [_time, 0, +_arrayOfAmmoCounts]; + }; +}; + +_lowIndex = 0; +_highIndex = (count _arrayOfAmmoCounts) - 1; +_ammoToTransfer = 0; +_ammoAvailable = 0; + +_time = 0; +_events = []; + +while {_lowIndex < _highIndex} do { + _ammoNeeded = _fullMagazineCount - (_arrayOfAmmoCounts select _highIndex); + _ammoAvailable = _arrayOfAmmoCounts select _lowIndex; + + if (_ammoAvailable == 0) then { + _lowIndex = _lowIndex + 1; + call _newMag; + } else { + if (_ammoNeeded == 0) then { + _highIndex = _highIndex - 1; + call _newMag; + } else { + _ammoSwaped = _ammoAvailable min _ammoNeeded; + call _swapAmmo; + }; + }; +}; + +_events diff --git a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf new file mode 100644 index 0000000000..8e5075e17e --- /dev/null +++ b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf @@ -0,0 +1,39 @@ +// by commy2, esteldunedain +#include "script_component.hpp" + +private ["_unit", "_magazines", "_ammos", "_repackTime", "_magazine", "_ammo", "_count", "_index", "_i", "_j", "_ammoToTransfer", "_ammoAvailable", "_ammoNeeded"]; + +PARAMS_2(_unit,_magazineClassname); +if (isNil "_magazineClassname" || {_magazineClassname == ""}) exitWith {ERROR("Bad Mag Classname");}; + +[_unit] call EFUNC(common,goKneeling); +call EFUNC(interaction,hideMenu); + +_startingAmmoCounts = []; +{ + EXPLODE_4_PVT(_x,_xClassname,_xCount,_xLoaded,_xType); + if (_xClassname == _magazineClassname) then { + if (_xLoaded) then { + //Try to Remove from weapon and add to inventory, otherwise ignore + if (_unit canAdd _magazineClassname) then { + switch (_xType) do { + case (1): {_unit removePrimaryWeaponItem _magazineClassname;}; + case (2): {_unit removeHandgunItem _magazineClassname;}; + case (4): {_unit removeSecondaryWeaponItem _magazineClassname;}; + default {ERROR("Loaded Location Invalid");}; + }; + _unit addMagazine [_magazineClassname, _xCount]; + _startingAmmoCounts pushBack _xCount; + }; + } else { + _startingAmmoCounts pushBack _xCount; + }; + }; +} forEach (magazinesAmmoFull _unit); + +if ((count _startingAmmoCounts) == 0) exitwith {ERROR("No Mags");}; + +_simEvents = [_magazineClassname, _startingAmmoCounts] call FUNC(simulateRepackEvents); +_totalTime = (_simEvents select ((count _simEvents) - 1) select 0); + +[_totalTime, [_magazineClassname, _startingAmmoCounts, _simEvents], {hint "done"}, {hint "fail"}, (localize "STR_ACE_MagazineRepack_RepackingMagazine"), {_this call FUNC(magazineRepackProgress)}] call EFUNC(common,progressBar); diff --git a/addons/magazinerepack/script_component.hpp b/addons/magazinerepack/script_component.hpp index 7b390f7126..15563f0fe8 100644 --- a/addons/magazinerepack/script_component.hpp +++ b/addons/magazinerepack/script_component.hpp @@ -1,3 +1,5 @@ +#define DEBUG_MODE_FULL + #define COMPONENT magazinerepack #include "\z\ace\addons\main\script_mod.hpp" diff --git a/addons/magazinerepack/sounds/magrepack_finished.wav b/addons/magazinerepack/sounds/magrepack_finished.wav new file mode 100644 index 0000000000000000000000000000000000000000..ab73615a558f3aa60f97dfa47d6bd0773e40f4b0 GIT binary patch literal 152166 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 literal 0 HcmV?d00001 diff --git a/addons/magazinerepack/sounds/magrepack_single.wav b/addons/magazinerepack/sounds/magrepack_single.wav new file mode 100644 index 0000000000000000000000000000000000000000..5d94e215fdf9894487afb000569c829a903484d8 GIT binary patch literal 95466 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 Date: Sun, 8 Feb 2015 16:36:58 -0600 Subject: [PATCH 025/166] Headers --- .../functions/fnc_magazineRepackProgress.sqf | 49 +++++++++++-------- .../functions/fnc_openSelectMagazineUI.sqf | 30 ++++++++---- .../functions/fnc_simulateRepackEvents.sqf | 43 ++++++++++------ .../functions/fnc_startRepackingMagazine.sqf | 34 ++++++++++--- 4 files changed, 106 insertions(+), 50 deletions(-) diff --git a/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf b/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf index f965305eda..3c829a8933 100644 --- a/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf +++ b/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf @@ -1,17 +1,31 @@ -// by commy2, esteldunedain +/* + * Author: PabstMirror (based on repack from commy2, esteldunedain, Ruthberg) + * Handles each frame durring the repack progressBar. + * On each event (repacked bullet or move to new mag) it plays a sound and syncs up the new magazines to the player. + * + * Arguments: + * 0: Arguments [classname,lastAmmoStatus,events] + * 1: Elapsed Time + * 2: Total Time Repacking Will Take + * + * Return Value: + * Keep going (on missing mags return false) + * + * Example: + * (args from progressBar) call ace_magazinerepack_fnc_magazineRepackProgress + * + * Public: No + */ #include "script_component.hpp" +private ["_currentAmmoCount", "_addedMagazines", "_missingAmmo", "_index", "_updateMagazinesOnPlayerFnc"]; + PARAMS_3(_args,_elapsedTime,_totalTime); EXPLODE_3_PVT(_args,_magazineClassname,_lastAmmoCount,_simEvents); - if ((count _simEvents) == 0) exitWith {ERROR("No Event"); false}; -EXPLODE_3_PVT((_simEvents select 0),_nextEventTime,_nextEventType,_nextEventMags); - - +EXPLODE_3_PVT((_simEvents select 0),_nextEventTime,_nextEventIsBullet,_nextEventMags); if (_nextEventTime > _elapsedTime) exitWith {true};//waiting on next event -systemChat format ["Event %1-%2-%3", _nextEventTime,_nextEventType,_nextEventMags]; - //Verify we aren't missing any ammo _currentAmmoCount = []; @@ -40,29 +54,24 @@ if ((count _addedMagazines) > 0) then { TRACE_1("Added Magazine While Repacking",_addedMagazines); }; -_updateMagazinesOnPlayer = { - systemChat format ["Updating mags"]; - _newMagazineList = _addedMagazines + _nextEventMags; - ACE_player removeMagazines _magazineClassname; +_updateMagazinesOnPlayerFnc = { + ACE_player removeMagazines _magazineClassname; //remove inventory magazines { if (_x > 0) then { ACE_player addMagazine [_magazineClassname, _x]; }; - } forEach _newMagazineList; - _args set [1, _nextEventMags]; + } forEach (_addedMagazines + _nextEventMags); + _args set [1, _nextEventMags]; //store the new magazine }; - -if (_nextEventType == 0) then { - systemChat "reloading bullet"; +if (_nextEventIsBullet) then { playSound QGVAR(soundMagazineFinished); - if (((count _simEvents) % 3) == 0) then { - call _updateMagazinesOnPlayer; + if ((((count _simEvents) % 3) == 0) || {(count _simEvents) == 1}) then { + call _updateMagazinesOnPlayerFnc; }; } else { - systemChat "Moving to next mag"; playSound QGVAR(soundRoundFinished); - call _updateMagazinesOnPlayer; + call _updateMagazinesOnPlayerFnc; }; _simEvents deleteAt 0; //pop off the event diff --git a/addons/magazinerepack/functions/fnc_openSelectMagazineUI.sqf b/addons/magazinerepack/functions/fnc_openSelectMagazineUI.sqf index 931a0149cf..9d99ad56b5 100644 --- a/addons/magazinerepack/functions/fnc_openSelectMagazineUI.sqf +++ b/addons/magazinerepack/functions/fnc_openSelectMagazineUI.sqf @@ -1,7 +1,22 @@ -// by commy2, esteldunedain +/* + * Author: PabstMirror (based on repack from commy2, esteldunedain, Ruthberg) + * Opens the selectMenu UI to chose which magazine to repack. + * Only shows classnames that have 2+ partial magazines + * + * Arguments: + * 0: Unit (player) + * + * Return Value: + * Nothing + * + * Example: + * [_player] call ace_magazinerepack_fnc_openSelectMagazineUI + * + * Public: No + */ #include "script_component.hpp" -private ["_unit", "_magazines", "_ammos", "_repackTime", "_magazine", "_ammo", "_count", "_index", "_i", "_j", "_ammoToTransfer", "_ammoAvailable", "_ammoNeeded"]; +private ["_unitMagazines", "_unitMagCounts", "_xFullMagazineCount", "_index", "_actions", "_displayName", "_picture"]; PARAMS_1(_unit); @@ -10,11 +25,10 @@ _unitMagCounts = []; // get all mags and ammo count { - _xClassname = _x select 0; - _xCount = _x select 1; - _fullMagazineCount = getNumber (configfile >> "CfgMagazines" >> _xClassname >> "count"); + EXPLODE_2_PVT(_x,_xClassname,_xCount); + _xFullMagazineCount = getNumber (configfile >> "CfgMagazines" >> _xClassname >> "count"); - if ((_xCount != _fullMagazineCount) && {_xCount > 1}) then {//for every partial magazine + if ((_xCount != _xFullMagazineCount) && {_xCount > 0}) then {//for every partial magazine _index = _unitMagazines find _xClassname; if (_index == -1) then { _unitMagazines pushBack _xClassname; @@ -27,8 +41,6 @@ _unitMagCounts = []; _actions = [localize "STR_ACE_MagazineRepack_SelectMagazineMenu", localize "STR_ACE_MagazineRepack_SelectMagazine"] call EFUNC(interaction,prepareSelectMenu); -systemChat format ["%1 - %2", _unitMagazines, _unitMagCounts]; - { if ((count (_unitMagCounts select _forEachIndex)) >= 2) then {// Ignore invalid magazines types (need 2+ partial mags to do anything) _displayName = getText (configFile >> "CfgMagazines" >> _x >> "displayName"); @@ -39,7 +51,7 @@ systemChat format ["%1 - %2", _unitMagazines, _unitMagCounts]; [ _actions, -{ [ACE_player, _this] call FUNC(startRepackingMagazine); }, +{ [_this] call FUNC(startRepackingMagazine); }, { call EFUNC(interaction,hideMenu); if !(profileNamespace getVariable [QGVAR(AutoCloseMenu), false]) then {"Default" call EFUNC(interaction,openMenuSelf)}; diff --git a/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf b/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf index 9df248bd6c..2b8b383a9a 100644 --- a/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf +++ b/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf @@ -1,25 +1,40 @@ +/* + * Author: PabstMirror + * Simulates repacking a set of magazines. + * Returns the timing and magazines counts at every stage. + * + * Arguments: + * 0: How many rounds in a full magazine + * 1: Array of rounds in magazines + * + * Return Value: + * Array in format [time, isBullet, array of ammo counts] + * + * Example: + * [5, [1,2,3,8]] call ace_magazinerepack_fnc_simulateRepackEvents = + * [[1.5,true,[0,2,3,9]],[3.5,false,[0,2,3,9]],[5,true,[0,1,3,10]],[7,false,[0,1,3,10]],[8.5,true,[0,0,4,10]],[10.5,false,[0,0,4,10]]] + * + * Public: No + */ #include "script_component.hpp" -private ["_fullMagazineCount", "_magazines", "_newMag", "_time", "_events", "_swapAmmo", "_ammoSwaped", "_lowIndex", "_highIndex", "_ammoToTransfer", "_ammoAvailable", "_ammoNeeded"]; +private ["_newMagFnc", "_time", "_events", "_swapAmmoFnc", "_ammoSwaped", "_lowIndex", "_highIndex", "_ammoToTransfer", "_ammoAvailable", "_ammoNeeded"]; -PARAMS_2(_magazineClassname,_arrayOfAmmoCounts); +PARAMS_2(_fullMagazineCount,_arrayOfAmmoCounts); -// Calculate actual ammo to transfer during repack -_fullMagazineCount = getNumber (configfile >> "CfgMagazines" >> _magazineClassname >> "count"); - -// Sort Ascending - Don't modify orginal +// Sort Ascending - Don't modify original _arrayOfAmmoCounts = (+_arrayOfAmmoCounts) call BIS_fnc_sortNum; -_newMag = { +_newMagFnc = { _time = _time + GVAR(TimePerMagazine); - _events pushBack [_time, 1, +_arrayOfAmmoCounts]; + _events pushBack [_time, false, +_arrayOfAmmoCounts]; }; -_swapAmmo = { - for "_swapProgress" from 1 to _ammoSwaped do { +_swapAmmoFnc = { + for "_swapProgress" from 0 to (_ammoSwaped - 1) do { _time = _time + GVAR(TimePerAmmo); _arrayOfAmmoCounts set [_lowIndex, ((_arrayOfAmmoCounts select _lowIndex) - 1)]; _arrayOfAmmoCounts set [_highIndex, ((_arrayOfAmmoCounts select _highIndex) + 1)]; - _events pushBack [_time, 0, +_arrayOfAmmoCounts]; + _events pushBack [_time, true, +_arrayOfAmmoCounts]; }; }; @@ -37,14 +52,14 @@ while {_lowIndex < _highIndex} do { if (_ammoAvailable == 0) then { _lowIndex = _lowIndex + 1; - call _newMag; + call _newMagFnc; } else { if (_ammoNeeded == 0) then { _highIndex = _highIndex - 1; - call _newMag; + call _newMagFnc; } else { _ammoSwaped = _ammoAvailable min _ammoNeeded; - call _swapAmmo; + call _swapAmmoFnc; }; }; }; diff --git a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf index 8e5075e17e..c93a1bad59 100644 --- a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf +++ b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf @@ -1,18 +1,38 @@ -// by commy2, esteldunedain +/* + * Author: PabstMirror (based on repack from commy2, esteldunedain, Ruthberg) + * Starts repacking a specific magazine classname. + * Precalcs all the event timings and starts the progressBar. + * + * Arguments: + * 0: Magazine Classname + * + * Return Value: + * Nothing + * + * Example: + * ["30Rnd_65x39_caseless_mag"] call ace_magazinerepack_fnc_startRepackingMagazine + * + * Public: No + */ #include "script_component.hpp" -private ["_unit", "_magazines", "_ammos", "_repackTime", "_magazine", "_ammo", "_count", "_index", "_i", "_j", "_ammoToTransfer", "_ammoAvailable", "_ammoNeeded"]; +private ["_unit", "_fullMagazineCount", "_startingAmmoCounts", "_simEvents", "_totalTime"]; -PARAMS_2(_unit,_magazineClassname); +PARAMS_1(_magazineClassname); if (isNil "_magazineClassname" || {_magazineClassname == ""}) exitWith {ERROR("Bad Mag Classname");}; -[_unit] call EFUNC(common,goKneeling); +_unit = ACE_player; + +[ACE_player] call EFUNC(common,goKneeling); call EFUNC(interaction,hideMenu); +// Calculate actual ammo to transfer during repack +_fullMagazineCount = getNumber (configfile >> "CfgMagazines" >> _magazineClassname >> "count"); + _startingAmmoCounts = []; { EXPLODE_4_PVT(_x,_xClassname,_xCount,_xLoaded,_xType); - if (_xClassname == _magazineClassname) then { + if ((_xClassname == _magazineClassname) && {(_xCount != _fullMagazineCount) && {_xCount > 0}}) then { if (_xLoaded) then { //Try to Remove from weapon and add to inventory, otherwise ignore if (_unit canAdd _magazineClassname) then { @@ -31,9 +51,9 @@ _startingAmmoCounts = []; }; } forEach (magazinesAmmoFull _unit); -if ((count _startingAmmoCounts) == 0) exitwith {ERROR("No Mags");}; +if ((count _startingAmmoCounts) < 2) exitwith {ERROR("Not Enough Mags to Repack");}; -_simEvents = [_magazineClassname, _startingAmmoCounts] call FUNC(simulateRepackEvents); +_simEvents = [_fullMagazineCount, _startingAmmoCounts] call FUNC(simulateRepackEvents); _totalTime = (_simEvents select ((count _simEvents) - 1) select 0); [_totalTime, [_magazineClassname, _startingAmmoCounts, _simEvents], {hint "done"}, {hint "fail"}, (localize "STR_ACE_MagazineRepack_RepackingMagazine"), {_this call FUNC(magazineRepackProgress)}] call EFUNC(common,progressBar); From da9fc39103fd2c7e172984bd2fde1b155a7107a2 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 8 Feb 2015 17:35:21 -0600 Subject: [PATCH 026/166] Headers and Finish Notice --- addons/magazinerepack/XEH_preInit.sqf | 1 + .../functions/fnc_magazineRepackFinish.sqf | 52 +++++++++++++++++++ .../functions/fnc_startRepackingMagazine.sqf | 9 +++- addons/magazinerepack/stringtable.xml | 11 +++- 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf diff --git a/addons/magazinerepack/XEH_preInit.sqf b/addons/magazinerepack/XEH_preInit.sqf index e2dfd721f3..7cd7107f54 100644 --- a/addons/magazinerepack/XEH_preInit.sqf +++ b/addons/magazinerepack/XEH_preInit.sqf @@ -2,6 +2,7 @@ ADDON = false; +PREP(magazineRepackFinish); PREP(magazineRepackProgress); PREP(openSelectMagazineUI); PREP(simulateRepackEvents); diff --git a/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf b/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf new file mode 100644 index 0000000000..50817bcfe7 --- /dev/null +++ b/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf @@ -0,0 +1,52 @@ +/* + * Author: PabstMirror + * Simulates repacking a set of magazines. + * Returns the timing and magazines counts at every stage. + * + * Arguments: + * 0: Arguments [classname,lastAmmoStatus,events] + * 1: Elapsed Time + * 2: Total Time Repacking Will Take + * 3: Error Code + * + * Return Value: + * Nothing + * + * Example: + * (args from progressBar) call ace_magazinerepack_fnc_magazineRepackFinish + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_4(_args,_elapsedTime,_totalTime,_errorCode); +EXPLODE_2_PVT(_args,_magazineClassname,_lastAmmoCount); +_fullMagazineCount = getNumber (configfile >> "CfgMagazines" >> _magazineClassname >> "count"); + +_structuredOutputText = + +if (_errorCode == 0) then { + format ["%1
", (localize "STR_ACE_MagazineRepack_RepackComplete")]; +} else { + format ["%1
", (localize "STR_ACE_MagazineRepack_RepackInterrupted")]; +}; + +_picture = getText (configFile >> "CfgMagazines" >> _magazineClassname >> "picture"); +_structuredOutputText = _structuredOutputText + format ["
", _picture]; + +_fullMags = 0; +_partialMags = 0; +{ + EXPLODE_2_PVT(_x,_xClassname,_xCount); + if ((_xClassname == _magazineClassname) && {_xCount > 0}) then { + if (_xCount == _fullMagazineCount) then { + _fullMags = _fullMags + 1; + } else { + _partialMags = _partialMags + 1; + }; + }; +} forEach (magazinesAmmoFull ACE_player); + +_structuredOutputText = _structuredOutputText + format [("" + (localize "STR_ACE_MagazineRepack_RepackedMagazinesCount") + ""), _fullMags, _partialMags]; + +[parseText _structuredOutputText] call EFUNC(common,displayTextStructured); diff --git a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf index c93a1bad59..d83cc649b0 100644 --- a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf +++ b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf @@ -56,4 +56,11 @@ if ((count _startingAmmoCounts) < 2) exitwith {ERROR("Not Enough Mags to Repack" _simEvents = [_fullMagazineCount, _startingAmmoCounts] call FUNC(simulateRepackEvents); _totalTime = (_simEvents select ((count _simEvents) - 1) select 0); -[_totalTime, [_magazineClassname, _startingAmmoCounts, _simEvents], {hint "done"}, {hint "fail"}, (localize "STR_ACE_MagazineRepack_RepackingMagazine"), {_this call FUNC(magazineRepackProgress)}] call EFUNC(common,progressBar); +[ +_totalTime, +[_magazineClassname, _startingAmmoCounts, _simEvents], +{_this call FUNC(magazineRepackFinish)}, +{_this call FUNC(magazineRepackFinish)}, +(localize "STR_ACE_MagazineRepack_RepackingMagazine"), +{_this call FUNC(magazineRepackProgress)} +] call EFUNC(common,progressBar); diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml index 5ea62e3a18..2e3d9500e0 100644 --- a/addons/magazinerepack/stringtable.xml +++ b/addons/magazinerepack/stringtable.xml @@ -1,5 +1,5 @@  - + @@ -74,5 +74,14 @@ %1 tejles tár és %2 extra lőszer. %1 полных магазина(ов) и %2 патрона(ов) + + Repacking Finished + + + Repacking Interrupted + + + %1 Full and %2 Partial + \ No newline at end of file From 24bd515814a35aa8d8d47e2d5d979b8858c51f53 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 8 Feb 2015 22:44:23 -0600 Subject: [PATCH 027/166] Commenting and some stringtables --- addons/magazinerepack/CfgSounds.hpp | 2 +- addons/magazinerepack/config.cpp | 2 +- .../magazinerepack/functions/fnc_magazineRepackFinish.sqf | 2 +- .../functions/fnc_magazineRepackProgress.sqf | 7 +++---- .../magazinerepack/functions/fnc_openSelectMagazineUI.sqf | 4 ++-- .../functions/fnc_startRepackingMagazine.sqf | 3 ++- addons/magazinerepack/script_component.hpp | 2 -- addons/magazinerepack/stringtable.xml | 6 ++++++ 8 files changed, 16 insertions(+), 12 deletions(-) diff --git a/addons/magazinerepack/CfgSounds.hpp b/addons/magazinerepack/CfgSounds.hpp index bc1d0fe0ee..15104d905d 100644 --- a/addons/magazinerepack/CfgSounds.hpp +++ b/addons/magazinerepack/CfgSounds.hpp @@ -12,4 +12,4 @@ class CfgSounds sound[] = {QUOTE(PATHTOF(sounds\magrepack_single.wav)),1,1}; titles[] = {}; }; -}; \ No newline at end of file +}; diff --git a/addons/magazinerepack/config.cpp b/addons/magazinerepack/config.cpp index 2df0d62bff..3a95c10643 100644 --- a/addons/magazinerepack/config.cpp +++ b/addons/magazinerepack/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common","ace_interaction"}; + requiredAddons[] = {"ace_interaction"}; author[] = {"commy2","CAA-Picard"}; authorUrl = "https://github.com/commy2/"; VERSION_CONFIG; diff --git a/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf b/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf index 50817bcfe7..038b7fb151 100644 --- a/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf +++ b/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf @@ -1,5 +1,5 @@ /* - * Author: PabstMirror + * Author: PabstMirror (based on repack from commy2, esteldunedain, Ruthberg) * Simulates repacking a set of magazines. * Returns the timing and magazines counts at every stage. * diff --git a/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf b/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf index 3c829a8933..1d3b5ec6cf 100644 --- a/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf +++ b/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf @@ -36,6 +36,7 @@ _currentAmmoCount = []; }; } forEach (magazinesAmmo ACE_player); //only inventory mags +//Go through mags we currently have and check off the ones we should have _addedMagazines = +_currentAmmoCount; _missingAmmo = false; { @@ -49,10 +50,7 @@ _missingAmmo = false; }; } forEach _lastAmmoCount; -if (_missingAmmo) exitWith {false}; //something removed ammo that was being repacked -if ((count _addedMagazines) > 0) then { - TRACE_1("Added Magazine While Repacking",_addedMagazines); -}; +if (_missingAmmo) exitWith {false}; //something removed ammo that was being repacked (could be other players or scripts) _updateMagazinesOnPlayerFnc = { ACE_player removeMagazines _magazineClassname; //remove inventory magazines @@ -67,6 +65,7 @@ _updateMagazinesOnPlayerFnc = { if (_nextEventIsBullet) then { playSound QGVAR(soundMagazineFinished); if ((((count _simEvents) % 3) == 0) || {(count _simEvents) == 1}) then { + //For performance - only update mags every 3 bullets (or if it's the last event) call _updateMagazinesOnPlayerFnc; }; } else { diff --git a/addons/magazinerepack/functions/fnc_openSelectMagazineUI.sqf b/addons/magazinerepack/functions/fnc_openSelectMagazineUI.sqf index 9d99ad56b5..e96e84e9a1 100644 --- a/addons/magazinerepack/functions/fnc_openSelectMagazineUI.sqf +++ b/addons/magazinerepack/functions/fnc_openSelectMagazineUI.sqf @@ -37,7 +37,7 @@ _unitMagCounts = []; (_unitMagCounts select _index) pushBack _xCount; }; }; -} forEach magazinesAmmoFull _unit; +} forEach (magazinesAmmoFull _unit); _actions = [localize "STR_ACE_MagazineRepack_SelectMagazineMenu", localize "STR_ACE_MagazineRepack_SelectMagazine"] call EFUNC(interaction,prepareSelectMenu); @@ -53,7 +53,7 @@ _actions = [localize "STR_ACE_MagazineRepack_SelectMagazineMenu", localize "STR_ _actions, { [_this] call FUNC(startRepackingMagazine); }, { - call EFUNC(interaction,hideMenu); + call EFUNC(interaction,hideMenu); //ToDo: Self Interaction Integration if !(profileNamespace getVariable [QGVAR(AutoCloseMenu), false]) then {"Default" call EFUNC(interaction,openMenuSelf)}; } ] call EFUNC(interaction,openSelectMenu); diff --git a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf index d83cc649b0..06c0f0a137 100644 --- a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf +++ b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf @@ -1,6 +1,7 @@ /* * Author: PabstMirror (based on repack from commy2, esteldunedain, Ruthberg) * Starts repacking a specific magazine classname. + * If room in inventory, unload magazine from weapon to be repacked. * Precalcs all the event timings and starts the progressBar. * * Arguments: @@ -24,7 +25,7 @@ if (isNil "_magazineClassname" || {_magazineClassname == ""}) exitWith {ERROR("B _unit = ACE_player; [ACE_player] call EFUNC(common,goKneeling); -call EFUNC(interaction,hideMenu); +call EFUNC(interaction,hideMenu);//ToDo: Self Interaction Integration // Calculate actual ammo to transfer during repack _fullMagazineCount = getNumber (configfile >> "CfgMagazines" >> _magazineClassname >> "count"); diff --git a/addons/magazinerepack/script_component.hpp b/addons/magazinerepack/script_component.hpp index 15563f0fe8..7b390f7126 100644 --- a/addons/magazinerepack/script_component.hpp +++ b/addons/magazinerepack/script_component.hpp @@ -1,5 +1,3 @@ -#define DEBUG_MODE_FULL - #define COMPONENT magazinerepack #include "\z\ace\addons\main\script_mod.hpp" diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml index 2e3d9500e0..937cfcbf9a 100644 --- a/addons/magazinerepack/stringtable.xml +++ b/addons/magazinerepack/stringtable.xml @@ -76,12 +76,18 @@ Repacking Finished + Wiederverpacken Fertig + Reembalaje Finalizado Repacking Interrupted + Umpacken Unterbrochen + Reempaque Interrupted %1 Full and %2 Partial + %1 Vollständigen und %2 Teilweisen + %1 Total y %2 Parcial \ No newline at end of file From f163e307c80f8f3866e9ffa3ecab7aef88dba580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Mon, 9 Feb 2015 22:59:43 -0300 Subject: [PATCH 028/166] ace_common: throttledPublicVariable function --- addons/common/XEH_preInit.sqf | 1 + .../functions/fnc_throttledPublicVariable.sqf | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 addons/common/functions/fnc_throttledPublicVariable.sqf diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 94a0a490bf..9b8964df1b 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -127,6 +127,7 @@ PREP(toBin); PREP(toBitmask); PREP(toHex); PREP(toNumber); +PREP(throttledPublicVariable); PREP(unmuteUnit); PREP(waitAndExecute); diff --git a/addons/common/functions/fnc_throttledPublicVariable.sqf b/addons/common/functions/fnc_throttledPublicVariable.sqf new file mode 100644 index 0000000000..6953d39fb5 --- /dev/null +++ b/addons/common/functions/fnc_throttledPublicVariable.sqf @@ -0,0 +1,49 @@ +/* + * Author: CAA-Picard + * Schedules the publishment of an object variable to reduce network overhead + * + * Arguments: + * 0: Unit . + * 1: Variable name + * 2: Maximum delay + * + * Return Value: + * None + * + * Example: + * None + * + * Public: No + */ +#include "script_component.hpp" + +EXPLODE_3_PVT(_this,_unit,_varName,_maxDelay); + +// Create the publish scheduler PFH the first time +if (isNil QGVAR(publishSchedId)) then { + + GVAR(publishVarNames) = []; + GVAR(publishNextTime) = 1e7; + + GVAR(publishSchedId) = [{ + + if (diag_tickTime > GVAR(publishNextTime)) then { + { + EXPLODE_2_PVT(_x,_unit,_varName); + _unit setVariable [_varName, (_unit getVariable _varName), true]; + } forEach GVAR(publishVarNames); + + GVAR(publishVarNames) = []; + GVAR(publishNextTime) = 1e7; + }; + }, 0, []] call cba_fnc_addPerFrameHandler; +}; + +// If the variable is not on the list +if (GVAR(publishVarNames) find [_unit,_varName] == -1) exitWith { + GVAR(publishVarNames) pushBack [_unit,_varName]; + GVAR(publishNextTime) = GVAR(publishNextTime) min (diag_tickTime + _maxDelay); +}; + +// If the variable is on the list +GVAR(publishNextTime) = GVAR(publishNextTime) min (diag_tickTime + _maxDelay); \ No newline at end of file From eadcd8236649bfc4e73fdde5535a5ac102144ad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Mon, 9 Feb 2015 23:00:40 -0300 Subject: [PATCH 029/166] scopes: fixed errors, throttled sync of scope adjustment to all client and local calculation of deflections. --- addons/scopes/CfgEventHandlers.hpp | 2 +- addons/scopes/RscTitles.hpp | 2 +- addons/scopes/XEH_postInit.sqf | 2 ++ addons/scopes/XEH_preInit.sqf | 1 + addons/scopes/functions/fnc_adjustScope.sqf | 22 +++++++--------- .../scopes/functions/fnc_canAdjustScope.sqf | 7 ++--- addons/scopes/functions/fnc_firedEH.sqf | 14 ++++++---- .../scopes/functions/fnc_inventoryCheck.sqf | 9 ++++--- addons/scopes/functions/fnc_showZeroing.sqf | 26 +++++++++++++++++++ addons/scopes/scripts/script_component.hpp | 1 - addons/scopes/scripts/zeroingOnLoad.sqf | 20 -------------- 11 files changed, 59 insertions(+), 47 deletions(-) create mode 100644 addons/scopes/functions/fnc_showZeroing.sqf delete mode 100644 addons/scopes/scripts/script_component.hpp delete mode 100644 addons/scopes/scripts/zeroingOnLoad.sqf diff --git a/addons/scopes/CfgEventHandlers.hpp b/addons/scopes/CfgEventHandlers.hpp index 204f2e267e..286a08598d 100644 --- a/addons/scopes/CfgEventHandlers.hpp +++ b/addons/scopes/CfgEventHandlers.hpp @@ -13,7 +13,7 @@ class Extended_PostInit_EventHandlers { class Extended_Fired_EventHandlers { class CAManBase { class ADDON { - clientFired = QUOTE(if (_this select 0 == ACE_player) then { _this call FUNC(firedEH);};); + fired = QUOTE(_this call FUNC(firedEH);); }; }; }; diff --git a/addons/scopes/RscTitles.hpp b/addons/scopes/RscTitles.hpp index 79de7e8214..9da0a04a14 100644 --- a/addons/scopes/RscTitles.hpp +++ b/addons/scopes/RscTitles.hpp @@ -4,7 +4,7 @@ class RscTitles { movingEnable = 0; enableSimulation = 1; enableDisplay = 1; - onLoad = QUOTE(_this spawn compile preprocessFileLineNumbers QUOTE(QUOTE(PATHTOF(scripts\zeroingOnLoad.sqf))); uiNamespace setVariable [ARR_2('ACE_Scopes_Debug', _this)];); + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ZeroingDisplay)),_this select 0)];); duration = 1e+011; fadein = 0; fadeout = 0; diff --git a/addons/scopes/XEH_postInit.sqf b/addons/scopes/XEH_postInit.sqf index b7fd4bfc3a..30cc7d9384 100644 --- a/addons/scopes/XEH_postInit.sqf +++ b/addons/scopes/XEH_postInit.sqf @@ -15,6 +15,8 @@ if !(hasInterface) exitWith {}; while {True} do { waitUntil {[ACE_player, 0,0] call FUNC(canAdjustScope)}; _layer cutRsc [QGVAR(Zeroing), "PLAIN", 0, false]; + call FUNC(showZeroing); + sleep 3; _layer cutFadeOut 2; diff --git a/addons/scopes/XEH_preInit.sqf b/addons/scopes/XEH_preInit.sqf index 9dc7450c94..b0c4a50c1c 100644 --- a/addons/scopes/XEH_preInit.sqf +++ b/addons/scopes/XEH_preInit.sqf @@ -8,6 +8,7 @@ PREP(firedEH); PREP(getOptics); PREP(hideZeroing); PREP(inventoryCheck); +PREP(showZeroing); GVAR(fadeScript) = scriptNull; diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index 7db640590a..b50da5322b 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -12,7 +12,7 @@ */ #include "script_component.hpp" - + private ["_unit", "_weapons", "_zeroing", "_pitchbankyaw", "_pitch", "_bank", "_yaw", "_hint"]; _unit = _this select 0; @@ -23,15 +23,18 @@ _weapons = [ handgunWeapon _unit ]; -if (isNil QGVAR(Adjustment)) then { - GVAR(Adjustment) = [[0,0], [0,0], [0,0]]; +_adjustment = _unit getVariable QGVAR(Adjustment); +if (isNil "_adjustment") then { + _adjustment = [[0,0], [0,0], [0,0]]; }; -_zeroing = GVAR(Adjustment) select (_weapons find (currentWeapon _unit)); +_zeroing = _adjustment select (_weapons find (currentWeapon _unit)); _zeroing set [0, (round (((_zeroing select 0) + (_this select 1)) * 10)) / 10]; _zeroing set [1, (round (((_zeroing select 1) + (_this select 2)) * 10)) / 10]; -GVAR(Adjustment) set [_weapons find (currentWeapon _unit), _zeroing]; +_adjustment set [_weapons find (currentWeapon _unit), _zeroing]; +_unit setVariable [QGVAR(Adjustment), _adjustment]; +[_unit, QGVAR(Adjustment), 0.5] call EFUNC(common,throttledPublicVariable); playSound (["ACE_Scopes_Click_1", "ACE_Scopes_Click_2", "ACE_Scopes_Click_3"] select floor random 3); @@ -46,14 +49,6 @@ if (cameraView == "GUNNER") then { [_unit, _pitch, _bank, _yaw] call EFUNC(common,setPitchBankYaw) }; -_display = uiNamespace getVariable [QGVAR(ZeroingDisplay), displayNull]; -if !(isNull _display) then { - _vertical = _display displayCtrl 925002; - _horizontal = _display displayCtrl 925003; - _vertical ctrlSetText (str (_zeroing select 1)); - _horizontal ctrlSetText (str (_zeroing select 0)); -}; - if (!isNull (missionNamespace getVariable [QGVAR(fadeScript), scriptNull])) then { terminate GVAR(fadeScript); }; @@ -61,6 +56,7 @@ if (cameraView != "GUNNER") then { GVAR(fadeScript) = 0 spawn { _layer = [QGVAR(Zeroing)] call BIS_fnc_rscLayer; _layer cutRsc [QGVAR(Zeroing), "PLAIN", 0, false]; + call FUNC(showZeroing); sleep 3; _layer cutFadeOut 2; }; diff --git a/addons/scopes/functions/fnc_canAdjustScope.sqf b/addons/scopes/functions/fnc_canAdjustScope.sqf index 8aea2ff9e4..3bf4a74e21 100644 --- a/addons/scopes/functions/fnc_canAdjustScope.sqf +++ b/addons/scopes/functions/fnc_canAdjustScope.sqf @@ -25,15 +25,16 @@ _weapons = [ if !(currentWeapon _unit in _weapons) exitWith {false}; -if (isNil QGVAR(Adjustment)) then { - GVAR(Adjustment) = [[0,0], [0,0], [0,0]]; +_adjustment = _unit getVariable QGVAR(Adjustment); +if (isNil "_adjustment") then { + _adjustment = [[0,0], [0,0], [0,0]]; }; if (isNil QGVAR(Optics)) then { GVAR(Optics) = ["", "", ""]; }; -_zeroing = GVAR(Adjustment) select (_weapons find (currentWeapon _unit)); +_zeroing = _adjustment select (_weapons find (currentWeapon _unit)); _zeroX = (_zeroing select 0) + (_this select 1); _zeroY = (_zeroing select 1) + (_this select 2); diff --git a/addons/scopes/functions/fnc_firedEH.sqf b/addons/scopes/functions/fnc_firedEH.sqf index 4414f617d6..097a81fca6 100644 --- a/addons/scopes/functions/fnc_firedEH.sqf +++ b/addons/scopes/functions/fnc_firedEH.sqf @@ -1,5 +1,5 @@ /* - * Author: KoffeinFlummi + * Author: KoffeinFlummi and CAA-Picard * * Adjusts the flight path of the bullet according to the zeroing * @@ -12,13 +12,17 @@ #include "script_component.hpp" -private ["_unit", "_weaponType", "_ammoType", "_magazineType", "_round", "_weapons", "_zeroing", "_direction", "_azimuth", "_altitude", "_velocity"]; +private ["_unit", "_weaponType", "_round", "_weapons", "_zeroing", "_adjustment"]; _unit = _this select 0; + +_adjustment = _unit getVariable QGVAR(Adjustment); +if (isNil "_adjustment") exitWith {}; + +if !([_unit] call EFUNC(common,isPlayer)) exitWith {}; + _weaponType = _this select 1; -_ammoType = _this select 4; _round = _this select 5; -_magazineType = _this select 6; _weapons = [ primaryWeapon _unit, @@ -27,7 +31,7 @@ _weapons = [ ]; if !(_weaponType in _weapons) exitWith {}; -_zeroing = GVAR(Adjustment) select (_weapons find _weaponType); +_zeroing = _adjustment select (_weapons find _weaponType); // convert zeroing from mils to degrees _zeroing = [_zeroing, {_this * 0.05625}] call EFUNC(common,map); diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index 23971098d6..1e1efa2c14 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -10,13 +10,16 @@ if (isNil QGVAR(Optics)) then { GVAR(Optics) = ["", "", ""]; }; -if (isNil QGVAR(Adjustment)) then { - GVAR(Adjustment) = [[0,0], [0,0], [0,0]]; +_adjustment = ACE_player getVariable QGVAR(Adjustment); +if (isNil "_adjustment") then { + ACE_player setVariable [QGVAR(Adjustment), [[0,0], [0,0], [0,0]]]; + [ACE_player, QGVAR(Adjustment), 0.5] call EFUNC(common,throttledPublicVariable); }; { if (_new select _forEachIndex != _x) then { - GVAR(Adjustment) set [_forEachIndex, [0,0]]; + _adjustment set [_forEachIndex, [0,0]]; + [ACE_player, QGVAR(Adjustment), 0.5] call EFUNC(common,throttledPublicVariable); }; } forEach GVAR(Optics); diff --git a/addons/scopes/functions/fnc_showZeroing.sqf b/addons/scopes/functions/fnc_showZeroing.sqf new file mode 100644 index 0000000000..76d4927ae9 --- /dev/null +++ b/addons/scopes/functions/fnc_showZeroing.sqf @@ -0,0 +1,26 @@ + +#include "script_component.hpp" + +disableSerialization; + +_display = uiNamespace getVariable [QGVAR(ZeroingDisplay), displayNull]; +if (isNull _display) exitWith {}; + +_weapons = [ + primaryWeapon ACE_player, + secondaryWeapon ACE_player, + handgunWeapon ACE_player +]; + +if !((currentWeapon ACE_player) in _weapons) exitWith {}; + +_adjustment = ACE_player getVariable QGVAR(Adjustment); +if (isNil "_adjustment") then { + _adjustment = [[0,0], [0,0], [0,0]]; +}; + +_zeroing = _adjustment select (_weapons find (currentWeapon ACE_player)); +_vertical = _display displayCtrl 925002; +_horizontal = _display displayCtrl 925003; +_vertical ctrlSetText (str (_zeroing select 1)); +_horizontal ctrlSetText (str (_zeroing select 0)); diff --git a/addons/scopes/scripts/script_component.hpp b/addons/scopes/scripts/script_component.hpp deleted file mode 100644 index acca51b4b5..0000000000 --- a/addons/scopes/scripts/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\scopes\script_component.hpp" diff --git a/addons/scopes/scripts/zeroingOnLoad.sqf b/addons/scopes/scripts/zeroingOnLoad.sqf deleted file mode 100644 index 591b5fc07b..0000000000 --- a/addons/scopes/scripts/zeroingOnLoad.sqf +++ /dev/null @@ -1,20 +0,0 @@ -#include "script_component.hpp" - -disableSerialization; - -_display = _this select 0; -uiNamespace setVariable [QGVAR(ZeroingDisplay, _display]; -_vertical = _display displayCtrl 925002; -_horizontal = _display displayCtrl 925003; - -_weapons = [ - primaryWeapon player, - secondaryWeapon player, - handgunWeapon player -]; - -if ((currentWeapon ACE_player) in _weapons) then { - _zeroing = GVAR(Adjustment) select (_weapons find (currentWeapon ACE_player)); - _horizontal ctrlSetText (str (_zeroing select 0)); - _vertical ctrlSetText (str (_zeroing select 1)); -}; From ff5c5a5bac845b1fe998891d1b1f0c2ff1bc30ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Tue, 10 Feb 2015 01:22:10 -0300 Subject: [PATCH 030/166] scopes: Code cleaned up, removed spawns, added standard headers. --- addons/common/XEH_postInit.sqf | 4 +- addons/scopes/CfgEventHandlers.hpp | 32 ----------- addons/scopes/XEH_postInit.sqf | 41 ++++++-------- addons/scopes/XEH_preInit.sqf | 2 +- addons/scopes/config.cpp | 4 +- addons/scopes/functions/fnc_adjustScope.sqf | 45 ++++++--------- .../scopes/functions/fnc_canAdjustScope.sqf | 30 +++++----- addons/scopes/functions/fnc_firedEH.sqf | 37 +++++++------ addons/scopes/functions/fnc_getOptics.sqf | 15 ++--- .../scopes/functions/fnc_getWeaponIndex.sqf | 23 ++++++++ addons/scopes/functions/fnc_hideZeroing.sqf | 27 --------- .../scopes/functions/fnc_inventoryCheck.sqf | 44 ++++++++++----- addons/scopes/functions/fnc_showZeroing.sqf | 55 +++++++++++++++---- 13 files changed, 178 insertions(+), 181 deletions(-) create mode 100644 addons/scopes/functions/fnc_getWeaponIndex.sqf delete mode 100644 addons/scopes/functions/fnc_hideZeroing.sqf diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 0767e42737..dbb665d446 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -82,7 +82,7 @@ enableCamShake true; }] call FUNC(addEventhandler); -GVAR(OldPlayerInventory) = ACE_player call FUNC(getAllGear); +GVAR(OldPlayerInventory) = [ACE_player] call FUNC(getAllGear); GVAR(OldPlayerVisionMode) = currentVisionMode ACE_player; GVAR(OldZeusDisplayIsOpen) = !(isNull findDisplay 312); GVAR(OldCameraView) = cameraView; @@ -93,7 +93,7 @@ GVAR(OldPlayerTurret) = [ACE_player] call FUNC(getTurretIndex); [{ // "playerInventoryChanged" event - _newPlayerInventory = ACE_player call FUNC(getAllGear); + _newPlayerInventory = [ACE_player] call FUNC(getAllGear); if !(_newPlayerInventory isEqualTo GVAR(OldPlayerInventory)) then { // Raise ACE event locally GVAR(OldPlayerInventory) = _newPlayerInventory; diff --git a/addons/scopes/CfgEventHandlers.hpp b/addons/scopes/CfgEventHandlers.hpp index 286a08598d..b3d70a2861 100644 --- a/addons/scopes/CfgEventHandlers.hpp +++ b/addons/scopes/CfgEventHandlers.hpp @@ -17,35 +17,3 @@ class Extended_Fired_EventHandlers { }; }; }; - -class Extended_Take_EventHandlers { - class CAManBase { - class ADDON { - clientTake = QUOTE(if (_this select 0 == ACE_player) then{ _this call FUNC(inventoryCheck);};); - }; - }; -}; - -class Extended_Put_EventHandlers { - class CAManBase { - class ADDON { - clientPut = QUOTE(if (_this select 0 == ACE_player) then {_this call FUNC(inventoryCheck);};); - }; - }; -}; - -class Extended_InitPost_EventHandlers { - class CAManBase { - class ADDON { - init = QUOTE(if (_this select 0 == call EFUNC(common,player)) then{ _this call FUNC(inventoryCheck);};); - }; - }; -}; - -class Extended_Respawn_EventHandlers { - class CAManBase { - class ADDON { - respawn = QUOTE(if (_this select 0 == call EFUNC(common,player)) then{ _this call FUNC(inventoryCheck);};); - }; - }; -}; diff --git a/addons/scopes/XEH_postInit.sqf b/addons/scopes/XEH_postInit.sqf index 30cc7d9384..8de7ff8af0 100644 --- a/addons/scopes/XEH_postInit.sqf +++ b/addons/scopes/XEH_postInit.sqf @@ -9,34 +9,27 @@ if !(hasInterface) exitWith {}; -// show overlay after changing weapon/optic -0 spawn { - _layer = [QGVAR(Zeroing)] call BIS_fnc_rscLayer; - while {True} do { - waitUntil {[ACE_player, 0,0] call FUNC(canAdjustScope)}; - _layer cutRsc [QGVAR(Zeroing), "PLAIN", 0, false]; - call FUNC(showZeroing); +// Check inventory when it changes +["playerInventoryChanged", { + [ACE_player] call FUNC(inventoryCheck); +}] call EFUNC(common,addEventhandler); - sleep 3; - _layer cutFadeOut 2; - _weapon = currentWeapon ACE_player; - _optics = [ACE_player] call FUNC(getOptics); - waitUntil {sleep 0.05; !(_optics isEqualTo ([ACE_player] call FUNC(getOptics))) or (currentWeapon ACE_player != _weapon)}; - }; -}; - -// instantly hide when scoping in -0 spawn { - _layer = [QGVAR(Zeroing)] call BIS_fnc_rscLayer; - while {True} do { - waitUntil {sleep 0.05; cameraView == "GUNNER"}; - if !(isNull GVAR(fadeScript)) then { - terminate GVAR(fadeScript); - }; +// Instantly hide knobs when scoping in +["cameraViewChanged", { + EXPLODE_2_PVT(_this,_player,_newCameraView); + if (_newCameraView == "GUNNER") then { + private "_layer"; + _layer = [QGVAR(Zeroing)] call BIS_fnc_rscLayer; _layer cutText ["", "PLAIN", 0]; + + + if !(isNil QGVAR(fadePFH)) then { + [GVAR(fadePFH)] call cba_fnc_removePerFrameHandler; + GVAR(fadePFH) = nil; + }; }; -}; +}] call EFUNC(common,addEventhandler); // Add keybinds diff --git a/addons/scopes/XEH_preInit.sqf b/addons/scopes/XEH_preInit.sqf index b0c4a50c1c..5dd7153263 100644 --- a/addons/scopes/XEH_preInit.sqf +++ b/addons/scopes/XEH_preInit.sqf @@ -6,7 +6,7 @@ PREP(adjustScope); PREP(canAdjustScope); PREP(firedEH); PREP(getOptics); -PREP(hideZeroing); +PREP(getWeaponIndex); PREP(inventoryCheck); PREP(showZeroing); diff --git a/addons/scopes/config.cpp b/addons/scopes/config.cpp index 9d2ddbeacb..50ff6528d0 100644 --- a/addons/scopes/config.cpp +++ b/addons/scopes/config.cpp @@ -5,8 +5,8 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = { "ace_main", "ace_common" }; - author[] = {"KoffeinFlummi"}; + requiredAddons[] = { "ace_common" }; + author[] = {"KoffeinFlummi", "CAA-Picard"}; authorUrl = "https://github.com/KoffeinFlummi"; VERSION_CONFIG; }; diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index b50da5322b..cf4d7e7146 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -1,45 +1,44 @@ /* * Author: KoffeinFlummi - * * Changes the adjustment for the current scope * - * Arguments: - * 0: Horizontal adjustment - * 1: Vertical adjustment + * Argument: + * 0: Unit + * 1: Horizontal adjustment + * 2: Vertical adjustment * - * Return Value: - * True + * Return value: + * True + * + * Public: No */ - #include "script_component.hpp" private ["_unit", "_weapons", "_zeroing", "_pitchbankyaw", "_pitch", "_bank", "_yaw", "_hint"]; _unit = _this select 0; -_weapons = [ - primaryWeapon _unit, - secondaryWeapon _unit, - handgunWeapon _unit -]; +_weaponIndex = [_unit, currentWeapon _unit] call FUNC(getWeaponIndex); _adjustment = _unit getVariable QGVAR(Adjustment); if (isNil "_adjustment") then { _adjustment = [[0,0], [0,0], [0,0]]; + _unit setVariable [QGVAR(Adjustment), _adjustment]; }; -_zeroing = _adjustment select (_weapons find (currentWeapon _unit)); +_zeroing = _adjustment select _weaponIndex; _zeroing set [0, (round (((_zeroing select 0) + (_this select 1)) * 10)) / 10]; _zeroing set [1, (round (((_zeroing select 1) + (_this select 2)) * 10)) / 10]; -_adjustment set [_weapons find (currentWeapon _unit), _zeroing]; -_unit setVariable [QGVAR(Adjustment), _adjustment]; +// Change the adjustment array +_adjustment set [_weaponIndex, _zeroing]; [_unit, QGVAR(Adjustment), 0.5] call EFUNC(common,throttledPublicVariable); playSound (["ACE_Scopes_Click_1", "ACE_Scopes_Click_2", "ACE_Scopes_Click_3"] select floor random 3); // slightly rotate the player if looking through optic if (cameraView == "GUNNER") then { + _pitchbankyaw = [_unit] call EFUNC(common,getPitchBankYaw); // these are not exact mil-to-degree conversions, but instead chosen // to minimize the effect of rounding errors @@ -47,19 +46,11 @@ if (cameraView == "GUNNER") then { _bank = _pitchbankyaw select 1; _yaw = (_pitchbankyaw select 2) + ((_this select 1) * -0.04); [_unit, _pitch, _bank, _yaw] call EFUNC(common,setPitchBankYaw) -}; -if (!isNull (missionNamespace getVariable [QGVAR(fadeScript), scriptNull])) then { - terminate GVAR(fadeScript); -}; -if (cameraView != "GUNNER") then { - GVAR(fadeScript) = 0 spawn { - _layer = [QGVAR(Zeroing)] call BIS_fnc_rscLayer; - _layer cutRsc [QGVAR(Zeroing), "PLAIN", 0, false]; - call FUNC(showZeroing); - sleep 3; - _layer cutFadeOut 2; - }; +} else { + + [] call FUNC(showZeroing); + }; true diff --git a/addons/scopes/functions/fnc_canAdjustScope.sqf b/addons/scopes/functions/fnc_canAdjustScope.sqf index 3bf4a74e21..75d5dd73a7 100644 --- a/addons/scopes/functions/fnc_canAdjustScope.sqf +++ b/addons/scopes/functions/fnc_canAdjustScope.sqf @@ -1,29 +1,25 @@ /* * Author: KoffeinFlummi - * * Checks if a player can adjust his optic in the given way. * - * Arguments: - * 0: Horizontal adjustment - * 1: Vertical adjustment + * Argument: + * 0: Unit + * 1: Horizontal adjustment + * 2: Vertical adjustment * - * Return Value: - * Can adjustment be done? (Bool) + * Return value: + * Can adjustment be done? + * + * Public: No */ - #include "script_component.hpp" -private ["_unit", "_weapons", "_zeroing", "_optic", "_maxHorizontal", "_maxVertical"]; +private ["_unit", "_weaponIndex", "_zeroing", "_optic", "_maxHorizontal", "_maxVertical"]; _unit = _this select 0; -_weapons = [ - primaryWeapon _unit, - secondaryWeapon _unit, - handgunWeapon _unit -]; - -if !(currentWeapon _unit in _weapons) exitWith {false}; +_weaponIndex = [_unit, currentWeapon _unit] call FUNC(getWeaponIndex); +if (_weaponIndex < 0) exitWith {false}; _adjustment = _unit getVariable QGVAR(Adjustment); if (isNil "_adjustment") then { @@ -34,11 +30,11 @@ if (isNil QGVAR(Optics)) then { GVAR(Optics) = ["", "", ""]; }; -_zeroing = _adjustment select (_weapons find (currentWeapon _unit)); +_zeroing = _adjustment select _weaponIndex; _zeroX = (_zeroing select 0) + (_this select 1); _zeroY = (_zeroing select 1) + (_this select 2); -_optic = GVAR(Optics) select (_weapons find (currentWeapon _unit)); +_optic = GVAR(Optics) select _weaponIndex; _maxHorizontal = getArray (configFile >> "CfgWeapons" >> _optic >> "ACE_ScopeAdjust_Horizontal"); _maxVertical = getArray (configFile >> "CfgWeapons" >> _optic >> "ACE_ScopeAdjust_Vertical"); if ((count _maxHorizontal < 2) or (count _maxVertical < 2)) exitWith {false}; diff --git a/addons/scopes/functions/fnc_firedEH.sqf b/addons/scopes/functions/fnc_firedEH.sqf index 097a81fca6..b6da3c7a9e 100644 --- a/addons/scopes/functions/fnc_firedEH.sqf +++ b/addons/scopes/functions/fnc_firedEH.sqf @@ -1,39 +1,42 @@ /* * Author: KoffeinFlummi and CAA-Picard - * * Adjusts the flight path of the bullet according to the zeroing * - * Arguments: - * Fired EH + * Argument: + * 0: Unit + * 1: Weapon + * 3: Muzzle + * 4: Magazine + * 5: Ammo + * 6: Projectile * - * Return Value: + * Return value: * None + * + * Public: No */ - #include "script_component.hpp" -private ["_unit", "_weaponType", "_round", "_weapons", "_zeroing", "_adjustment"]; +private ["_unit", "_adjustment", "_weapon", "_projectile", "_weaponIndex", "_zeroing", "_adjustment"]; _unit = _this select 0; +// Exit if the unit doesn't have any adjusment variable _adjustment = _unit getVariable QGVAR(Adjustment); if (isNil "_adjustment") exitWith {}; +// Exit if the unit isn't a player if !([_unit] call EFUNC(common,isPlayer)) exitWith {}; -_weaponType = _this select 1; -_round = _this select 5; +_weapon = _this select 1; +_projectile = _this select 5; -_weapons = [ - primaryWeapon _unit, - secondaryWeapon _unit, - handgunWeapon _unit -]; -if !(_weaponType in _weapons) exitWith {}; +_weaponIndex = [_unit, currentWeapon _unit] call FUNC(getWeaponIndex); +if (_weaponIndex < 0) exitWith {}; -_zeroing = _adjustment select (_weapons find _weaponType); +_zeroing = _adjustment select _weaponIndex; -// convert zeroing from mils to degrees +// Convert zeroing from mils to degrees _zeroing = [_zeroing, {_this * 0.05625}] call EFUNC(common,map); -[_round, _zeroing select 0, _zeroing select 1, 0] call EFUNC(common,changeProjectileDirection); +[_projectile, _zeroing select 0, _zeroing select 1, 0] call EFUNC(common,changeProjectileDirection); diff --git a/addons/scopes/functions/fnc_getOptics.sqf b/addons/scopes/functions/fnc_getOptics.sqf index 7ff2c7ea1d..289ed5e7bd 100644 --- a/addons/scopes/functions/fnc_getOptics.sqf +++ b/addons/scopes/functions/fnc_getOptics.sqf @@ -1,21 +1,22 @@ /* * Author: commy2 - * * Gets the optic classnames of all currently equipped weapons. * * Arguments: - * 0: Unit (Object) + * 0: Unit * * Return Value: - * [optic of primary, optic of secondary, optic of handgun] (Array) + * 0: Optic of primary + * 1: Optic of secondary + * 2: Optic of handgun + * + * Public: No */ - #include "script_component.hpp" -private ["_unit", "_array"]; - -_unit = _this select 0; +EXPLODE_1_PVT(_this,_unit); +private ["_array"]; _array = ["", "", ""]; if !(_unit isKindOf "CAManBase") exitWith {_array}; diff --git a/addons/scopes/functions/fnc_getWeaponIndex.sqf b/addons/scopes/functions/fnc_getWeaponIndex.sqf new file mode 100644 index 0000000000..05c1202795 --- /dev/null +++ b/addons/scopes/functions/fnc_getWeaponIndex.sqf @@ -0,0 +1,23 @@ +/* + * Author: commy2 + * Get the index of the weapon. + * 0 = primary, 1 = secondary, 2 = handgun, -1 = other + * + * Argument: + * 0: Unit + * 1: Weapon + * + * Return value: + * Weapon index + * + * Public: No + */ + #include "script_component.hpp" + + EXPLODE_2_PVT(_this,_unit,_weapon); + +[ + primaryWeapon _unit, + secondaryWeapon _unit, + handgunWeapon _unit +] find _weapon diff --git a/addons/scopes/functions/fnc_hideZeroing.sqf b/addons/scopes/functions/fnc_hideZeroing.sqf deleted file mode 100644 index b41fd1dab6..0000000000 --- a/addons/scopes/functions/fnc_hideZeroing.sqf +++ /dev/null @@ -1,27 +0,0 @@ -// by commy2 - -#include "script_component.hpp" - -private ["_state", "_ctrl"]; - -_state = _this select 0; - -disableSerialization; -_ctrl = (uiNamespace getVariable ['ACE_dlgWeaponZeroing', displayNull]) displayCtrl 168; - -if (_state) then { - _ctrl ctrlSetPosition [0,0,0,0]; -} else { - private "_config"; - - _config = configFile >> "RscInGameUI" >> "RscWeaponZeroing" >> "CA_Zeroing"; - - _ctrl ctrlSetPosition [ - getNumber (_config >> "x"), - getNumber (_config >> "y"), - getNumber (_config >> "w"), - getNumber (_config >> "h") - ]; -}; - -_ctrl ctrlCommit 0; diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index 1e1efa2c14..dba446912d 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -1,26 +1,42 @@ -// by KoffeinFlummi / commy2 - +/* + * Author: KoffeinFlummi and Commy2 + * Check if weapon optics changed and reset zeroing if needed + * + * Arguments: + * 0: Player + * + * Return Value: + * None + * + * Public: No + */ #include "script_component.hpp" -private "_new"; +EXPLODE_1_PVT(_this,_player); -_new = _this call FUNC(getOptics); +private ["_newOptics", "_adjustment"]; + +_adjustment = ACE_player getVariable QGVAR(Adjustment); +if (isNil "_adjustment") then { + _adjustment = [[0,0], [0,0], [0,0]]; + ACE_player setVariable [QGVAR(Adjustment), _adjustment]; + [ACE_player, QGVAR(Adjustment), 0.5] call EFUNC(common,throttledPublicVariable); +}; if (isNil QGVAR(Optics)) then { GVAR(Optics) = ["", "", ""]; }; - -_adjustment = ACE_player getVariable QGVAR(Adjustment); -if (isNil "_adjustment") then { - ACE_player setVariable [QGVAR(Adjustment), [[0,0], [0,0], [0,0]]]; - [ACE_player, QGVAR(Adjustment), 0.5] call EFUNC(common,throttledPublicVariable); -}; +_newOptics = [_player] call FUNC(getOptics); { - if (_new select _forEachIndex != _x) then { - _adjustment set [_forEachIndex, [0,0]]; - [ACE_player, QGVAR(Adjustment), 0.5] call EFUNC(common,throttledPublicVariable); + if (_newOptics select _forEachIndex != _x) then { + // The optic for this weapon changed, set adjustment to zero + if !((_adjustment select _foreachindex) isEqualTo [0,0]) then { + _adjustment set [_forEachIndex, [0,0]]; + [ACE_player, QGVAR(Adjustment), 0.5] call EFUNC(common,throttledPublicVariable); + }; }; } forEach GVAR(Optics); -GVAR(Optics) = _new; +_adjustment = ACE_player getVariable QGVAR(Adjustment); +GVAR(Optics) = _newOptics; diff --git a/addons/scopes/functions/fnc_showZeroing.sqf b/addons/scopes/functions/fnc_showZeroing.sqf index 76d4927ae9..3d729e81db 100644 --- a/addons/scopes/functions/fnc_showZeroing.sqf +++ b/addons/scopes/functions/fnc_showZeroing.sqf @@ -1,26 +1,59 @@ - +/* + * Author: KoffeinFlummi and CAA-Picard + * Display the adjustment knobs, update their value and fade them out later + * + * Arguments: + * None + * + * Return Value: + * None + * + * Public: No + */ #include "script_component.hpp" disableSerialization; -_display = uiNamespace getVariable [QGVAR(ZeroingDisplay), displayNull]; -if (isNull _display) exitWith {}; +private ["_weaponIndex","_adjustment","_layer","_display","_zeroing","_vertical","_horizontal"]; -_weapons = [ - primaryWeapon ACE_player, - secondaryWeapon ACE_player, - handgunWeapon ACE_player -]; - -if !((currentWeapon ACE_player) in _weapons) exitWith {}; +_weaponIndex = [ACE_player, currentWeapon ACE_player] call FUNC(getWeaponIndex); +if (_weaponIndex < 0) exitWith {}; _adjustment = ACE_player getVariable QGVAR(Adjustment); if (isNil "_adjustment") then { _adjustment = [[0,0], [0,0], [0,0]]; }; -_zeroing = _adjustment select (_weapons find (currentWeapon ACE_player)); +// Display the adjustment knobs +_layer = [QGVAR(Zeroing)] call BIS_fnc_rscLayer; +_layer cutRsc [QGVAR(Zeroing), "PLAIN", 0, false]; + +// Find the display +_display = uiNamespace getVariable [QGVAR(ZeroingDisplay), displayNull]; +if (isNull _display) exitWith {}; + +// Update values +_zeroing = _adjustment select _weaponIndex; _vertical = _display displayCtrl 925002; _horizontal = _display displayCtrl 925003; _vertical ctrlSetText (str (_zeroing select 1)); _horizontal ctrlSetText (str (_zeroing select 0)); + +// Set the time when to hide the knobs +GVAR(timeToHide) = diag_tickTime + 3.0; + +if !(isNil QGVAR(fadePFH)) exitWith {}; + +// Launch a PFH to wait and fade out the knobs +GVAR(fadePFH) = [{ + + if (diag_tickTime >= GVAR(timeToHide)) exitWith { + private "_layer"; + _layer = [QGVAR(Zeroing)] call BIS_fnc_rscLayer; + _layer cutFadeOut 2; + + GVAR(fadePFH) = nil; + [_this select 1] call cba_fnc_removePerFrameHandler; + }; + +}, 0.1, []] call CBA_fnc_addPerFrameHandler From b3f68467bb7d7f396623851897eb251484b47a34 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 9 Feb 2015 23:33:50 -0600 Subject: [PATCH 031/166] Wrong Actions in CfgMoves --- addons/captives/CfgMoves.hpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp index 288d153d7b..6e67f3615b 100644 --- a/addons/captives/CfgMoves.hpp +++ b/addons/captives/CfgMoves.hpp @@ -7,14 +7,16 @@ class CfgMovesBasic { stop = "ACE_AmovPercMstpScapWnonDnon"; StopRelaxed = "ACE_AmovPercMstpScapWnonDnon"; default = "ACE_AmovPercMstpScapWnonDnon"; + PutDown = ""; getOver = ""; throwPrepare = ""; throwGrenade[] = {"","Gesture"}; }; class ACE_CivilStandSurrenderActions: ACE_CivilStandHandcuffedActions { - stop = "ACE_AmovPercMstpScapWnonDnon"; - StopRelaxed = "ACE_AmovPercMstpScapWnonDnon"; - default = "ACE_AmovPercMstpScapWnonDnon"; + stop = "ACE_AmovPercMstpSsurWnonDnon"; + StopRelaxed = "ACE_AmovPercMstpSsurWnonDnon"; + default = "ACE_AmovPercMstpSsurWnonDnon"; + PutDown = ""; }; }; }; From 3f8f08cc8b6dee07cefb15e42faf869f74b50eac Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 11 Feb 2015 14:51:21 +0100 Subject: [PATCH 032/166] no holding key with fcs --- addons/common/functions/fnc_getGunner.sqf | 2 +- addons/fcs/CfgEventHandlers.hpp | 4 +- addons/fcs/CfgVehicles.hpp | 4 +- addons/fcs/initKeybinds.sqf | 8 +++ addons/vector/XEH_postInit.sqf | 76 +-------------------- addons/vector/initKeybinds.sqf | 83 +++++++++++++++++++++++ 6 files changed, 97 insertions(+), 80 deletions(-) create mode 100644 addons/vector/initKeybinds.sqf diff --git a/addons/common/functions/fnc_getGunner.sqf b/addons/common/functions/fnc_getGunner.sqf index 2510c2ddc4..0c82066e4b 100644 --- a/addons/common/functions/fnc_getGunner.sqf +++ b/addons/common/functions/fnc_getGunner.sqf @@ -1,7 +1,7 @@ /* * Author: commy2 * - * Get the gunner of a vehicle who uses the given weapon type. Requires every turret to have a different weapons. + * Get the gunner of a vehicle who uses the given weapon type. Requires every turret to have a different weapon. * * Argument: * 0: The vehicle (Object) diff --git a/addons/fcs/CfgEventHandlers.hpp b/addons/fcs/CfgEventHandlers.hpp index 0d507b359d..28e1bd4a85 100644 --- a/addons/fcs/CfgEventHandlers.hpp +++ b/addons/fcs/CfgEventHandlers.hpp @@ -1,12 +1,12 @@ class Extended_PreInit_EventHandlers { class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_preInit) ); + init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; }; class Extended_PostInit_EventHandlers { class ADDON { - clientInit = QUOTE(call COMPILE_FILE(XEH_clientInit) ); + clientInit = QUOTE(call COMPILE_FILE(XEH_clientInit)); }; }; diff --git a/addons/fcs/CfgVehicles.hpp b/addons/fcs/CfgVehicles.hpp index 1e8e309b55..16902d9ee0 100644 --- a/addons/fcs/CfgVehicles.hpp +++ b/addons/fcs/CfgVehicles.hpp @@ -28,7 +28,7 @@ class CfgVehicles { displayName = $STR_ACE_FCS_ResetFCS; enableInside = 1; condition = QUOTE(call FUNC(canResetFCS)); - statement = QUOTE([ARR_2(_vehicle,[_player] call DEFUNC(common,getTurretIndex))] call FUNC(reset);); + statement = QUOTE([ARR_2(_vehicle,[_player] call DEFUNC(common,getTurretIndex))] call DFUNC(reset);); showDisabled = 0; priority = 1; icon = ""; @@ -42,7 +42,7 @@ class CfgVehicles { displayName = $STR_ACE_FCS_ResetFCS; enableInside = 1; condition = QUOTE(call FUNC(canResetFCS)); - statement = QUOTE([ARR_2(_vehicle,[_player] call DEFUNC(common,getTurretIndex))] call FUNC(reset);); + statement = QUOTE([ARR_2(_vehicle,[_player] call DEFUNC(common,getTurretIndex))] call DFUNC(reset);); showDisabled = 0; priority = 1; icon = ""; diff --git a/addons/fcs/initKeybinds.sqf b/addons/fcs/initKeybinds.sqf index 444891903b..bc3cf33bf5 100644 --- a/addons/fcs/initKeybinds.sqf +++ b/addons/fcs/initKeybinds.sqf @@ -1,3 +1,4 @@ +// by commy2 ["ACE3", localize "STR_ACE_FCS_LaseTarget", @@ -8,6 +9,10 @@ // Conditions: specific if !(!GVAR(enabled) && {call FUNC(canUseRangefinder) || FUNC(canUseFCS)}) exitWith {false}; + // prevent holding down + if (GETGVAR(isDownStateKey1,false)) exitWith {false}; + GVAR(isDownStateKey1) = true; + // Statement [vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex)] call FUNC(keyDown); // Return false so it doesn't block the rest weapon action @@ -21,6 +26,9 @@ ["ACE3", localize "STR_ACE_FCS_LaseTarget", { + // prevent holding down + GVAR(isDownStateKey1) = false; + // Conditions: canInteract _exceptions = []; if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; diff --git a/addons/vector/XEH_postInit.sqf b/addons/vector/XEH_postInit.sqf index 0a8f031347..8bbf7d7aa6 100644 --- a/addons/vector/XEH_postInit.sqf +++ b/addons/vector/XEH_postInit.sqf @@ -1,78 +1,4 @@ // by commy2 #include "script_component.hpp" -["ACE3", - localize "STR_ACE_Vector_AzimuthKey", - { - // Conditions: canInteract - _exceptions = []; - if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; - // Conditions: specific - if !(currentWeapon ACE_player == "ACE_Vector" && {ACE_player == cameraOn} && {cameraView == "GUNNER"} && {!(GETGVAR(isDownStateKeyAzimuth,false))}) exitWith {false}; - - GVAR(isDownStateKeyAzimuth) = true; - - // Statement - ["azimuth"] call FUNC(onKeyDown); - true - }, - [15, [false, false, false]], - false, - "keydown" -] call CBA_fnc_registerKeybind; - -["ACE3", - localize "STR_ACE_Vector_AzimuthKey", - { - GVAR(isDownStateKeyAzimuth) = false; - - // Conditions: canInteract - _exceptions = []; - if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; - - // Statement - ["azimuth"] call FUNC(onKeyUp); - true - }, - [15, [false, false, false]], - false, - "keyup" -] call CBA_fnc_registerKeybind; - -["ACE3", - localize "STR_ACE_Vector_DistanceKey", - { - // Conditions: canInteract - _exceptions = []; - if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; - // Conditions: specific - if !(currentWeapon ACE_player == "ACE_Vector" && {ACE_player == cameraOn} && {cameraView == "GUNNER"} && {!(GETGVAR(isDownStateKeyDistance,false))}) exitWith {false}; - - GVAR(isDownStateKeyDistance) = true; - - // Statement - ["distance"] call FUNC(onKeyDown); - true - }, - [19, [false, false, false]], - false, - "keydown" -] call CBA_fnc_registerKeybind; - -["ACE3", - localize "STR_ACE_Vector_DistanceKey", - { - GVAR(isDownStateKeyDistance) = false; - - // Conditions: canInteract - _exceptions = []; - if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; - - // Statement - ["distance"] call FUNC(onKeyUp); - true - }, - [19, [false, false, false]], - false, - "keyup" -] call CBA_fnc_registerKeybind; +#include "initKeybinds.sqf" diff --git a/addons/vector/initKeybinds.sqf b/addons/vector/initKeybinds.sqf new file mode 100644 index 0000000000..f81c280905 --- /dev/null +++ b/addons/vector/initKeybinds.sqf @@ -0,0 +1,83 @@ +// by commy2 + +["ACE3", + localize "STR_ACE_Vector_AzimuthKey", + { + // Conditions: canInteract + _exceptions = []; + if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; + // Conditions: specific + if !(currentWeapon ACE_player == "ACE_Vector" && {ACE_player == cameraOn} && {cameraView == "GUNNER"}) exitWith {false}; + + // prevent holding down + if (GETGVAR(isDownStateKey1,false)) exitWith {false}; + GVAR(isDownStateKey1) = true; + + // Statement + ["azimuth"] call FUNC(onKeyDown); + true + }, + [15, [false, false, false]], + false, + "keydown" +] call CBA_fnc_registerKeybind; + +["ACE3", + localize "STR_ACE_Vector_AzimuthKey", + { + // prevent holding down + GVAR(isDownStateKey1) = false; + + // Conditions: canInteract + _exceptions = []; + if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; + + // Statement + ["azimuth"] call FUNC(onKeyUp); + true + }, + [15, [false, false, false]], + false, + "keyup" +] call CBA_fnc_registerKeybind; + +["ACE3", + localize "STR_ACE_Vector_DistanceKey", + { + // Conditions: canInteract + _exceptions = []; + if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; + // Conditions: specific + if !(currentWeapon ACE_player == "ACE_Vector" && {ACE_player == cameraOn} && {cameraView == "GUNNER"}) exitWith {false}; + + // prevent holding down + if (GETGVAR(isDownStateKey2,false)) exitWith {false}; + GVAR(isDownStateKey2) = true; + + // Statement + ["distance"] call FUNC(onKeyDown); + true + }, + [19, [false, false, false]], + false, + "keydown" +] call CBA_fnc_registerKeybind; + +["ACE3", + localize "STR_ACE_Vector_DistanceKey", + { + // prevent holding down + GVAR(isDownStateKey2) = false; + + // Conditions: canInteract + _exceptions = []; + if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; + + // Statement + ["distance"] call FUNC(onKeyUp); + true + }, + [19, [false, false, false]], + false, + "keyup" +] call CBA_fnc_registerKeybind; From 7360277d09cfc09d90fb1d0f4b9f22d15ff0bf28 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 11 Feb 2015 15:29:42 +0100 Subject: [PATCH 033/166] fix error in canUseFCS --- addons/fcs/CfgEventHandlers.hpp | 22 +++++++++++++++++++++- addons/fcs/functions/fnc_canUseFCS.sqf | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/addons/fcs/CfgEventHandlers.hpp b/addons/fcs/CfgEventHandlers.hpp index 28e1bd4a85..59956f2702 100644 --- a/addons/fcs/CfgEventHandlers.hpp +++ b/addons/fcs/CfgEventHandlers.hpp @@ -11,7 +11,27 @@ class Extended_PostInit_EventHandlers { }; class Extended_Init_EventHandlers { - class AllVehicles { + class Tank { + class ADDON { + clientInit = QUOTE(_this call FUNC(vehicleInit)); + }; + }; + class Car { + class ADDON { + clientInit = QUOTE(_this call FUNC(vehicleInit)); + }; + }; + class Helicopter { + class ADDON { + clientInit = QUOTE(_this call FUNC(vehicleInit)); + }; + }; + class Plane { + class ADDON { + clientInit = QUOTE(_this call FUNC(vehicleInit)); + }; + }; + class Ship_F { class ADDON { clientInit = QUOTE(_this call FUNC(vehicleInit)); }; diff --git a/addons/fcs/functions/fnc_canUseFCS.sqf b/addons/fcs/functions/fnc_canUseFCS.sqf index 854dcf5cec..cb4a1b608d 100644 --- a/addons/fcs/functions/fnc_canUseFCS.sqf +++ b/addons/fcs/functions/fnc_canUseFCS.sqf @@ -12,5 +12,5 @@ #include "script_component.hpp" -getNumber ([configFile >> "CfgVehicles" >> typeOf _vehicle, [_player] call EFUNC(common,getTurretIndex)] call EFUNC(common,getTurretConfigPath) >> QGVAR(Enabled)) == 1 +getNumber ([configFile >> "CfgVehicles" >> typeOf vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex)] call EFUNC(common,getTurretConfigPath) >> QGVAR(Enabled)) == 1 && {cameraView == "GUNNER"} From 3568d0d72e6f4dad4cb6afe0402fc8dedcd45a7f Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 11 Feb 2015 16:35:42 +0100 Subject: [PATCH 034/166] fix in fcs vehicleInit --- addons/fcs/CfgEventHandlers.hpp | 28 ++++++++++++++++++++++++ addons/fcs/functions/fnc_vehicleInit.sqf | 13 +++++------ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/addons/fcs/CfgEventHandlers.hpp b/addons/fcs/CfgEventHandlers.hpp index 59956f2702..ff0812420a 100644 --- a/addons/fcs/CfgEventHandlers.hpp +++ b/addons/fcs/CfgEventHandlers.hpp @@ -37,3 +37,31 @@ class Extended_Init_EventHandlers { }; }; }; + +class Extended_FiredBIS_EventHandlers { + class Tank { + class ADDON { + clientInit = QUOTE(_this call FUNC(firedEH)); + }; + }; + class Car { + class ADDON { + clientInit = QUOTE(_this call FUNC(firedEH)); + }; + }; + class Helicopter { + class ADDON { + clientInit = QUOTE(_this call FUNC(firedEH)); + }; + }; + class Plane { + class ADDON { + clientInit = QUOTE(_this call FUNC(firedEH)); + }; + }; + class Ship_F { + class ADDON { + clientInit = QUOTE(_this call FUNC(firedEH)); + }; + }; +}; diff --git a/addons/fcs/functions/fnc_vehicleInit.sqf b/addons/fcs/functions/fnc_vehicleInit.sqf index 29de520f5d..fa808c7c27 100644 --- a/addons/fcs/functions/fnc_vehicleInit.sqf +++ b/addons/fcs/functions/fnc_vehicleInit.sqf @@ -17,9 +17,10 @@ private "_vehicle"; _vehicle = _this select 0; { - if (getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> QGVAR(Enabled)) == 1) then { // @todo for all turrets - _vehicle addEventHandler ["Fired", {_this call FUNC(firedEH)}]; + private "_turretConfig"; + _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _x] call EFUNC(common,getTurretConfigPath); + if (getNumber (_turretConfig >> QGVAR(Enabled)) == 1) then { _vehicle setVariable [format ["%1_%2", QGVAR(Distance), _x], 0, true]; _vehicle setVariable [format ["%1_%2", QGVAR(Magazines), _x], [], true]; _vehicle setVariable [format ["%1_%2", QGVAR(Elevation), _x], [], true]; @@ -27,12 +28,10 @@ _vehicle = _this select 0; // calculate offset between gunner camera and muzzle position if !(_vehicle isKindOf "Air") then { - private ["_turretConfig", "_gunBeg", "_gunnerView", "_gunBegPos", "_gunnerViewPos", "_viewDiff"]; + private ["_gunBeg", "_gunnerView", "_gunBegPos", "_gunnerViewPos", "_viewDiff"]; - _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _x] call EFUNC(common,getTurretConfigPath); - - _gunBeg = getText (_turretConfig >> "gunBeg"); // @todo player turret path - _gunnerView = getText (_turretConfig >> "memoryPointGunnerOptics"); // @todo player turret path + _gunBeg = getText (_turretConfig >> "gunBeg"); + _gunnerView = getText (_turretConfig >> "memoryPointGunnerOptics"); _gunBegPos = (_vehicle selectionPosition _gunBeg) select 0; _gunnerViewPos = (_vehicle selectionPosition _gunnerView) select 0; From 4695376f55f5b4164577dbf7fd887756411ed29e Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 11 Feb 2015 18:49:14 +0100 Subject: [PATCH 035/166] fix eventhandler name --- addons/fcs/CfgEventHandlers.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/fcs/CfgEventHandlers.hpp b/addons/fcs/CfgEventHandlers.hpp index ff0812420a..409267a8c8 100644 --- a/addons/fcs/CfgEventHandlers.hpp +++ b/addons/fcs/CfgEventHandlers.hpp @@ -41,27 +41,27 @@ class Extended_Init_EventHandlers { class Extended_FiredBIS_EventHandlers { class Tank { class ADDON { - clientInit = QUOTE(_this call FUNC(firedEH)); + firedBIS = QUOTE(_this call FUNC(firedEH)); }; }; class Car { class ADDON { - clientInit = QUOTE(_this call FUNC(firedEH)); + firedBIS = QUOTE(_this call FUNC(firedEH)); }; }; class Helicopter { class ADDON { - clientInit = QUOTE(_this call FUNC(firedEH)); + firedBIS = QUOTE(_this call FUNC(firedEH)); }; }; class Plane { class ADDON { - clientInit = QUOTE(_this call FUNC(firedEH)); + firedBIS = QUOTE(_this call FUNC(firedEH)); }; }; class Ship_F { class ADDON { - clientInit = QUOTE(_this call FUNC(firedEH)); + firedBIS = QUOTE(_this call FUNC(firedEH)); }; }; }; From 0d3e103de199989549d18a4598982a766b6de33b Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 11 Feb 2015 20:59:41 +0100 Subject: [PATCH 036/166] fcs work around for weaponDirection with commander turrets --- addons/fcs/functions/fnc_keyDown.sqf | 10 +++++++++- addons/fcs/functions/fnc_keyUp.sqf | 13 +++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/addons/fcs/functions/fnc_keyDown.sqf b/addons/fcs/functions/fnc_keyDown.sqf index 4cfcf7c57a..5a3febf6ea 100644 --- a/addons/fcs/functions/fnc_keyDown.sqf +++ b/addons/fcs/functions/fnc_keyDown.sqf @@ -28,7 +28,15 @@ if (_distance == 0) then { _distance = [5, 5000, 0] call EFUNC(common,getTargetDistance); // maximum distance: 5000m, 5m precision }; -_weaponDirection = _vehicle weaponDirection (_vehicle currentWeaponTurret _turret); +_weaponDirection = _vehicle weaponDirection (_vehicle currentWeaponTurret _turret); // @todo doesn't work for sub turrets + +if (_turret isEqualTo ([typeOf _vehicle] call EFUNC(common,getTurretCommander))) then { + _weaponDirection = eyeDirection _vehicle; +}; + +if (_weaponDirection isEqualTo [0,0,0]) then { // dummy value for non main turrets + _weaponDirection = [1,0,0]; +}; GVAR(Position) = [ (getPos _vehicle select 0) + _distance * (_weaponDirection select 0), diff --git a/addons/fcs/functions/fnc_keyUp.sqf b/addons/fcs/functions/fnc_keyUp.sqf index 78a622331f..96e85714fd 100644 --- a/addons/fcs/functions/fnc_keyUp.sqf +++ b/addons/fcs/functions/fnc_keyUp.sqf @@ -21,7 +21,7 @@ _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _turret] call E _distance = call FUNC(getRange); -_magazines = magazines _vehicle; +_magazines = _vehicle magazinesTurret _turret; if (_distance == 0) then { _distance = [ @@ -33,7 +33,16 @@ if (_distance == 0) then { private ["_weaponDirection", "_angleTarget"]; -_weaponDirection = _vehicle weaponDirection currentWeapon _vehicle; +_weaponDirection = _vehicle weaponDirection (_vehicle currentWeaponTurret _turret); // @todo doesn't work for sub turrets + +if (_turret isEqualTo ([typeOf _vehicle] call EFUNC(common,getTurretCommander))) then { + _weaponDirection = eyeDirection _vehicle; +}; + +if (_weaponDirection isEqualTo [0,0,0]) then { // dummy value for non main turrets + _weaponDirection = [1,0,0]; +}; + _angleTarget = asin (_weaponDirection select 2); if (count _this > 2) then { From d18f470394d9ddfce5a15b861d83cda42a578d6f Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 11 Feb 2015 22:39:31 +0100 Subject: [PATCH 037/166] allow rangefinder while the fcs is active --- addons/fcs/XEH_clientInit.sqf | 2 +- addons/fcs/functions/fnc_keyDown.sqf | 2 +- addons/fcs/initKeybinds.sqf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/fcs/XEH_clientInit.sqf b/addons/fcs/XEH_clientInit.sqf index 918548e71e..17faa70f17 100644 --- a/addons/fcs/XEH_clientInit.sqf +++ b/addons/fcs/XEH_clientInit.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" -GVAR(enabled) = True; +GVAR(enabled) = false; GVAR(time) = 0; GVAR(position) = [0,0,0]; diff --git a/addons/fcs/functions/fnc_keyDown.sqf b/addons/fcs/functions/fnc_keyDown.sqf index 5a3febf6ea..7699b82a20 100644 --- a/addons/fcs/functions/fnc_keyDown.sqf +++ b/addons/fcs/functions/fnc_keyDown.sqf @@ -19,7 +19,7 @@ _turret = _this select 1; _distance = call FUNC(getRange); -if !(call FUNC(canUseFCS)) exitWith {}; +if !(!GVAR(enabled) && FUNC(canUseFCS)) exitWith {}; GVAR(Enabled) = true; GVAR(Time) = time; diff --git a/addons/fcs/initKeybinds.sqf b/addons/fcs/initKeybinds.sqf index bc3cf33bf5..dd1a94b78e 100644 --- a/addons/fcs/initKeybinds.sqf +++ b/addons/fcs/initKeybinds.sqf @@ -7,7 +7,7 @@ _exceptions = []; if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; // Conditions: specific - if !(!GVAR(enabled) && {call FUNC(canUseRangefinder) || FUNC(canUseFCS)}) exitWith {false}; + if !((!GVAR(enabled) && FUNC(canUseFCS)) || FUNC(canUseRangefinder)) exitWith {false}; // prevent holding down if (GETGVAR(isDownStateKey1,false)) exitWith {false}; From 7545a6c3d88d8aa57b81fdc2a336a56dd6cbee5b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 11 Feb 2015 15:43:08 -0600 Subject: [PATCH 038/166] Code cleanup --- addons/magazinerepack/CfgSounds.hpp | 9 +++------ addons/magazinerepack/config.cpp | 12 +++++++++--- .../functions/fnc_magazineRepackProgress.sqf | 4 ++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/addons/magazinerepack/CfgSounds.hpp b/addons/magazinerepack/CfgSounds.hpp index 15104d905d..1390397e5e 100644 --- a/addons/magazinerepack/CfgSounds.hpp +++ b/addons/magazinerepack/CfgSounds.hpp @@ -1,13 +1,10 @@ -class CfgSounds -{ - class GVAR(soundMagazineFinished) - { +class CfgSounds { + class GVAR(soundMagazineFinished) { name = QGVAR(soundMagazineFinished); sound[]={QUOTE(PATHTOF(sounds\magrepack_finished.wav)),1,1}; titles[]={}; }; - class GVAR(soundRoundFinished) - { + class GVAR(soundRoundFinished) { name = QGVAR(soundRoundFinished); sound[] = {QUOTE(PATHTOF(sounds\magrepack_single.wav)),1,1}; titles[] = {}; diff --git a/addons/magazinerepack/config.cpp b/addons/magazinerepack/config.cpp index 3a95c10643..514a74350a 100644 --- a/addons/magazinerepack/config.cpp +++ b/addons/magazinerepack/config.cpp @@ -16,7 +16,13 @@ class CfgPatches { #include "CfgSounds.hpp" #include "CfgVehicles.hpp" -class ACE_Parameters_Numeric { - GVAR(TimePerAmmo) = 1.5; - GVAR(TimePerMagazine) = 2.0; +class ACE_Settings { + class GVAR(TimePerAmmo) { + value = 1.5; + typeName = "SCALAR"; + }; + class GVAR(TimePerMagazine) { + value = 2.0; + typeName = "SCALAR"; + }; }; diff --git a/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf b/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf index 1d3b5ec6cf..64ce05d12d 100644 --- a/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf +++ b/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf @@ -63,13 +63,13 @@ _updateMagazinesOnPlayerFnc = { }; if (_nextEventIsBullet) then { - playSound QGVAR(soundMagazineFinished); + playSound QGVAR(soundRoundFinished); if ((((count _simEvents) % 3) == 0) || {(count _simEvents) == 1}) then { //For performance - only update mags every 3 bullets (or if it's the last event) call _updateMagazinesOnPlayerFnc; }; } else { - playSound QGVAR(soundRoundFinished); + playSound QGVAR(soundMagazineFinished); call _updateMagazinesOnPlayerFnc; }; From 67b3442d17dda3bfbff7d27c2c9a9496228a746c Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 11 Feb 2015 23:49:41 +0100 Subject: [PATCH 039/166] getting the fcs to work in MP --- addons/fcs/CfgEventHandlers.hpp | 38 ++++++++++++++++++++++++---- addons/fcs/functions/fnc_firedEH.sqf | 2 +- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/addons/fcs/CfgEventHandlers.hpp b/addons/fcs/CfgEventHandlers.hpp index 409267a8c8..961a05b27d 100644 --- a/addons/fcs/CfgEventHandlers.hpp +++ b/addons/fcs/CfgEventHandlers.hpp @@ -13,27 +13,55 @@ class Extended_PostInit_EventHandlers { class Extended_Init_EventHandlers { class Tank { class ADDON { - clientInit = QUOTE(_this call FUNC(vehicleInit)); + serverInit = QUOTE(_this call FUNC(vehicleInit)); }; }; class Car { class ADDON { - clientInit = QUOTE(_this call FUNC(vehicleInit)); + serverInit = QUOTE(_this call FUNC(vehicleInit)); }; }; class Helicopter { class ADDON { - clientInit = QUOTE(_this call FUNC(vehicleInit)); + serverInit = QUOTE(_this call FUNC(vehicleInit)); }; }; class Plane { class ADDON { - clientInit = QUOTE(_this call FUNC(vehicleInit)); + serverInit = QUOTE(_this call FUNC(vehicleInit)); }; }; class Ship_F { class ADDON { - clientInit = QUOTE(_this call FUNC(vehicleInit)); + serverInit = QUOTE(_this call FUNC(vehicleInit)); + }; + }; +}; + +class Extended_Respawn_EventHandlers { + class Tank { + class ADDON { + respawn = QUOTE(_this call FUNC(vehicleInit)); + }; + }; + class Car { + class ADDON { + respawn = QUOTE(_this call FUNC(vehicleInit)); + }; + }; + class Helicopter { + class ADDON { + respawn = QUOTE(_this call FUNC(vehicleInit)); + }; + }; + class Plane { + class ADDON { + respawn = QUOTE(_this call FUNC(vehicleInit)); + }; + }; + class Ship_F { + class ADDON { + respawn = QUOTE(_this call FUNC(vehicleInit)); }; }; }; diff --git a/addons/fcs/functions/fnc_firedEH.sqf b/addons/fcs/functions/fnc_firedEH.sqf index a0b10795cf..22371a26f4 100644 --- a/addons/fcs/functions/fnc_firedEH.sqf +++ b/addons/fcs/functions/fnc_firedEH.sqf @@ -25,7 +25,7 @@ private ["_gunner", "_turret"]; _gunner = [_vehicle, _weapon] call EFUNC(common,getGunner); _turret = [_gunner] call EFUNC(common,getTurretIndex); -if (ACE_player != _gunner) exitWith {}; +//if (ACE_player != _gunner) exitWith {}; // global private ["_FCSMagazines", "_FCSElevation", "_offset"]; From ff0348a169a096a73a90d9ac52dbd9fed400dff4 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 12 Feb 2015 13:23:38 +0100 Subject: [PATCH 040/166] add common_fnc_setVariablePublic --- addons/common/XEH_preInit.sqf | 1 + .../functions/fnc_setVariablePublic.sqf | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 addons/common/functions/fnc_setVariablePublic.sqf diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 94a0a490bf..faf0362779 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -119,6 +119,7 @@ PREP(setName); PREP(setParameter); PREP(setPitchBankYaw); PREP(setVariableJIP); +PREP(setVariablePublic); PREP(setSetting); PREP(setSettingFromConfig); PREP(stringToColoredText); diff --git a/addons/common/functions/fnc_setVariablePublic.sqf b/addons/common/functions/fnc_setVariablePublic.sqf new file mode 100644 index 0000000000..cbdf0dc31d --- /dev/null +++ b/addons/common/functions/fnc_setVariablePublic.sqf @@ -0,0 +1,53 @@ +/* + * Author: commy2 + * + * Sets a public variable, but wait a certain amount of time to transfer the value over the network. Changing the value by calling this function again resets the windup timer. + * + * Argument: + * 0: Object the variable should be assigned to (Object) + * 1: Name of the variable (String) + * 2: Value of the variable (Any) + * 3: Windup time (Number, optional. Default: 1) + * + * Return value: + * Nothing. + */ +#include "script_component.hpp" + +private ["_object", "_varName", "_value", "_sync"]; + +_object = _this select 0; +_varName = _this select 1; +_value = _this select 2; +_sync = _this select 3; + +if (isNil "_sync") then { + _sync = 1; +}; + +// set value locally +_object setVariable [_varName, _value]; + +// "duh" +if (!isMultiplayer) exitWith {}; + +// generate stacked eventhandler id +private "_idName"; +_idName = format ["ACE_setVariablePublic_%1", _varName]; + +// when to push the value +private "_syncTime"; +_syncTime = diag_tickTime + _sync; + +// add eventhandler. should the value change, then overwrite the previous eventhandler +[_idName, "onEachFrame", { + // wait to sync the variable + if (diag_tickTime > _this select 3) then { + // set value public + (_this select 0) setVariable [_this select 1, _this select 2, true]; + + // remove eventhandler + [_this select 4, "onEachFrame"] call BIS_fnc_removeStackedEventHandler + }; +}, [_object, _varName, _value, _syncTime, _idName]] call BIS_fnc_addStackedEventHandler; +nil From b32849a68e5b05106a1a81da30bcb90b34b36840 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 12 Feb 2015 14:18:34 +0100 Subject: [PATCH 041/166] no left hand - weapon IK when swag walking (combat pace) --- addons/movement/CfgMoves.hpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/addons/movement/CfgMoves.hpp b/addons/movement/CfgMoves.hpp index 9d32d4e856..677ad3dc94 100644 --- a/addons/movement/CfgMoves.hpp +++ b/addons/movement/CfgMoves.hpp @@ -77,6 +77,15 @@ class CfgMovesMaleSdr: CfgMovesBasic { class AmovPercMwlkSlowWrflDr: AmovPercMwlkSlowWrflDf { leftHandIKCurve[] = {}; }; + class AmovPercMwlkSlowWrflDf_v1: AmovPercMwlkSlowWrflDf { + leftHandIKCurve[] = {}; + }; + class AidlPercMwlkSrasWrflDf: AmovPercMwlkSlowWrflDf { + leftHandIKCurve[] = {}; + }; + class AmovPercMtacSlowWrflDf: AmovPercMwlkSlowWrflDf { + leftHandIKCurve[] = {}; + }; // enable optics in prone left and right stance class AidlPpneMstpSrasWrflDnon_G0S; From a4815cb8acf3365e9b02dbea18db99df97fc2785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 12 Feb 2015 11:51:17 -0300 Subject: [PATCH 042/166] scopes: reduce control numbers --- addons/scopes/RscTitles.hpp | 6 +++--- addons/scopes/functions/fnc_showZeroing.sqf | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/scopes/RscTitles.hpp b/addons/scopes/RscTitles.hpp index 9da0a04a14..a9c43aedaf 100644 --- a/addons/scopes/RscTitles.hpp +++ b/addons/scopes/RscTitles.hpp @@ -13,7 +13,7 @@ class RscTitles { class RscText; class controls { class ACE_Scopes_Zeroing_BG : RscPicture { - idc = 925001; + idc = 11; type = 0; text = PATHTOF(UI\scopes_bg.paa); style = 48 + 0x800; @@ -30,7 +30,7 @@ class RscTitles { h = 0.3 * safezoneH; }; class ACE_Scopes_Zeroing_Vertical : RscText { - idc = 925002; + idc = 12; type = 0; style = 2; sizeEx = 0.04; @@ -47,7 +47,7 @@ class RscTitles { h = 0.025 * safezoneH; }; class ACE_Scopes_Zeroing_Horizontal : RscText { - idc = 925003; + idc = 13; type = 0; style = 0; sizeEx = 0.04; diff --git a/addons/scopes/functions/fnc_showZeroing.sqf b/addons/scopes/functions/fnc_showZeroing.sqf index 3d729e81db..f00ca5fedb 100644 --- a/addons/scopes/functions/fnc_showZeroing.sqf +++ b/addons/scopes/functions/fnc_showZeroing.sqf @@ -34,8 +34,8 @@ if (isNull _display) exitWith {}; // Update values _zeroing = _adjustment select _weaponIndex; -_vertical = _display displayCtrl 925002; -_horizontal = _display displayCtrl 925003; +_vertical = _display displayCtrl 12; +_horizontal = _display displayCtrl 13; _vertical ctrlSetText (str (_zeroing select 1)); _horizontal ctrlSetText (str (_zeroing select 0)); From 7c8840df565964291bbcc70937e6f4b2c2fce7c0 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 12 Feb 2015 15:56:57 +0100 Subject: [PATCH 043/166] transfer value even if it changed --- .../common/functions/fnc_setVariablePublic.sqf | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/addons/common/functions/fnc_setVariablePublic.sqf b/addons/common/functions/fnc_setVariablePublic.sqf index cbdf0dc31d..81093a2679 100644 --- a/addons/common/functions/fnc_setVariablePublic.sqf +++ b/addons/common/functions/fnc_setVariablePublic.sqf @@ -35,19 +35,25 @@ if (!isMultiplayer) exitWith {}; private "_idName"; _idName = format ["ACE_setVariablePublic_%1", _varName]; +// exit now if an eh for that variable already exists +private "_allIdNames"; +_allIdNames = [GETMVAR(BIS_stackedEventHandlers_onEachFrame,[]), {_this select 0}] call FUNC(map); + +if (_idName in _allIdNames) exitWith {}; + // when to push the value private "_syncTime"; _syncTime = diag_tickTime + _sync; -// add eventhandler. should the value change, then overwrite the previous eventhandler +// add eventhandler [_idName, "onEachFrame", { // wait to sync the variable - if (diag_tickTime > _this select 3) then { + if (diag_tickTime > _this select 2) then { // set value public - (_this select 0) setVariable [_this select 1, _this select 2, true]; + (_this select 0) setVariable [_this select 1, (_this select 0) getVariable (_this select 1), true]; // remove eventhandler - [_this select 4, "onEachFrame"] call BIS_fnc_removeStackedEventHandler + [_this select 3, "onEachFrame"] call BIS_fnc_removeStackedEventHandler }; -}, [_object, _varName, _value, _syncTime, _idName]] call BIS_fnc_addStackedEventHandler; +}, [_object, _varName, _syncTime, _idName]] call BIS_fnc_addStackedEventHandler; nil From a3dc1df109928918cbaa96f8bf60b5773a248859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 12 Feb 2015 11:57:55 -0300 Subject: [PATCH 044/166] scopes: moved getWeaponIndex to common --- addons/common/XEH_preInit.sqf | 1 + addons/{scopes => common}/functions/fnc_getWeaponIndex.sqf | 2 ++ addons/scopes/XEH_preInit.sqf | 1 - addons/scopes/functions/fnc_adjustScope.sqf | 2 +- addons/scopes/functions/fnc_canAdjustScope.sqf | 2 +- addons/scopes/functions/fnc_firedEH.sqf | 2 +- addons/scopes/functions/fnc_showZeroing.sqf | 2 +- 7 files changed, 7 insertions(+), 5 deletions(-) rename addons/{scopes => common}/functions/fnc_getWeaponIndex.sqf (92%) diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 9b8964df1b..a186d2ddbe 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -75,6 +75,7 @@ PREP(getVehicleCargo); PREP(getVehicleCodriver); PREP(getVehicleCrew); PREP(getWeaponAzimuthAndInclination); +PREP(getWeaponIndex); PREP(getWeaponType); PREP(getWindDirection); PREP(goKneeling); diff --git a/addons/scopes/functions/fnc_getWeaponIndex.sqf b/addons/common/functions/fnc_getWeaponIndex.sqf similarity index 92% rename from addons/scopes/functions/fnc_getWeaponIndex.sqf rename to addons/common/functions/fnc_getWeaponIndex.sqf index 05c1202795..6cac6d244e 100644 --- a/addons/scopes/functions/fnc_getWeaponIndex.sqf +++ b/addons/common/functions/fnc_getWeaponIndex.sqf @@ -16,6 +16,8 @@ EXPLODE_2_PVT(_this,_unit,_weapon); +if (_weapon = "") exitWith {-1}; + [ primaryWeapon _unit, secondaryWeapon _unit, diff --git a/addons/scopes/XEH_preInit.sqf b/addons/scopes/XEH_preInit.sqf index 5dd7153263..e574cc72d4 100644 --- a/addons/scopes/XEH_preInit.sqf +++ b/addons/scopes/XEH_preInit.sqf @@ -6,7 +6,6 @@ PREP(adjustScope); PREP(canAdjustScope); PREP(firedEH); PREP(getOptics); -PREP(getWeaponIndex); PREP(inventoryCheck); PREP(showZeroing); diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index cf4d7e7146..031ff3a820 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -18,7 +18,7 @@ private ["_unit", "_weapons", "_zeroing", "_pitchbankyaw", "_pitch", "_bank", "_ _unit = _this select 0; -_weaponIndex = [_unit, currentWeapon _unit] call FUNC(getWeaponIndex); +_weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); _adjustment = _unit getVariable QGVAR(Adjustment); if (isNil "_adjustment") then { diff --git a/addons/scopes/functions/fnc_canAdjustScope.sqf b/addons/scopes/functions/fnc_canAdjustScope.sqf index 75d5dd73a7..eda08dc0ee 100644 --- a/addons/scopes/functions/fnc_canAdjustScope.sqf +++ b/addons/scopes/functions/fnc_canAdjustScope.sqf @@ -18,7 +18,7 @@ private ["_unit", "_weaponIndex", "_zeroing", "_optic", "_maxHorizontal", "_maxV _unit = _this select 0; -_weaponIndex = [_unit, currentWeapon _unit] call FUNC(getWeaponIndex); +_weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {false}; _adjustment = _unit getVariable QGVAR(Adjustment); diff --git a/addons/scopes/functions/fnc_firedEH.sqf b/addons/scopes/functions/fnc_firedEH.sqf index b6da3c7a9e..371d1e5f33 100644 --- a/addons/scopes/functions/fnc_firedEH.sqf +++ b/addons/scopes/functions/fnc_firedEH.sqf @@ -31,7 +31,7 @@ if !([_unit] call EFUNC(common,isPlayer)) exitWith {}; _weapon = _this select 1; _projectile = _this select 5; -_weaponIndex = [_unit, currentWeapon _unit] call FUNC(getWeaponIndex); +_weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {}; _zeroing = _adjustment select _weaponIndex; diff --git a/addons/scopes/functions/fnc_showZeroing.sqf b/addons/scopes/functions/fnc_showZeroing.sqf index f00ca5fedb..836f69b2df 100644 --- a/addons/scopes/functions/fnc_showZeroing.sqf +++ b/addons/scopes/functions/fnc_showZeroing.sqf @@ -16,7 +16,7 @@ disableSerialization; private ["_weaponIndex","_adjustment","_layer","_display","_zeroing","_vertical","_horizontal"]; -_weaponIndex = [ACE_player, currentWeapon ACE_player] call FUNC(getWeaponIndex); +_weaponIndex = [ACE_player, currentWeapon ACE_player] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {}; _adjustment = ACE_player getVariable QGVAR(Adjustment); From 4a70d16f95aed2c3d67a2748fd4ffa3aac9453c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 12 Feb 2015 12:21:46 -0300 Subject: [PATCH 045/166] scopes: switch throttledPublicVariable by setVariablePublic --- addons/scopes/functions/fnc_adjustScope.sqf | 2 +- addons/scopes/functions/fnc_inventoryCheck.sqf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index 031ff3a820..6e71a391aa 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -32,7 +32,7 @@ _zeroing set [1, (round (((_zeroing select 1) + (_this select 2)) * 10)) / 10]; // Change the adjustment array _adjustment set [_weaponIndex, _zeroing]; -[_unit, QGVAR(Adjustment), 0.5] call EFUNC(common,throttledPublicVariable); +[_unit, QGVAR(Adjustment), _adjustment, 0.5] call EFUNC(common,setVariablePublic); playSound (["ACE_Scopes_Click_1", "ACE_Scopes_Click_2", "ACE_Scopes_Click_3"] select floor random 3); diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index dba446912d..c83112c8a6 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -20,7 +20,7 @@ _adjustment = ACE_player getVariable QGVAR(Adjustment); if (isNil "_adjustment") then { _adjustment = [[0,0], [0,0], [0,0]]; ACE_player setVariable [QGVAR(Adjustment), _adjustment]; - [ACE_player, QGVAR(Adjustment), 0.5] call EFUNC(common,throttledPublicVariable); + [ACE_player, QGVAR(Adjustment), _adjustment, 0.5] call EFUNC(common,setVariablePublic); }; if (isNil QGVAR(Optics)) then { @@ -33,7 +33,7 @@ _newOptics = [_player] call FUNC(getOptics); // The optic for this weapon changed, set adjustment to zero if !((_adjustment select _foreachindex) isEqualTo [0,0]) then { _adjustment set [_forEachIndex, [0,0]]; - [ACE_player, QGVAR(Adjustment), 0.5] call EFUNC(common,throttledPublicVariable); + [ACE_player, QGVAR(Adjustment), _adjustment, 0.5] call EFUNC(common,setVariablePublic); }; }; } forEach GVAR(Optics); From d0b0a0e066d00bda367db0e2193ddfa7010c6d39 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 12 Feb 2015 20:43:50 -0600 Subject: [PATCH 046/166] Missing = --- addons/common/functions/fnc_getWeaponIndex.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/functions/fnc_getWeaponIndex.sqf b/addons/common/functions/fnc_getWeaponIndex.sqf index 6cac6d244e..f2b8bce9f2 100644 --- a/addons/common/functions/fnc_getWeaponIndex.sqf +++ b/addons/common/functions/fnc_getWeaponIndex.sqf @@ -16,7 +16,7 @@ EXPLODE_2_PVT(_this,_unit,_weapon); -if (_weapon = "") exitWith {-1}; +if (_weapon == "") exitWith {-1}; [ primaryWeapon _unit, From 19f31541042fa8b3dcdcaeba5468e241cfdfcf3a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 12 Feb 2015 21:53:15 -0600 Subject: [PATCH 047/166] CSE Soundwaves --- addons/nametags/UI/soundwave0.paa | Bin 0 -> 25425 bytes addons/nametags/UI/soundwave1.paa | Bin 0 -> 26293 bytes addons/nametags/UI/soundwave2.paa | Bin 0 -> 26529 bytes addons/nametags/UI/soundwave3.paa | Bin 0 -> 26253 bytes addons/nametags/UI/soundwave4.paa | Bin 0 -> 26802 bytes addons/nametags/UI/soundwave5.paa | Bin 0 -> 26662 bytes addons/nametags/UI/soundwave6.paa | Bin 0 -> 26473 bytes addons/nametags/UI/soundwave7.paa | Bin 0 -> 26996 bytes addons/nametags/UI/soundwave8.paa | Bin 0 -> 27615 bytes addons/nametags/UI/soundwave9.paa | Bin 0 -> 27049 bytes addons/nametags/XEH_postInit.sqf | 2 + addons/nametags/config.cpp | 7 +- .../functions/fnc_drawNameTagIcon.sqf | 20 ++++- .../nametags/functions/fnc_initIsSpeaking.sqf | 77 ++++++++++++++++++ addons/nametags/stringtable.xml | 9 +- 15 files changed, 108 insertions(+), 7 deletions(-) create mode 100644 addons/nametags/UI/soundwave0.paa create mode 100644 addons/nametags/UI/soundwave1.paa create mode 100644 addons/nametags/UI/soundwave2.paa create mode 100644 addons/nametags/UI/soundwave3.paa create mode 100644 addons/nametags/UI/soundwave4.paa create mode 100644 addons/nametags/UI/soundwave5.paa create mode 100644 addons/nametags/UI/soundwave6.paa create mode 100644 addons/nametags/UI/soundwave7.paa create mode 100644 addons/nametags/UI/soundwave8.paa create mode 100644 addons/nametags/UI/soundwave9.paa create mode 100644 addons/nametags/functions/fnc_initIsSpeaking.sqf diff --git a/addons/nametags/UI/soundwave0.paa b/addons/nametags/UI/soundwave0.paa new file mode 100644 index 0000000000000000000000000000000000000000..27f34b38abc77d69ae2b9f0ed0793e00ec7f78fb GIT binary patch literal 25425 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 literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave1.paa b/addons/nametags/UI/soundwave1.paa new file mode 100644 index 0000000000000000000000000000000000000000..ce4f85eb6941214cc6a169b42fc9afa0f15b76ef GIT binary patch literal 26293 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 literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave2.paa b/addons/nametags/UI/soundwave2.paa new file mode 100644 index 0000000000000000000000000000000000000000..0bc59cde24940b831d94bd6d4f9fb9f0af3fea27 GIT binary patch literal 26529 zcmeHP4SW>knSWTWWj_;n|jK)E}V#BAx=dfxS1(QfUzNk&nzKQN?fy(o8VPAzyp?Il9b!1+$*o_99y z?wV5rEhy;BZy@uZ_w)IFGV@Flw3RDYe5-urw^x`ELWGbjbi8)ObrfrGP`q-*stSrZ z_($=L6&2MIT+8rpcm_hYnFu*Tn}KE`Jkj?!iobjg zwvdL_tYNKhiKw1u;J6s;YFz64JAW)$BccQks@j!Zwact>^1~dD@a1q%l7o#$gWYB( z1VLP2*6yjla&z64ef(Fr!>Wm;z`il_{MSm{xZ0Z-8S8SRzA;WhxX{Z*?jRJ$nl>WX`f6qD1ja21 zad<5eZk~sd@YSl|%l2-{6%*E{;^jo}&5-e%L}(SVmXwsvK)l#D1105^B3W{{(Xla< zBO^RV-4d}lvzm#sN*}D;k2A!F96-zt{usx#;F)gTH)6)+#Dvju&D}R<#fM?tUB0|R z;4d9p)3yvJ!Q{CV)p)1zn#5VDd>x_7I8?bU8!k_X{|-I(YPEf1R3yI-i8@^`Q_)++ zlREe>A|xCM2RD`kHBS^lu;zFG+{ZJ9MNE6v|@Zt z_lVQ`4X$qtrReiK0@B9?symET;^s7z+}Qwo=`~3>&6`Yn*hI8Y>n^Gr!8X#JTZ%>n zyp;%Tvk*TF>zaD(RikYfy*n=SA4z|<{J6F3*>WZQKzWCH6h@b8Lf@E#(Q7U&;XH3f z4ZCwP=b|iTE1DQvk$UKVwLKDK8 z1WE!FeGT|1gscUwhb56%@p9TELqk3h7OKyiaa$h`IL|eszf_z7_pc`I?#4pvMw8S% zV#TY7kWaV`9L^=eYEXlVuohYhv^d6GSxvB{t z=FyV72WM^pVZB1TqqQUqn;<=W(WWIu_1FPIN_mwd2a~s0JLQ%53}}PzJ1N-NR)!Gt ze@qqnuHfd>0Lg2>;=4Hx|B?vvxVhB+=Svwd<32j?8(`q76}!Oz5k2lEJ#Zn3C>=?B z-BIwP4srV2@yV$*R`FFip{2G~Ur+Yp&~%&%-d2*INX;c*$EdeeKzO-` z^7}!vlmZoP!+z1sWBJ3T5u6+P@p_K`K&V0p-%f<;SJH+-arlMm-4eF+nsADVA8V`f z9K|2N&VECB%>73OM#%AIYZ)3g^{Yoad_#B)nh-)=BI3guTxDzne}6N2KLc*U@c_d3 z+Fk)&6{^SUh>+FimgIaf3+s)*93o_-N{{1plp-ymAq(^hf|M$~8MBoQSRV;V zP=soVj_WF=-}i!7@@Nnl@3EGnUvm%)+lxc5SvlpEOeNX6`MFp6!|7$>v1Xj72?Z@Y z<+-n<(t1t#O&ys-7^e7z?i9ZhdI8rE4qq>d*b|-on20jcln-e)dK~%09mK_iv%35) zu-VfO?iDzlLl%^wPEbwV!Dy%4+7F{qe}N`=8 z_E}5?RlF@OKL(}1k?!ai0zZRLJL0aM2Kn`~2w#V^NHBO)MBnAsjB>Q=zlq4fQ@By$8voQgb^bkNGgHQ;CEy zyU1}KJuS5N($taTH6@xi-X#j0M^BfQk+eMUH_AjR0aVfBII&>*^99us-oVLl?F^;1 zRv|tYLe}C|$Zyu7X>z3!+>!mik85@fDX6ov(N3;21-q3ta*%KdkA{Pd^S~O4LI}LD zlw#pChakIy7Eeo2(-?#noTOPs0vo`eRGTwA_(6!m_EyMmoV}~1Gz&SH6QZ7DZ+~W3 z<0MoXLcHeDbDtttDqPbXk8pfAk{{zllEx!R&wcGK)Phr0VFW{n#uj~=6@6)2m4&Xm z7CJ(Uo#I`vCC|g$w(O<7f_1S^;4u$QqKa5H%u?_?V#(^wlJQLdFQ4w}T_jKBV&>ig zKTdU}fY+Um7r+2?Cj|FU5$y5=v6#2Cyf{JzMv7I-+eqX5Xu2Oa5X<_V+%QTT#)+XH za#(5i<%X`o_m|E%HilpAo4FO{6IUg8wBU6^J2T(FcIcnXH+FuzZV}}Ew$`h<&5M+4 z@js|Siwo!x35c!XbQm~R(7W1gJ6WxUvBNtDB8(Y3`^?3X(_5S$dJ?F!E`v;Ip=+I~ zM779xpUcvjRa#oPD_2cJ)4z36bCAbsP08et%K5Rymni3nDX?}{Ye`ZPwnA8Nxl;T% zPjup*af{X zB39ciYmq0n&#Y-Vy-PDvG@cyHrg@JY2-!)hBfLnmn8=ajlzTBMBh}dCt5LAj$2t7A zQ_VCCh>K_#C<3#@GK8=W*AQhKmTgPC1I=4N#0d^RjSdTw@rm);x`vydIn%L>G@H>N z#AodTh}Lab0M4X8JNsykZ-H`a2_!s4E>xI$t)B0^0h~EPI&5w?LS}6BP6t$guO}TC z)0ifcH28%BE$ZFw&k?uSXb|y*fjYsiQVk!O~Ko0+HP323x6mUuRjX2P^#w{71 ztkPAMT}5h*G;_?-mZFSv#h@&GH(E8@{sTMn?0q-Zx1^6*ZfklQCyrYVkEDNSc_P&+ z@zzQuJvghf&f($|r+RZ|YbH%hens*i^A!;!Y5FmaYVgG6Z|Pz-t-7e;C{8T>S)pQ6 zs{@YEt$d~OdUJNJdaL5}eZMo!M8oeP;$_1wL|}xpZ8cg0=^t$E6`H8RBOV#jGJugo z(-4H4#~6giGY0-@@q?7^^y7zYe{Fzg|w z4Mu!0?7^@H!yaNBFzn$Hu?I|L=BF?E_1}l*WBTAbbBJLkQ3GEh@|+MDlh;GT6>q7> zMpTA9!^z};n;c+RD}<-|a59XB;VC|xQ9NlrLmwg>xMcVffY(rPM)&K1`W!eJHspVC z%d;#1{o8jCRz!mSsaxyrN&PVvhh>NzlpBj zu$Oj^JTIm5&u!tO7$7|i{K@g*`iW9R#-B)OA|K^fhTgsn;%}JpSEjtAho&7H<9WCU zz?)(?*?7%EYteYjFlw1(-+pG_bUqoOrzf>8bTd;Y=pe|GZMiYM9k*vIYr ziKkBY#Oucv`Ch#`n(c2mQXLbe7x13#RrhUY?UU(6BW6i5mjNFpS}?q$rvMI0F9v1F zhRRxoBixGdGls*O{jJ6L>^6wW+{!qLDte8sv+EbJ0l|QZ@jH_(_R{7pri{WH= za(m~k^uRk`uf^fd~OPW@b7K}e+6ab z5KzB3`9mc&LetMa{!egz3jcr6$=_dSIThf6-;w>-(-Ivh-DNl?FQ!?MJLkV0^a1G_ zp)bJZ$HQkV2tokE(`tUYq&T=~FTBod3^1-Toc^{rT_h&tJ&KZyTh_ z{$wh{7drk=CI9_TfipbQLARrOw(skuRKBP`goxIY4Ro@0u>XbhGY5v5lo$s8Uxv*U z(f;tgil#xxWbG*!z5ocs_)B?657r(*mky5Qf4V;5$^3}rf6$H@b#e4vF#jLfNntU_ z7g9jR-{CRvcYhy~@44oGR+$!IZ;aXp&3NMFJG1l4C0`~n#=psU8|44+DOxn2@l)pz zhaISreySF2pFIA8+y4~L|IStZ|8M^jH$II&M*j#0K8-(3f!msX92akpUwg0~hOqt> z{$tJAaqac~wk{3w+pCSg3taL&G7T9hc7m>H1-pxj>cmah?`$Ve&mh9 zJF{>41(p_AMuVw}_i(ffo6*eLFExAzEfWv^E`jaeuHzloFkHCy%ueCV&RT}|jBb74 zAe;<$4ASwv3d0v0{j(c_ja%SNN_2l1iZ!4zj+TvK*lb{E;6LZX$=Zu+PXE9SC&S`; zoqmDg3Hrkf2Zok+9e|TzaZ=g%Xr#h9$u0w1->Av6!KJGJ>O89JH zq5EXCOv?JStR8UxK8n#GaAfA$f3~y?UaOY_3)p(sjQ(ZXi4QkNv19Q0YVurjv@GNL zhQmk5;n-(18n(?Yv+e#fHa)2{&i@$#4M1LE)Z%wzKd{U?F`sD4Ji_`kme|0l5a$^P$-z>F>N{m=LQzUcYp zb&^NSar`OYb0&2l4u8@6GuDrAfa#~fk1s1fRzCogMSlg>w66xH=^8RKt%kI1=_64d zz}?RuUmCyWEczz+=-`eAm|NI-IQVkHdL^3X>tCau!(R)KC#AJnG-tVN-w2!EI&ja= z4t%sfiiftWn7bQJ*4{b*i^r{x-k;maJ-FM)+SBg~ZWyZdwle%z`g*aiiT-9%HLk&@D8V(bO|Ymtb2_e@pYJE4(mJX27H zooioeh))X+qbnY5fBT_mTDo90lxoH8fAaW?7vC`edyAT&rhPuxN*@Jsj4NRF|N44# z4{-Oa@!#oFT*bsRe_ycCbZe}L+xC;a-AYy0cGjNtk07H!=5q|AE~|;oz_4v!)z|Dr zv5#El|D^<&(v{{sc@DB|+294ky8PEfRd(0^2?sYzH!YBXo|MM*u(B v4Yh$0oV+h%A_@16(B0nf$Xqe9jR-b_M+JUfwmFzO%|mzJHwM#8Jiqxry8+qD literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave3.paa b/addons/nametags/UI/soundwave3.paa new file mode 100644 index 0000000000000000000000000000000000000000..39f3e8e95bd9e86515becd853e69cfe57ee29b2f GIT binary patch literal 26253 zcmeHQ4RjONmA*3?V~fa=Fd;FuLD#lY$wvMOB!<)@X)rCwn;*!Q{B`44!6YFIwplo# z&`M~a+h%u9sTJC^oLvlFcGG3q{)qf&lSa0cgcSC4OWgD{h4luxVT-dTdyX8EjiEd8 z?0u4-WN1m!Hf>5Xb7VB%yf^RNpYOhRC0&UkeZ`8UtCy{~eW?Thnx@&Z_|By_Gpy6W z@QS53EoWGuKZZZOeECX+&Q;&=9Oeh1K z>U##JpFU3_SmCzYco%mj~VbLd|>=CO-*`D_lY&p1@m3N2}K4;86x;sQ-V zs|+So&Du+PfGn^sVZwtx=u3M-pArTqz>>S~lcphU)td3S)rGSoz# zZeEji%Z)3c?W~UTd@%07ZHa}OKpdr8O#5AJ;}IO2bf98cCRD^bTWSZSXtW4jx!7xA zK2Q*T5?P{H|BHsMjg*sObh2%ztSu_hiF?4LVCkSKs8O+DZXfBs7s1OiZ0!tDmN!j@Q9_{;SgnuJjt_+#+B^nA~sSHJm8rZF$->;*~ zw<|bQwRy>566P;-M@m;(L07RpV;y2+|8UX){rIZpM~7x<4F9bnlbAtYWlBKLU{SOm z?-(+rs6Rl1=BUXWkxp2TUol08^Z0n{;Nl)s)UVv>l>jt{dm7d;=n>}zu4TlsCg~AL*?YPh<4OW_rN+5#Z2rC-(f*dq!oa~K9orf zeoUCNiWZaGkX&9N%tadFai-Eq8TvAI^d|&-Y0{ynRl5ItuhXrW9)c*A`+zu*@gK(j zCTTbJA5Uw?d+1K^Xc2l+WSAu=Yvw+8`-oef`RNf_I`C>Q1WTXTT}MIC!^lO?!E6NU(%=R3GFHo#rlHjNUi}=cU|njoYGHk>)c#0v8IAo3%~3Vv?}rjk#xFH^ z6&3pvCOfPn(lvx#ia+GC!x;1n`b}b6ZOB|TxNX0)E&*uufui1{$GdPVo1RhS+uI$0 zH^|U1M6r@=%)n0Umn9L^ce>M9m-vSc;Y~*yem*oNfOQlWPKtf$JwHY3fC()oVItBN zq_DT!9~4JBD~Od>HIhn`%;8Fwhv4x;N=Muvi}vI2KjmZ{Iw}G2#sQjlLt<_9pr6Fw zCRby&37*m%x&rJm-RQhQA+NbAT z>kKOQ8D4P5vkw{V911J^d`}o$O>=WSFb`dBcDrdBOm8 zN$tbgzMUnEjL&LQOW_&KS-aIqSF*<$nQ>$46!NEDfO1>X%<;?20J-B#;zjg_t0*D> zY>BBc0WROI*ASh1mY6;y!jEV}q5@H;-VfKyKwD_>#(~*Mte6x|O<;S-(|+|#Z)pnNm!zI1|+3^P_nZV-CCSYV2Trx2xuFp1j92Zbk)$@ zjhe8JB`4R1Z!ooFY$_h`+M?Ur1H0=oRxqzV>+(V%Vlrz#$O!#t3m2=NP;qFzu#7fB z=k}J85})iXDi6j>M=0-b`-N=kxS0CNzAN;UEL(V{<_djGSk>J9#@;!2RmOqd0a5qM z^KK~=AbuJjJMDTX)FyFZ)~8Q z@R(-PXl=DJp}Ye{icDKeh;of2LWO3d+)kx4=+kW1$sj7p<2_Jvom-!&?{~Tqb_vAt zpuViEE(ER&3|4#h#&DI^DCt`|7c{S_!4j>}wDEBLNURjAwZ^`A-$F=E+LTnYY)J^B zU2k)m7m;)a!n8}x*6dZ^xf_CYgOaY-4qR7m(M9d3lQIipix^FA>8`2E6eT@mV?P9f zhefv2enwxprF)|4SS#MCt(26cO;be3xuFEB9$y{n!dh)*^*5KF@4Z1=*|BU$djX+U zTZyLdsw66dg1f)!t)6&iMXh|zL!WatXZN?>%!ytv?Qfr@S18%MV*_KhyI+6Huh*ED z_|^y3)Olwqn~RClZr^(Ih6RaPpU*bDXA;(i#9!8gTgf}# zYn0GLO=6RKpfy>asHyh>B&*I272EN_?Ew%LBq|#cHDZa<797DkudLi1`2@waF6`(U z!6#)OLRrKPlqJB3R?Johc6_LNCav_h!fhlH3Gy;!cI@p8m6AMyxkJ~1c7j73(pwP* z{%F~QdAxA2cf$%O_wJa13l=c!WALNE1|vR~hzBDc z3KlTp!H90vG=1@ZWCQUH6e-|UD`evr3$zi zqZ*GVJFAE*(~joG%MVANcNlytSo6~Ma&~J)2juM{& z2iWb|&r7y5yd!*)kVV`4h8 zwnzhPpvnx6EkRZt@xL7$M-S2m#;>F=>3@5FU?){=u`pr~tHE!Z~G+Q%UmR}#N zS^fHwyj@qReuN$zLzF5e=)p0j)2-B7{~fBE6NcI_DPfTr}W32RF$Rykz z&=1O{>GALZ`+I6Q@>fcS5<>k{dVQmq_g{C6od3lxTCb>5oc8D6!2hK06@SO|x!7J! z3ORpsLElUJpK7E5W`1z~&q?wJ=l}jD+gmX)zdx*HH8WI(!tGb^7q?{Y$_L+0e1I$? zvJ>#}arC?mXba$Y#;Si>v?ShH@NYlso?Ft`+1BLY*&~Nb^ZiFzBUSzI``!Jq?l0FytIGl^+#t*{N6m@0Wb7#S@e(9zxve9pY!ksW&ca_#h8!VhCLhhHuzxhpu)$a#jd(EP!H9=~1&nww;-SC>V}CH>!H5SV9tsvP;=zcA0vn9|!H5SV9*lS> zSm5%D2PXR=`igk&$g$bLf9&>9*lz&PZxu`(%xm9+o6gSIkbJ-Xd2&2kR(g#0m$PM=yCsgtb3bjGFRSEJ^7daB zSH)<)=C%1UyV?`+t{(a=FFu|-w!B(ou`K;d3)vS_n3X7CLhNY(XWsC zCr|r1R#yMtj~wS8ad6x{9Qao17vD~CT%yJYuA0`KJht`AN9n=a&0m9e9*Dg20LOu? zeyzrTHeV)Xe_GAF;D0-hVVEpXRwzq-FMBMGZRuV%t<33@;}2QK-nlvQm4# zP*!to=-*$O{A5eMz4CQZ{>gs{!i&Z1;EN`QcgSU;O*@(?T0CC*Ab2b z(afu6tF;7N|>9ijGX>|f&8HcCH*JNMBr$Fu$_-hQGZw4LL>$<9~!Hqlq0?ZWE& zV5s}GX=%lhSD&@Ir(rmDQ%hXABERe1ekF9ThD-}vj+(+rP*lRbj5jbAC&vHSw`zVx0mrSFX>rj=2{+o+mk=@@t zM#JP)(DnC+OXzzo3VpeylZjcnP}jq0HpU&rZ8fK~t{{I29r?jR3 literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave4.paa b/addons/nametags/UI/soundwave4.paa new file mode 100644 index 0000000000000000000000000000000000000000..7ab8b6d9442a2456f681099149d59fd112790773 GIT binary patch literal 26802 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 literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave5.paa b/addons/nametags/UI/soundwave5.paa new file mode 100644 index 0000000000000000000000000000000000000000..f3e98d47aae32588a8e588d0a3d9be43374f5318 GIT binary patch literal 26662 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 literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave7.paa b/addons/nametags/UI/soundwave7.paa new file mode 100644 index 0000000000000000000000000000000000000000..e705c70b422e2d41e0475a62810c5c2281c1cc92 GIT binary patch literal 26996 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 LFm-eGg|7bxu#VuD literal 0 HcmV?d00001 diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index c73ec08cfe..127f639003 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -1,6 +1,8 @@ // by commy2 and CAA-Picard #include "script_component.hpp" +[] call FUNC(initIsSpeaking); + if (!hasInterface) exitWith {}; diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp index aa55dd2aad..c7ee208a60 100644 --- a/addons/nametags/config.cpp +++ b/addons/nametags/config.cpp @@ -41,7 +41,12 @@ class ACE_Settings { isClientSetable = 1; displayName = "$STR_ACE_NameTags_ShowNamesForAI"; }; - + class GVAR(showSoundWaves) { + value = 0; + typeName = "BOOL"; + isClientSetable = 1; + displayName = "$STR_ACE_NameTags_ShowSoundWaves"; + }; class GVAR(PlayerNamesViewDistance) { value = 5; typeName = "SCALAR"; diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index af3932f118..cd8b9b0452 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -13,7 +13,7 @@ */ #include "script_component.hpp" - + #define TEXTURES_RANKS [ \ "", \ "\A3\Ui_f\data\GUI\Cfg\Ranks\private_gs.paa", \ @@ -46,11 +46,23 @@ _color = if !(group _target == group _player) then { _name = [_target, true] call EFUNC(common,getName); -_rank = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find rank _target) + 1); -_size = [0, 1] select GVAR(showPlayerRanks); +_icon = ""; +_size = 0; +if (GVAR(showSoundWaves) && {_target getVariable [QGVAR(isSpeaking), false]}) then { + _icon = QUOTE(PATHTOF(UI\soundwave)); + _icon = _icon + str (floor (random 10)) + ".paa"; //random + // _icon = _icon + str (diag_frameno % 10) + ".paa"; //play in order?? + _size = 2; +} else { + if (GVAR(showPlayerRanks)) then { + _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1); + _size = 1; + }; +}; + drawIcon3D [ - _rank, + _icon, _color, _position, _size, diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf new file mode 100644 index 0000000000..7d632e51dd --- /dev/null +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -0,0 +1,77 @@ +/* + * Author: Glowbal, PabstMirror + * Starts up a PFEH to monitor the when players are talking. + * Compatiblity with TFR/ACRE and Arma's VON + * + * Arguments: + * NONE + * + * Return Value: + * NONE + * + * Example: + * [] call ACE_nametags_fnc_initIsSpeaking + * + * Public: No + */ +#include "script_component.hpp" + +if (isServer) then { + //If someone disconnects while speaking, reset their variable + addMissionEventHandler ["HandleDisconnect", { + PARAMS_1(_disconnectedPlayer); + if (_disconnectedPlayer getVariable [QGVAR(isSpeaking), false]) then { + _disconnectedPlayer setVariable [QGVAR(isSpeaking), false, true]; + }; + }]; +}; + +if (!hasInterface) exitWith {}; + +["playerChanged", { + //When player changes, make sure to reset old unit's variable + PARAMS_2(_newUnit,_oldUnit); + if (_oldUnit getVariable [QGVAR(isSpeaking), false]) then { + _oldUnit setVariable [QGVAR(isSpeaking), false, true]; + }; +}] call EFUNC(common,addEventHandler); + + +//For performance, chose different code paths at mission start based on installed mods (once, instead of checking each time) +_pfEHCode = switch (true) do { +case (isClass (configFile >> "cfgPatches" >> "acre_api")): { + { + _oldSetting = ACE_player getVariable [QGVAR(isSpeaking), false]; + _newSetting = ([ACE_player] call ACRE_api_fnc_isBroadcasting) || {!(isNull findDisplay 55)}; + if (!(_oldSetting isEqualTo _newSetting)) then { + ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true]; + // ["IsTalking??", [ACE_player, _newSetting]] call localEvent //any use in ACE for a "speaking event"? + }; + }; + }; +case (isClass (configFile >> "cfgPatches" >> "task_force_radio")): { + //Note: TFAR has a TFAR_fnc_isSpeaking function, but it has a fairly costly `callExtension` + //I think it's much faster to use the internal "tf_isSpeaking" variable + //If we don't care about the built-in VON, we could switch this to a pure event driven system + { + _oldSetting = ACE_player getVariable [QGVAR(isSpeaking), false]; + _newSetting = (ACE_player getVariable ["tf_isSpeaking", false]) || {!(isNull findDisplay 55)}; + if (!(_oldSetting isEqualTo _newSetting)) then { + ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true]; + }; + }; + }; + default { + //Note: class RscDisplayVoiceChat {idd = 55}; //only present when talking + { + _oldSetting = ACE_player getVariable [QGVAR(isSpeaking), false]; + _newSetting = (!(isNull findDisplay 55)); + if (!(_oldSetting isEqualTo _newSetting)) then { + ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true]; + }; + }; + }; +}; + +//Is 0.05sec precision enough?? +[_pfEHCode, 0.05, []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 9cd99adaef..aee850faee 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -1,5 +1,5 @@  - + @@ -69,5 +69,10 @@ Show name tags for AI units + + Show SoundWaves when speaking + Zeigen Schallwelle im Gespräch + Mostrar onda sonora cuando se habla + - + \ No newline at end of file From dbd33d52302fba6c560c3846a92c4921e9681cfb Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 12 Feb 2015 22:13:51 -0600 Subject: [PATCH 048/166] Missing fnc define Why doesn't calling a nil function throw an error? --- addons/nametags/XEH_preInit.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/nametags/XEH_preInit.sqf b/addons/nametags/XEH_preInit.sqf index 79258c5cec..b56841c2aa 100644 --- a/addons/nametags/XEH_preInit.sqf +++ b/addons/nametags/XEH_preInit.sqf @@ -6,6 +6,7 @@ PREP(canShow); PREP(doShow); PREP(drawNameTagIcon); PREP(getVehicleData); +PREP(initIsSpeaking); PREP(moduleNameTags); PREP(onMouseZChanged); PREP(setText); From ba2ee53804b6c50cd9e81e6021f6c3f31e868079 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 13 Feb 2015 21:23:40 -0600 Subject: [PATCH 049/166] Nametag changes Adds user options for showing soundwaves and default nametag color Before nametags would show effectiveCommander for cursorTarget vehicles, moved this to a module option (default off). --- .../functions/fnc_setSettingFromConfig.sqf | 3 +- addons/nametags/CfgVehicles.hpp | 9 ++ addons/nametags/XEH_postInit.sqf | 106 ++++++++++-------- addons/nametags/config.cpp | 11 ++ .../functions/fnc_drawNameTagIcon.sqf | 42 ++++--- .../nametags/functions/fnc_moduleNameTags.sqf | 1 + addons/nametags/stringtable.xml | 11 +- 7 files changed, 108 insertions(+), 75 deletions(-) diff --git a/addons/common/functions/fnc_setSettingFromConfig.sqf b/addons/common/functions/fnc_setSettingFromConfig.sqf index 4151f3e0e4..e68157bfdb 100644 --- a/addons/common/functions/fnc_setSettingFromConfig.sqf +++ b/addons/common/functions/fnc_setSettingFromConfig.sqf @@ -16,8 +16,7 @@ EXPLODE_1_PVT(_this,_optionEntry); _fnc_getValueWithType = { EXPLODE_2_PVT(_this,_optionEntry,_typeName); - - _value = getNumber (_optionEntry >> "value"); + _value = if (isNumber (_optionEntry >> "value")) then {getNumber (_optionEntry >> "value")} else {0}; //getNumber on an array throws a warning TRACE_3("_fnc_getValueWithType:", configName _optionEntry, _typeName, _value); if (_typeName == "BOOL") exitWith { _value > 0 diff --git a/addons/nametags/CfgVehicles.hpp b/addons/nametags/CfgVehicles.hpp index e3c4227834..d61c761bfc 100644 --- a/addons/nametags/CfgVehicles.hpp +++ b/addons/nametags/CfgVehicles.hpp @@ -55,6 +55,15 @@ class CfgVehicles { }; }; }; + class showCursorTagForVehicles { + displayName = "Show for Vehicles"; + description = "Show cursor NameTag for vehicle commander (only if client has name tags enabled)Default: No"; + typeName = "BOOL"; + class values { + class Yes {name = "Yes"; value = 1;}; + class No {default = 1; name = "No"; value = 0;}; + }; + }; }; }; }; diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index 127f639003..fef1e4e4d3 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -28,56 +28,68 @@ if (!hasInterface) exitWith {}; // Draw handle addMissionEventHandler ["Draw3D", { - if (GVAR(showPlayerNames) == 0) exitWith {}; + if (GVAR(showPlayerNames) == 0) exitWith {}; - _player = ACE_player; - if (GVAR(showPlayerNames) in [2,4]) then { //only on cursor - _target = cursorTarget; - _target = if (_target in allUnitsUAV) then {objNull} else {effectiveCommander _target}; + _player = ACE_player; - if (!isNull _target && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - _distance = _player distance _target; - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); - if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress - _alpha = _alpha min (1 - (time - GVAR(ShowNamesTime) - 1)); - }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); - }; - } else { - _pos = positionCameraToWorld [0, 0, 0]; - _targets = _pos nearObjects ["Man", GVAR(PlayerNamesViewDistance) + 5]; - - if (!surfaceIsWater _pos) then { - _pos = ATLtoASL _pos; - }; - _pos2 = positionCameraToWorld [0, 0, 1]; - if (!surfaceIsWater _pos2) then { - _pos2 = ATLtoASL _pos2; - }; - _vecy = _pos2 vectorDiff _pos; - - { - _target = if (_x in allUnitsUAV) then {objNull} else {effectiveCommander _x}; - - if (!isNull _target && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - _relPos = (visiblePositionASL _target) vectorDiff _pos; - _distance = vectorMagnitude _relPos; - _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy)); - - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); - - if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress - _alpha = _alpha min (1 - (time - GVAR(ShowNamesTime) - 1)); + //When cursorTarget is on a vehicle show the nametag for the commander. + //If set to "Only On Keypress" settings, fade just like main tags + if (GVAR(showCursorTagForVehicles)) then { + _target = cursorTarget; + if ((!(_target isKindOf "Man")) && {!(_target in allUnitsUAV)}) then { + _target = effectiveCommander _target; + if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + _distance = _player distance _target; + _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); + if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress + _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time)); + }; + [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + }; }; + }; - // Check if there is line of sight - if (_alpha > 0) then { - if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) then { - _alpha = 0; - }; + if (GVAR(showPlayerNames) in [2,4]) then { + //"Only Cursor" mode, only show nametags for humans + _target = cursorTarget; + if ((!isNull _target) && {_target isKindOf "Man"} && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + _distance = _player distance _target; + _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); + if ((GVAR(showPlayerNames) == 4)) then { //only on keypress + _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time)); + }; + [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); - }; - } forEach _targets; - }; + } else { + _pos = positionCameraToWorld [0, 0, 0]; + _targets = _pos nearObjects ["Man", GVAR(PlayerNamesViewDistance) + 5]; + + if (!surfaceIsWater _pos) then { + _pos = ATLtoASL _pos; + }; + _pos2 = positionCameraToWorld [0, 0, 1]; + if (!surfaceIsWater _pos2) then { + _pos2 = ATLtoASL _pos2; + }; + _vecy = _pos2 vectorDiff _pos; + + { + _target = _x; + + if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight + _relPos = (visiblePositionASL _target) vectorDiff _pos; + _distance = vectorMagnitude _relPos; + _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy)); + + _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); + + if (GVAR(showPlayerNames) == 3) then { //only on keypress + _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time)); + }; + + [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + }; + } forEach _targets; + }; }]; diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp index c7ee208a60..d17c156b78 100644 --- a/addons/nametags/config.cpp +++ b/addons/nametags/config.cpp @@ -16,6 +16,12 @@ class CfgPatches { #include "CfgVehicles.hpp" class ACE_Settings { + class GVAR(defaultNametagColor) { + value[] = {0.77, 0.51, 0.08, 1}; + typeName = "COLOR"; + isClientSetable = 1; + displayName = "$STR_ACE_NameTags_DefaultNametagColor"; + }; class GVAR(showPlayerNames) { value = 1; typeName = "SCALAR"; @@ -40,6 +46,11 @@ class ACE_Settings { typeName = "BOOL"; isClientSetable = 1; displayName = "$STR_ACE_NameTags_ShowNamesForAI"; + }; + class GVAR(showCursorTagForVehicles) { + value = 0; + typeName = "BOOL"; + isClientSetable = 0; }; class GVAR(showSoundWaves) { value = 0; diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index cd8b9b0452..ca2ed39c5e 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -27,39 +27,37 @@ private ["_player", "_target", "_alpha", "_heightOffset", "_height", "_position", "_color", "_name", "_rank", "_size"]; -_player = _this select 0; -_target = _this select 1; -_alpha = _this select 2; -_heightOffset = _this select 3; - -_height = [2, 1.5, 1, 1.5, 1] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find stance _target); - -_position = visiblePositionASL _target; -// Convert position to ASLW (expected by drawIcon3D) and add height offsets -_position set [2, ((_target modelToWorld [0,0,0]) select 2) + _height + _heightOffset]; - -_color = if !(group _target == group _player) then { - [0.77, 0.51, 0.08, _alpha] -} else { - [[1, 1, 1, _alpha], [1, 0, 0, _alpha], [0, 1, 0, _alpha], [0, 0, 1, _alpha], [1, 1, 0, _alpha]] select (["MAIN", "RED", "GREEN", "BLUE", "YELLOW"] find (if (_target == _player) then {0} else {assignedTeam _target})) max 0 -}; +PARAMS_4(_player,_target,_alpha,_heightOffset); _name = [_target, true] call EFUNC(common,getName); _icon = ""; _size = 0; -if (GVAR(showSoundWaves) && {_target getVariable [QGVAR(isSpeaking), false]}) then { - _icon = QUOTE(PATHTOF(UI\soundwave)); - _icon = _icon + str (floor (random 10)) + ".paa"; //random - // _icon = _icon + str (diag_frameno % 10) + ".paa"; //play in order?? - _size = 2; + +if (GVAR(showSoundWaves) && {(_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}}) then { + _icon = QUOTE(PATHTOF(UI\soundwave)) + str (floor (random 10)) + ".paa"; + _size = 0.75; + _alpha = _alpha + 0.6;//Boost alpha when speaking } else { if (GVAR(showPlayerRanks)) then { _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1); - _size = 1; + _size = 0.75; }; }; +if (_alpha < 0) exitWith {}; //Don't waste time if not visable + +if !(group _target == group _player) then { + _color = +GVAR(defaultNametagColor); //Make a copy, then multiply both alpha values (allows client to decrease alpha in settings) + _color set [3, (_color select 3) * _alpha]; +} else { + _color = [[1, 1, 1, _alpha], [1, 0, 0, _alpha], [0, 1, 0, _alpha], [0, 0, 1, _alpha], [1, 1, 0, _alpha]] select (["MAIN", "RED", "GREEN", "BLUE", "YELLOW"] find (if (_target == _player) then {0} else {assignedTeam _target})) max 0 +}; + +_height = [2, 1.5, 1, 1.5, 1] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find (stance _target)); + +// Convert position to ASLW (expected by drawIcon3D) and add height offsets +_position = _target modelToWorldVisual [0, 0, (_height + _heightOffset)]; drawIcon3D [ _icon, diff --git a/addons/nametags/functions/fnc_moduleNameTags.sqf b/addons/nametags/functions/fnc_moduleNameTags.sqf index 24b30e5d6b..a998e5d8a3 100644 --- a/addons/nametags/functions/fnc_moduleNameTags.sqf +++ b/addons/nametags/functions/fnc_moduleNameTags.sqf @@ -25,5 +25,6 @@ GVAR(Module) = true; [_logic, QGVAR(PlayerNamesViewDistance), "PlayerNamesViewDistance" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(ShowNamesForAI), "ShowNamesForAI" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(showVehicleCrewInfo), "showVehicleCrewInfo" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(showCursorTagForVehicles), "showCursorTagForVehicles" ] call EFUNC(common,readSettingFromModule); diag_log text "[ACE]: NameTags Module Initialized."; diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index aee850faee..622df44aca 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -1,5 +1,5 @@  - + @@ -70,9 +70,12 @@ Show name tags for AI units - Show SoundWaves when speaking - Zeigen Schallwelle im Gespräch - Mostrar onda sonora cuando se habla + Show SoundWaves (requires player names) + Zeigen Schallwelle (benötigt spielernamen) + Mostrar onda sonora (requiere Mostrar nombres de jugadores) + + + Default Nametag Color (Non Group Members) \ No newline at end of file From d4163223a95816efb4eda07604300fbf0d8b6c80 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 05:05:02 +0100 Subject: [PATCH 050/166] fcs in MP --- addons/fcs/functions/fnc_keyUp.sqf | 8 ++++---- addons/fcs/functions/fnc_reset.sqf | 8 ++++---- addons/fcs/functions/fnc_vehicleInit.sqf | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/fcs/functions/fnc_keyUp.sqf b/addons/fcs/functions/fnc_keyUp.sqf index 96e85714fd..1e5878f0b5 100644 --- a/addons/fcs/functions/fnc_keyUp.sqf +++ b/addons/fcs/functions/fnc_keyUp.sqf @@ -155,9 +155,9 @@ _FCSElevation = []; }; } forEach _magazines; -_vehicle setVariable [format ["%1_%2", QGVAR(Distance), _turret], _distance, true]; -_vehicle setVariable [format ["%1_%2", QGVAR(Magazines), _turret], _FCSMagazines, true]; -_vehicle setVariable [format ["%1_%2", QGVAR(Elevation), _turret], _FCSElevation, true]; -_vehicle setVariable [format ["%1_%2", QGVAR(Azimuth), _turret], _FCSAzimuth, true]; +[_vehicle, format ["%1_%2", QGVAR(Distance), _turret], _distance] call EFUNC(common,setVariablePublic); +[_vehicle, format ["%1_%2", QGVAR(Magazines), _turret], _FCSMagazines] call EFUNC(common,setVariablePublic); +[_vehicle, format ["%1_%2", QGVAR(Elevation), _turret], _FCSElevation] call EFUNC(common,setVariablePublic); +[_vehicle, format ["%1_%2", QGVAR(Azimuth), _turret], _FCSAzimuth] call EFUNC(common,setVariablePublic); [format ["%1: %2", localize "STR_ACE_FCS_ZeroedTo", _distance]] call EFUNC(common,displayTextStructured); diff --git a/addons/fcs/functions/fnc_reset.sqf b/addons/fcs/functions/fnc_reset.sqf index 9001a31c48..f2b434ab34 100644 --- a/addons/fcs/functions/fnc_reset.sqf +++ b/addons/fcs/functions/fnc_reset.sqf @@ -16,9 +16,9 @@ private "_vehicle"; _vehicle = _this select 0; -_vehicle setVariable [QGVAR(Distance), 0, true]; -_vehicle setVariable [QGVAR(Magazines), [], true]; -_vehicle setVariable [QGVAR(Elevation), 0, true]; -_vehicle setVariable [QGVAR(Azimuth), 0, true]; +[_vehicle, QGVAR(Distance), 0] call EFUNC(common,setVariablePublic); +[_vehicle, QGVAR(Magazines), []] call EFUNC(common,setVariablePublic); +[_vehicle, QGVAR(Elevation), 0] call EFUNC(common,setVariablePublic); +[_vehicle, QGVAR(Azimuth), 0] call EFUNC(common,setVariablePublic); [localize "STR_ACE_FCS_HasBeenReset"] call EFUNC(common,displayTextStructured); diff --git a/addons/fcs/functions/fnc_vehicleInit.sqf b/addons/fcs/functions/fnc_vehicleInit.sqf index fa808c7c27..8ac23073f6 100644 --- a/addons/fcs/functions/fnc_vehicleInit.sqf +++ b/addons/fcs/functions/fnc_vehicleInit.sqf @@ -1,7 +1,7 @@ /* - * Author: KoffeinFlummi + * Author: KoffeinFlummi, commy2 * - * Checks if a vehicle is equipped with an FCS and if so, adds the fired event handler + * Checks if a vehicle is equipped with an FCS and if so, adds the fired event handler. Execute on server. * * Arguments: * 0: Vehicle From f83d83a82029add45d66dd2ba23611daa50df090 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 13 Feb 2015 22:09:29 -0600 Subject: [PATCH 051/166] Fix from AGM FFV-holster bug --- .../fnc_fixLoweredRifleAnimation.sqf | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/addons/common/functions/fnc_fixLoweredRifleAnimation.sqf b/addons/common/functions/fnc_fixLoweredRifleAnimation.sqf index 55bc6865b0..411fdd2eb3 100644 --- a/addons/common/functions/fnc_fixLoweredRifleAnimation.sqf +++ b/addons/common/functions/fnc_fixLoweredRifleAnimation.sqf @@ -1,10 +1,22 @@ -// by commy2 +/* + * Author: commy2 + * Fixes the lowered rifle animation + * + * Arguments: + * 0: Unit + * + * Return Value: + * Nothing + * + * Example: + * [_player] call ace_common_fnc_fixLoweredRifleAnimation + * + * Public: No + */ #include "script_component.hpp" -private "_unit"; +PARAMS_1(_unit); -_unit = _this select 0; - -if (currentWeapon _unit != "" && {currentWeapon _unit == primaryWeapon _unit} && {weaponLowered _unit} && {stance _unit == "STAND"}) then { +if (currentWeapon _unit != "" && {currentWeapon _unit == primaryWeapon _unit} && {weaponLowered _unit} && {stance _unit == "STAND"} && {(vehicle _unit) == _unit}) then { [_unit, "amovpercmstpsraswrfldnon", 0] call FUNC(doAnimation); }; From 60a7d1d1e6ff04302476f15efa4beb75d126177f Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 06:38:01 +0100 Subject: [PATCH 052/166] fix, fcs reset was broken --- addons/fcs/functions/fnc_canResetFCS.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/fcs/functions/fnc_canResetFCS.sqf b/addons/fcs/functions/fnc_canResetFCS.sqf index 81876b301b..488f1eebf4 100644 --- a/addons/fcs/functions/fnc_canResetFCS.sqf +++ b/addons/fcs/functions/fnc_canResetFCS.sqf @@ -12,4 +12,4 @@ #include "script_component.hpp" -count ((vehicle ACE_player) getVariable [format ["%1_%2", QGVAR(Magazines), [vehicle ACE_player] call EFUNC(common,getTurretIndex)], []]) > 1 +count ((vehicle ACE_player) getVariable [format ["%1_%2", QGVAR(Magazines), [ACE_player] call EFUNC(common,getTurretIndex)], []]) > 1 From fb3a610649132c30cc5837a3c90580fba060d1da Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 13 Feb 2015 23:09:52 -0600 Subject: [PATCH 053/166] Fix bad STR_ACE_Common_ACETeam --- addons/logistics_wirecutter/CfgWeapons.hpp | 2 +- addons/vehiclelock/CfgWeapons.hpp | 2 +- addons/winddeflection/config.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/logistics_wirecutter/CfgWeapons.hpp b/addons/logistics_wirecutter/CfgWeapons.hpp index f2d35337a2..76b1003f34 100644 --- a/addons/logistics_wirecutter/CfgWeapons.hpp +++ b/addons/logistics_wirecutter/CfgWeapons.hpp @@ -3,7 +3,7 @@ class CfgWeapons { class ACE_ItemCore; class ACE_wirecutter: ACE_ItemCore { - author = "$STR_ACE_Core_ACETeam"; + author = "$STR_ACE_Common_ACETeam"; displayName = "$STR_ACE_logistics_wirecutter_wirecutterName"; descriptionShort = "$STR_ACE_logistics_wirecutter_wirecutterDescription"; model = "\A3\weapons_F\ammo\mag_univ.p3d"; diff --git a/addons/vehiclelock/CfgWeapons.hpp b/addons/vehiclelock/CfgWeapons.hpp index c7df1116f8..157fb4bf60 100644 --- a/addons/vehiclelock/CfgWeapons.hpp +++ b/addons/vehiclelock/CfgWeapons.hpp @@ -3,7 +3,7 @@ class CfgWeapons { class ACE_ItemCore; class ACE_key_master: ACE_ItemCore { - author = "$STR_ACE_Core_ACETeam"; + author = "$STR_ACE_Common_ACETeam"; displayName = "Vehicle Key: Master"; descriptionShort = "$STR_ACE_Vehicle_Item_Master_Description"; model = "\A3\weapons_F\ammo\mag_univ.p3d"; diff --git a/addons/winddeflection/config.cpp b/addons/winddeflection/config.cpp index f71ef251cd..0e721846ad 100644 --- a/addons/winddeflection/config.cpp +++ b/addons/winddeflection/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredAddons[] = {"ACE_common", "ACE_weather"}; versionDesc = "ACE Wind Deflection"; version = VERSION; - author[] = {$STR_ACE_Core_ACETeam, "Glowbal", "Ruthberg"}; + author[] = {$STR_ACE_Common_ACETeam, "Glowbal", "Ruthberg"}; authorUrl = "http://csemod.com"; }; }; From 1a611480538b0f4df11bcf6e1b863001d65b9aae Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 14 Feb 2015 00:39:01 -0600 Subject: [PATCH 054/166] Grenades Cleanup Shouldn't be any change to functionality Headers Formating simplifying (waitAndExecute) exceptions/canInteract for keybind --- addons/grenades/CfgAmmo.hpp | 168 +++++++++--------- addons/grenades/CfgEventHandlers.hpp | 20 +-- addons/grenades/CfgMagazines.hpp | 114 ++++++------ addons/grenades/CfgVehicles.hpp | 66 +++---- addons/grenades/CfgWeapons.hpp | 38 ++-- addons/grenades/XEH_postInit.sqf | 28 +++ addons/grenades/XEH_postInitClient.sqf | 13 -- addons/grenades/XEH_preInit.sqf | 3 - addons/grenades/config.cpp | 18 +- .../functions/fnc_flashbangEffectStages.sqf | 57 ------ .../functions/fnc_flashbangExplosionEH.sqf | 150 +++++++++------- .../functions/fnc_flashbangThrownFuze.sqf | 33 ++-- addons/grenades/functions/fnc_nextMode.sqf | 37 ++-- .../grenades/functions/fnc_throwGrenade.sqf | 85 +++++---- 14 files changed, 413 insertions(+), 417 deletions(-) create mode 100644 addons/grenades/XEH_postInit.sqf delete mode 100644 addons/grenades/XEH_postInitClient.sqf delete mode 100644 addons/grenades/functions/fnc_flashbangEffectStages.sqf diff --git a/addons/grenades/CfgAmmo.hpp b/addons/grenades/CfgAmmo.hpp index 7b0a24740d..0f86230784 100644 --- a/addons/grenades/CfgAmmo.hpp +++ b/addons/grenades/CfgAmmo.hpp @@ -1,89 +1,89 @@ class CfgAmmo { - class FlareCore; - class FlareBase: FlareCore { - intensity = 20000; - flareSize = 12; - }; - class F_40mm_White: FlareBase { - intensity = 40000; - flareSize = 12; - }; - class F_20mm_White: FlareBase { - intensity = 20000; - flareSize = 12; - }; - class F_Signal_Green: FlareBase { - intensity = 20000; - flareSize = 12; - }; - class Flare_82mm_AMOS_White: FlareCore { - intensity = 80000; - flareSize = 12; - }; + class FlareCore; + class FlareBase: FlareCore { + intensity = 20000; + flareSize = 12; + }; + class F_40mm_White: FlareBase { + intensity = 40000; + flareSize = 12; + }; + class F_20mm_White: FlareBase { + intensity = 20000; + flareSize = 12; + }; + class F_Signal_Green: FlareBase { + intensity = 20000; + flareSize = 12; + }; + class Flare_82mm_AMOS_White: FlareCore { + intensity = 80000; + flareSize = 12; + }; - class F_20mm_Red: F_20mm_White {}; - class F_20mm_Green: F_20mm_White {}; - class F_20mm_Yellow: F_20mm_White {}; + class F_20mm_Red: F_20mm_White {}; + class F_20mm_Green: F_20mm_White {}; + class F_20mm_Yellow: F_20mm_White {}; - class ACE_F_Hand_White: F_20mm_White { - grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; - soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; - SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; - SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; - SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; - SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; - timeToLive = 60; - }; - class ACE_F_Hand_Red: F_20mm_Red { - grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; - soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; - SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; - SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; - SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; - SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; - timeToLive = 60; - }; - class ACE_F_Hand_Green: F_20mm_Green { - grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; - soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; - SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; - SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; - SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; - SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; - timeToLive = 60; - }; - class ACE_F_Hand_Yellow: F_20mm_Yellow { - grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; - soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; - SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; - SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; - SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; - SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; - SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; - timeToLive = 60; - }; + class ACE_F_Hand_White: F_20mm_White { + grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; + grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; + soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; + SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; + SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; + SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; + SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; + SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; + timeToLive = 60; + }; + class ACE_F_Hand_Red: F_20mm_Red { + grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; + grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; + soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; + SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; + SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; + SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; + SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; + SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; + timeToLive = 60; + }; + class ACE_F_Hand_Green: F_20mm_Green { + grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; + grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; + soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; + SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; + SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; + SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; + SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; + SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; + timeToLive = 60; + }; + class ACE_F_Hand_Yellow: F_20mm_Yellow { + grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; + grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; + soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; + SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; + SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; + SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; + SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; + SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; + timeToLive = 60; + }; - class ACE_G_M84: F_20mm_Yellow { - useFlare = 0; - flareSize = 0; - intensity = 0; - 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; - fuseDistance = 2.3; - model = PATHTOF(models\ACE_m84_thrown.p3d); - }; + class ACE_G_M84: F_20mm_Yellow { + useFlare = 0; + flareSize = 0; + intensity = 0; + 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; + fuseDistance = 2.3; + model = PATHTOF(models\ACE_m84_thrown.p3d); + }; }; diff --git a/addons/grenades/CfgEventHandlers.hpp b/addons/grenades/CfgEventHandlers.hpp index 02f1ac5553..2587bdf86f 100644 --- a/addons/grenades/CfgEventHandlers.hpp +++ b/addons/grenades/CfgEventHandlers.hpp @@ -1,19 +1,19 @@ class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE( call COMPILE_FILE(XEH_preInit) ); - }; + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; }; class Extended_PostInit_EventHandlers { - class ADDON { - clientInit = QUOTE( call COMPILE_FILE(XEH_postInitClient) ); - }; + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + }; }; class Extended_FiredBIS_EventHandlers { - class CAManBase { - class ADDON { - clientFiredBIS = QUOTE( _this call FUNC(throwGrenade) ); + class CAManBase { + class ADDON { + clientFiredBIS = QUOTE( _this call FUNC(throwGrenade) ); + }; }; - }; }; diff --git a/addons/grenades/CfgMagazines.hpp b/addons/grenades/CfgMagazines.hpp index 5775302d2c..33392f41ee 100644 --- a/addons/grenades/CfgMagazines.hpp +++ b/addons/grenades/CfgMagazines.hpp @@ -1,60 +1,60 @@ class CfgMagazines { - class HandGrenade; - class ACE_HandFlare_Base: HandGrenade { - value = 2; - nameSoundWeapon = "smokeshell"; - nameSound = "smokeshell"; - mass = 4; - initSpeed = 22; - }; - class ACE_HandFlare_White: ACE_HandFlare_Base { - ammo = "ACE_F_Hand_White"; - displayname = "$STR_ACE_Grenades_M127A1_White_Name"; - descriptionshort = "$STR_ACE_Grenades_M127A1_White_Description"; - displayNameShort = "$STR_ACE_Grenades_M127A1_White_NameShort"; - model = "\A3\weapons_f\ammo\flare_white"; - picture = "\A3\Weapons_F\Data\UI\gear_flare_white_ca.paa"; - }; - class ACE_HandFlare_Red: ACE_HandFlare_Base { - ammo = "ACE_F_Hand_Red"; - displayname = "$STR_ACE_Grenades_M127A1_Red_Name"; - descriptionshort = "$STR_ACE_Grenades_M127A1_Red_Description"; - displayNameShort = "$STR_ACE_Grenades_M127A1_Red_NameShort"; - model = "\A3\weapons_f\ammo\flare_red"; - picture = "\A3\Weapons_F\Data\UI\gear_flare_red_ca.paa"; - }; - class ACE_HandFlare_Green: ACE_HandFlare_Base { - ammo = "ACE_F_Hand_Green"; - displayname = "$STR_ACE_Grenades_M127A1_Green_Name"; - descriptionshort = "$STR_ACE_Grenades_M127A1_Green_Description"; - displayNameShort = "$STR_ACE_Grenades_M127A1_Green_NameShort"; - model = "\A3\weapons_f\ammo\flare_green"; - picture = "\A3\Weapons_F\Data\UI\gear_flare_green_ca.paa"; - }; - class ACE_HandFlare_Yellow: ACE_HandFlare_Base { - ammo = "ACE_F_Hand_Yellow"; - displayname = "$STR_ACE_Grenades_M127A1_Yellow_Name"; - descriptionshort = "$STR_ACE_Grenades_M127A1_Yellow_Description"; - displayNameShort = "$STR_ACE_Grenades_M127A1_Yellow_NameShort"; - model = "\A3\weapons_f\ammo\flare_yellow"; - picture = "\A3\Weapons_F\Data\UI\gear_flare_yellow_ca.paa"; - }; - class ACE_M84: HandGrenade { - ammo = "ACE_G_M84"; - displayname = "$STR_ACE_Grenades_M84_Name"; - descriptionshort = "$STR_ACE_Grenades_M84_Description"; - displayNameShort = "M84"; - model = PATHTOF(models\ACE_m84.p3d); - picture = PATHTOF(UI\ACE_m84_x_ca.paa); - }; + class HandGrenade; + class ACE_HandFlare_Base: HandGrenade { + value = 2; + nameSoundWeapon = "smokeshell"; + nameSound = "smokeshell"; + mass = 4; + initSpeed = 22; + }; + class ACE_HandFlare_White: ACE_HandFlare_Base { + ammo = "ACE_F_Hand_White"; + displayname = "$STR_ACE_Grenades_M127A1_White_Name"; + descriptionshort = "$STR_ACE_Grenades_M127A1_White_Description"; + displayNameShort = "$STR_ACE_Grenades_M127A1_White_NameShort"; + model = "\A3\weapons_f\ammo\flare_white"; + picture = "\A3\Weapons_F\Data\UI\gear_flare_white_ca.paa"; + }; + class ACE_HandFlare_Red: ACE_HandFlare_Base { + ammo = "ACE_F_Hand_Red"; + displayname = "$STR_ACE_Grenades_M127A1_Red_Name"; + descriptionshort = "$STR_ACE_Grenades_M127A1_Red_Description"; + displayNameShort = "$STR_ACE_Grenades_M127A1_Red_NameShort"; + model = "\A3\weapons_f\ammo\flare_red"; + picture = "\A3\Weapons_F\Data\UI\gear_flare_red_ca.paa"; + }; + class ACE_HandFlare_Green: ACE_HandFlare_Base { + ammo = "ACE_F_Hand_Green"; + displayname = "$STR_ACE_Grenades_M127A1_Green_Name"; + descriptionshort = "$STR_ACE_Grenades_M127A1_Green_Description"; + displayNameShort = "$STR_ACE_Grenades_M127A1_Green_NameShort"; + model = "\A3\weapons_f\ammo\flare_green"; + picture = "\A3\Weapons_F\Data\UI\gear_flare_green_ca.paa"; + }; + class ACE_HandFlare_Yellow: ACE_HandFlare_Base { + ammo = "ACE_F_Hand_Yellow"; + displayname = "$STR_ACE_Grenades_M127A1_Yellow_Name"; + descriptionshort = "$STR_ACE_Grenades_M127A1_Yellow_Description"; + displayNameShort = "$STR_ACE_Grenades_M127A1_Yellow_NameShort"; + model = "\A3\weapons_f\ammo\flare_yellow"; + picture = "\A3\Weapons_F\Data\UI\gear_flare_yellow_ca.paa"; + }; + class ACE_M84: HandGrenade { + ammo = "ACE_G_M84"; + displayname = "$STR_ACE_Grenades_M84_Name"; + descriptionshort = "$STR_ACE_Grenades_M84_Description"; + displayNameShort = "M84"; + model = PATHTOF(models\ACE_m84.p3d); + picture = PATHTOF(UI\ACE_m84_x_ca.paa); + }; - class 3Rnd_UGL_FlareGreen_F; - class 6Rnd_GreenSignal_F: 3Rnd_UGL_FlareGreen_F { - ammo = "F_40mm_Green"; - initSpeed = 120; - }; - class 6Rnd_RedSignal_F: 6Rnd_GreenSignal_F { - ammo = "F_40mm_Red"; - initSpeed = 120; - }; + class 3Rnd_UGL_FlareGreen_F; + class 6Rnd_GreenSignal_F: 3Rnd_UGL_FlareGreen_F { + ammo = "F_40mm_Green"; + initSpeed = 120; + }; + class 6Rnd_RedSignal_F: 6Rnd_GreenSignal_F { + ammo = "F_40mm_Red"; + initSpeed = 120; + }; }; diff --git a/addons/grenades/CfgVehicles.hpp b/addons/grenades/CfgVehicles.hpp index 9a0164e24f..d4ff039bf7 100644 --- a/addons/grenades/CfgVehicles.hpp +++ b/addons/grenades/CfgVehicles.hpp @@ -1,45 +1,45 @@ #define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ - name = #ITEM; \ - count = COUNT; \ - }; + name = #ITEM; \ + count = COUNT; \ + }; class CfgVehicles { - class NATO_Box_Base; - class EAST_Box_Base; - class IND_Box_Base; - class Box_NATO_Support_F; + class NATO_Box_Base; + class EAST_Box_Base; + class IND_Box_Base; + class Box_NATO_Support_F; - class Box_NATO_Grenades_F: NATO_Box_Base { - class TransportItems { - MACRO_ADDITEM(ACE_HandFlare_White,12) - MACRO_ADDITEM(ACE_HandFlare_Green,12) - MACRO_ADDITEM(ACE_M84,12) + class Box_NATO_Grenades_F: NATO_Box_Base { + class TransportItems { + MACRO_ADDITEM(ACE_HandFlare_White,12) + MACRO_ADDITEM(ACE_HandFlare_Green,12) + MACRO_ADDITEM(ACE_M84,12) + }; }; - }; - class Box_East_Grenades_F: EAST_Box_Base { - class TransportItems { - MACRO_ADDITEM(ACE_HandFlare_Yellow,12) - MACRO_ADDITEM(ACE_HandFlare_Red,12) - MACRO_ADDITEM(ACE_M84,12) + class Box_East_Grenades_F: EAST_Box_Base { + class TransportItems { + MACRO_ADDITEM(ACE_HandFlare_Yellow,12) + MACRO_ADDITEM(ACE_HandFlare_Red,12) + MACRO_ADDITEM(ACE_M84,12) + }; }; - }; - class Box_IND_Grenades_F: IND_Box_Base { - class TransportItems { - MACRO_ADDITEM(ACE_HandFlare_Yellow,12) - MACRO_ADDITEM(ACE_HandFlare_Green,12) - MACRO_ADDITEM(ACE_M84,12) + class Box_IND_Grenades_F: IND_Box_Base { + class TransportItems { + MACRO_ADDITEM(ACE_HandFlare_Yellow,12) + MACRO_ADDITEM(ACE_HandFlare_Green,12) + MACRO_ADDITEM(ACE_M84,12) + }; }; - }; - class ACE_Box_Misc: Box_NATO_Support_F { - class TransportItems { - MACRO_ADDITEM(ACE_HandFlare_White,12) - MACRO_ADDITEM(ACE_HandFlare_Red,12) - MACRO_ADDITEM(ACE_HandFlare_Green,12) - MACRO_ADDITEM(ACE_HandFlare_Yellow,12) - MACRO_ADDITEM(ACE_M84,12) + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_HandFlare_White,12) + MACRO_ADDITEM(ACE_HandFlare_Red,12) + MACRO_ADDITEM(ACE_HandFlare_Green,12) + MACRO_ADDITEM(ACE_HandFlare_Yellow,12) + MACRO_ADDITEM(ACE_M84,12) + }; }; - }; }; diff --git a/addons/grenades/CfgWeapons.hpp b/addons/grenades/CfgWeapons.hpp index fa28ca4ef0..4edc6e6d12 100644 --- a/addons/grenades/CfgWeapons.hpp +++ b/addons/grenades/CfgWeapons.hpp @@ -1,23 +1,23 @@ class CfgWeapons { - class GrenadeLauncher; + class GrenadeLauncher; - class Throw: GrenadeLauncher { - muzzles[] += {"ACE_HandFlare_WhiteMuzzle", "ACE_HandFlare_RedMuzzle", "ACE_HandFlare_GreenMuzzle", "ACE_HandFlare_YellowMuzzle", "ACE_M84Muzzle"}; - class ThrowMuzzle; - class ACE_HandFlare_WhiteMuzzle: ThrowMuzzle { - magazines[] = {"ACE_HandFlare_White"}; + class Throw: GrenadeLauncher { + muzzles[] += {"ACE_HandFlare_WhiteMuzzle", "ACE_HandFlare_RedMuzzle", "ACE_HandFlare_GreenMuzzle", "ACE_HandFlare_YellowMuzzle", "ACE_M84Muzzle"}; + class ThrowMuzzle; + class ACE_HandFlare_WhiteMuzzle: ThrowMuzzle { + magazines[] = {"ACE_HandFlare_White"}; + }; + class ACE_HandFlare_RedMuzzle: ThrowMuzzle { + magazines[] = {"ACE_HandFlare_Red"}; + }; + class ACE_HandFlare_GreenMuzzle: ThrowMuzzle { + magazines[] = {"ACE_HandFlare_Green"}; + }; + class ACE_HandFlare_YellowMuzzle: ThrowMuzzle { + magazines[] = {"ACE_HandFlare_Yellow"}; + }; + class ACE_M84Muzzle: ThrowMuzzle { + magazines[] = {"ACE_M84"}; + }; }; - class ACE_HandFlare_RedMuzzle: ThrowMuzzle { - magazines[] = {"ACE_HandFlare_Red"}; - }; - class ACE_HandFlare_GreenMuzzle: ThrowMuzzle { - magazines[] = {"ACE_HandFlare_Green"}; - }; - class ACE_HandFlare_YellowMuzzle: ThrowMuzzle { - magazines[] = {"ACE_HandFlare_Yellow"}; - }; - class ACE_M84Muzzle: ThrowMuzzle { - magazines[] = {"ACE_M84"}; - }; - }; }; diff --git a/addons/grenades/XEH_postInit.sqf b/addons/grenades/XEH_postInit.sqf new file mode 100644 index 0000000000..0b6bb16ffb --- /dev/null +++ b/addons/grenades/XEH_postInit.sqf @@ -0,0 +1,28 @@ +// by commy2 + +#include "script_component.hpp" + +["flashbangExplosion", {_this call FUNC(flashbangExplosionEH)}] call EFUNC(common,addEventHandler); + +if !(hasInterface) exitWith {}; + +GVAR(flashbangPPEffectCC) = ppEffectCreate ["ColorCorrections", 4265]; +GVAR(flashbangPPEffectCC) ppEffectForceInNVG true; + +// Add keybinds +["ACE3", + localize "STR_ACE_Grenades_SwitchGrenadeMode", + { + // Conditions: canInteract + _exceptions = [QEGVAR(captives,isNotEscorting)]; + if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; + // Conditions: specific + if (!([ACE_player] call EFUNC(common,canUseWeapon))) exitWith {false}; + + // Statement + [] call FUNC(nextMode); + }, + [9, [false, false, false]], //8 key + false, + "keydown" +] call cba_fnc_registerKeybind; diff --git a/addons/grenades/XEH_postInitClient.sqf b/addons/grenades/XEH_postInitClient.sqf deleted file mode 100644 index 5f5b569050..0000000000 --- a/addons/grenades/XEH_postInitClient.sqf +++ /dev/null @@ -1,13 +0,0 @@ -// by commy2 - -#include "script_component.hpp" - -GVAR(flashbangPPEffectCC) = ppEffectCreate ["ColorCorrections", 4265]; -GVAR(flashbangPPEffectCC) ppEffectForceInNVG true; - -["ACE3", -localize "STR_ACE_Grenades_SwitchGrenadeMode", -{_this call FUNC(nextMode)}, -[9, [false, false, false]], //8 key -false, -"keydown"] call cba_fnc_registerKeybind; diff --git a/addons/grenades/XEH_preInit.sqf b/addons/grenades/XEH_preInit.sqf index 569cbfa8f6..0df2e235fd 100644 --- a/addons/grenades/XEH_preInit.sqf +++ b/addons/grenades/XEH_preInit.sqf @@ -2,12 +2,9 @@ ADDON = false; -PREP(flashbangEffectStages); PREP(flashbangExplosionEH); PREP(flashbangThrownFuze); PREP(nextMode); PREP(throwGrenade); -["flashbangExplosion", { _this call DFUNC(flashbangExplosionEH) }] call EFUNC(common,addEventHandler); - ADDON = true; diff --git a/addons/grenades/config.cpp b/addons/grenades/config.cpp index 74d1038ecc..c2a899d66c 100644 --- a/addons/grenades/config.cpp +++ b/addons/grenades/config.cpp @@ -1,15 +1,15 @@ #include "script_component.hpp" class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common"}; - author[] = {"commy2", "KoffeinFlummi"}; - authorUrl = "https://github.com/commy2/"; - VERSION_CONFIG; - }; + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"commy2", "KoffeinFlummi"}; + authorUrl = "https://github.com/commy2/"; + VERSION_CONFIG; + }; }; #include "CfgEventHandlers.hpp" diff --git a/addons/grenades/functions/fnc_flashbangEffectStages.sqf b/addons/grenades/functions/fnc_flashbangEffectStages.sqf deleted file mode 100644 index c2ee7a6841..0000000000 --- a/addons/grenades/functions/fnc_flashbangEffectStages.sqf +++ /dev/null @@ -1,57 +0,0 @@ -/* -* Author: KoffeinFlummi, Pabst Mirror -* -* Handles the different stages of the flash bang effect recovery -* -* Arguments: -* ARRAY[ -* 0-ARRAY - PARAMS: -* 0: NUMBER - Stage, controls a case statement -* 1: NUMBER - Time To Wait Until -* 2: VARIES - Stage's Variable -* 1-NUMBER perFrame handle -* Return Value: -* None -*/ - -#include "script_component.hpp" - -private ["_stage", "_waitUntilTime"]; - -_stage = (_this select 0) select 0; -_waitUntilTime = (_this select 0) select 1; - -if (_waitUntilTime > time) exitWith {}; - -//remove frameEH -[(_this select 1)] call cba_fnc_removePerFrameHandler; - -switch (_stage) do { - case(EFFECT_STAGE_RESETAI): { - private "_unit"; - _unit = (_this select 0) select 2; - _unit enableAI "MOVE"; - _unit enableAI "ANIM"; - _unit enableAI "AUTOTARGET"; - _unit enableAI "TARGET"; - _unit enableAI "FSM"; - _unit setSkill (skill _unit * 50); - }; - case(EFFECT_STAGE_DELETELIGHT): { - private "_light"; - _light = (_this select 0) select 2; - deleteVehicle _light; - }; - case(EFFECT_STAGE_PARTIALRECOVERY): { - private "_strength"; - _strength = (_this select 0) select 2; - GVAR(flashbangPPEffectCC) ppEffectAdjust [1,1,0,[1,1,1,0],[0,0,0,1],[0,0,0,0]]; - GVAR(flashbangPPEffectCC) ppEffectCommit (10 * _strength); - }; - case(EFFECT_STAGE_FULLRECOVERY): { - GVAR(flashbangPPEffectCC) ppEffectEnable false; - }; - default { - TRACE_1("EffectStage Bad Stage", _stage); - }; -}; diff --git a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf index 1ef7ea1484..3868994bee 100644 --- a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf +++ b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf @@ -1,85 +1,109 @@ /* -* Author: KoffeinFlummi -* -* Creates the flashbang effect and knock out AI units. -* -* Arguments: -* 0: The grenade (Object) -* -* Return Value: -* None -*/ - + * Author: KoffeinFlummi + * Creates the flashbang effect and knock out AI units. + * + * Arguments: + * 0: The grenade + * + * Return Value: + * Nothing + * + * Example: + * [theGrenade] call ace_grenades_fnc_flashbangExplosionEH + * + * Public: No + */ #include "script_component.hpp" -private ["_grenade", "_affected", "_strength", "_posGrenade", "_posUnit", "_angleGrenade", "_angleView", "_angleDiff", "_light"]; +private ["_affected", "_strength", "_posGrenade", "_posUnit", "_angleGrenade", "_angleView", "_angleDiff", "_light"]; -_grenade = _this select 0; +PARAMS_1(_grenade); _affected = _grenade nearEntities ["CAManBase", 50]; { - if ((local _x) && {alive _x}) then { + if ((local _x) && {alive _x}) then { - _strength = 1 - ((_x distance _grenade) min 15) / 15; + _strength = 1 - ((_x distance _grenade) min 15) / 15; - if (_x != ACE_player) then { - //must be AI - _x disableAI "MOVE"; - _x disableAI "ANIM"; - _x disableAI "AUTOTARGET"; - _x disableAI "TARGET"; - _x disableAI "FSM"; - _x setSkill ((skill _x) / 50); + if (_x != ACE_player) then { + //must be AI + _x disableAI "MOVE"; + _x disableAI "ANIM"; + _x disableAI "AUTOTARGET"; + _x disableAI "TARGET"; + _x disableAI "FSM"; + _x setSkill ((skill _x) / 50); - [FUNC(flashbangEffectStages), 0, [EFFECT_STAGE_RESETAI, (time + (7 * _strength)), _x]] call CBA_fnc_addPerFrameHandler; - } else { - //Do effects for player - // is there line of sight to the grenade? - _posGrenade = getPosASL _grenade; - _posGrenade set [2, (_posGrenade select 2) + 0.2]; // compensate for grenade glitching into ground - if (lineIntersects [_posGrenade, getPosASL _x, _grenade, _x]) then { - _strength = _strength / 10; - }; + [{ + PARAMS_1(_unit); + _unit enableAI "MOVE"; + _unit enableAI "ANIM"; + _unit enableAI "AUTOTARGET"; + _unit enableAI "TARGET"; + _unit enableAI "FSM"; + _unit setSkill (skill _unit * 50); + }, [_x], (7 * _strength), 0.1] call EFUNC(common,waitAndExecute); //0.1 precision is fine for AI + } else { + //Do effects for player + // is there line of sight to the grenade? + _posGrenade = getPosASL _grenade; + _posGrenade set [2, (_posGrenade select 2) + 0.2]; // compensate for grenade glitching into ground + if (lineIntersects [_posGrenade, getPosASL _x, _grenade, _x]) then { + _strength = _strength / 10; + }; - // beeeeeeeeeeeeeeeeeeeeeeeeeeeeep - if (isClass (configFile >> "CfgPatches" >> "ACE_Hearing") and _strength > 0) then { - [_x, 0.5 + (_strength / 2)] call EFUNC(hearing,earRinging); - }; + // beeeeeeeeeeeeeeeeeeeeeeeeeeeeep + if (isClass (configFile >> "CfgPatches" >> "ACE_Hearing") and _strength > 0) then { + [_x, 0.5 + (_strength / 2)] call EFUNC(hearing,earRinging); + }; - // account for people looking away by slightly - // reducing the effect for visual effects. - _posUnit = getPos _x; - _posGrenade = getPos _grenade; - _angleGrenade = ((_posGrenade select 0) - (_posUnit select 0)) atan2 ((_posGrenade select 1) - (_posUnit select 1)); - _angleGrenade = (_angleGrenade + 360) % 360; + // account for people looking away by slightly + // reducing the effect for visual effects. + _posUnit = getPos _x; + _posGrenade = getPos _grenade; + _angleGrenade = ((_posGrenade select 0) - (_posUnit select 0)) atan2 ((_posGrenade select 1) - (_posUnit select 1)); + _angleGrenade = (_angleGrenade + 360) % 360; - _angleView = (eyeDirection player select 0) atan2 (eyeDirection player select 1); - _angleView = (_angleView + 360) % 360; + _angleView = (eyeDirection ACE_player select 0) atan2 (eyeDirection ACE_player select 1); + _angleView = (_angleView + 360) % 360; - _angleDiff = 180 - abs (abs (_angleGrenade - _angleView) - 180); - _angleDiff = ((_angleDiff - 45) max 0); + _angleDiff = 180 - abs (abs (_angleGrenade - _angleView) - 180); + _angleDiff = ((_angleDiff - 45) max 0); - _strength = _strength - _strength * (_angleDiff / 135); + _strength = _strength - _strength * (_angleDiff / 135); - // create flash to illuminate environment - _light = "#lightpoint" createVehicleLocal getPos _grenade; - _light setLightBrightness 200; - _light setLightAmbient [1,1,1]; - _light setLightColor [1,1,1]; - _light setLightDayLight true; + // create flash to illuminate environment + _light = "#lightpoint" createVehicleLocal (getPos _grenade); + _light setLightBrightness 200; + _light setLightAmbient [1,1,1]; + _light setLightColor [1,1,1]; + _light setLightDayLight true; - [FUNC(flashbangEffectStages), 0, [EFFECT_STAGE_DELETELIGHT, (time + (0.1)), _light]] call CBA_fnc_addPerFrameHandler; + //Delete the light after 0.1 seconds + [{ + PARAMS_1(_light); + deleteVehicle _light; + }, [_light], 0.1, 0] call EFUNC(common,waitAndExecute); - // blind player - if (_strength > 0.1) then { - GVAR(flashbangPPEffectCC) ppEffectEnable true; - GVAR(flashbangPPEffectCC) ppEffectAdjust [1,1,(0.8 + _strength) min 1,[1,1,1,0],[0,0,0,1],[0,0,0,0]]; - GVAR(flashbangPPEffectCC) ppEffectCommit 0.01; + // blind player + if (_strength > 0.1) then { + GVAR(flashbangPPEffectCC) ppEffectEnable true; + GVAR(flashbangPPEffectCC) ppEffectAdjust [1,1,(0.8 + _strength) min 1,[1,1,1,0],[0,0,0,1],[0,0,0,0]]; + GVAR(flashbangPPEffectCC) ppEffectCommit 0.01; - [FUNC(flashbangEffectStages), 0, [EFFECT_STAGE_PARTIALRECOVERY, (time + (7 * _strength)), _strength]] call CBA_fnc_addPerFrameHandler; - [FUNC(flashbangEffectStages), 0, [ EFFECT_STAGE_FULLRECOVERY, (time + (17 * _strength))]] call CBA_fnc_addPerFrameHandler; - }; + //PARTIALRECOVERY - start decreasing effect over time + [{ + PARAMS_1(_strength); + GVAR(flashbangPPEffectCC) ppEffectAdjust [1,1,0,[1,1,1,0],[0,0,0,1],[0,0,0,0]]; + GVAR(flashbangPPEffectCC) ppEffectCommit (10 * _strength); + }, [_strength], (7 * _strength), 0] call EFUNC(common,waitAndExecute); + + //FULLRECOVERY - end effect + [{ + GVAR(flashbangPPEffectCC) ppEffectEnable false; + }, [], (17 * _strength), 0] call EFUNC(common,waitAndExecute); + }; + }; }; - }; } forEach _affected; diff --git a/addons/grenades/functions/fnc_flashbangThrownFuze.sqf b/addons/grenades/functions/fnc_flashbangThrownFuze.sqf index aec10301ab..a83c81e660 100644 --- a/addons/grenades/functions/fnc_flashbangThrownFuze.sqf +++ b/addons/grenades/functions/fnc_flashbangThrownFuze.sqf @@ -1,18 +1,25 @@ -//Waits for the grenade fuze to trigger and 'explode' - +/* + * Author: commy2 + * Waits for the flashbang grenade fuze to trigger and 'explode' + * + * Arguments: + * 0: projectile - Flashbang Grenade + * + * Return Value: + * Nothing + * + * Example: + * [theFlashbang] call ace_grenades_fnc_flashbangThrownFuze + * + * Public: No + */ #include "script_component.hpp" -_projectile = (_this select 0) select 0; -_waitUntilTime = (_this select 0) select 1; - -if (_waitUntilTime > time) exitWith {}; - -//remove frameEH -[(_this select 1)] call cba_fnc_removePerFrameHandler; +PARAMS_1(_projectile); if (alive _projectile) then { - playSound3D ["A3\Sounds_F\weapons\Explosion\explosion_mine_1.wss", _projectile, false, getPosASL _projectile, 5, 1.2, 400]; - - _affected = _projectile nearEntities ["CAManBase", 50]; - ["flashbangExplosion", _affected, [_projectile]] call EFUNC(common,targetEvent); + playSound3D ["A3\Sounds_F\weapons\Explosion\explosion_mine_1.wss", _projectile, false, getPosASL _projectile, 5, 1.2, 400]; + + _affected = _projectile nearEntities ["CAManBase", 50]; + ["flashbangExplosion", _affected, [_projectile]] call EFUNC(common,targetEvent); }; diff --git a/addons/grenades/functions/fnc_nextMode.sqf b/addons/grenades/functions/fnc_nextMode.sqf index da8392b6ab..7663e790f6 100644 --- a/addons/grenades/functions/fnc_nextMode.sqf +++ b/addons/grenades/functions/fnc_nextMode.sqf @@ -1,40 +1,41 @@ /* * Author: commy2 - * * Select the next throwing mode and display message. - * - * Argument: - * Nothing - * - * Return value: + * + * Arguments: * Nothing + * + * Return Value: + * Handeled + * + * Example: + * [] call ace_grenades_fnc_nextMode + * + * Public: No */ - #include "script_component.hpp" - -private ["_mode", "_hint"]; -if (!([ACE_player] call EFUNC(common,canUseWeapon))) exitWith {false}; +private ["_mode", "_hint"]; _mode = missionNamespace getVariable [QGVAR(currentThrowMode), 0]; if (_mode == 4) then { - _mode = 0; + _mode = 0; } else { - _mode = _mode + 1; + _mode = _mode + 1; }; // ROLL GRENADE DOESN'T WORK RIGHT NOW if (_mode == 3) then { - _mode = 4; + _mode = 4; }; _hint = [ - localize "STR_ACE_Grenades_NormalThrow", - localize "STR_ACE_Grenades_HighThrow", - localize "STR_ACE_Grenades_PreciseThrow", - localize "STR_ACE_Grenades_RollGrenade", - localize "STR_ACE_Grenades_DropGrenade" +localize "STR_ACE_Grenades_NormalThrow", +localize "STR_ACE_Grenades_HighThrow", +localize "STR_ACE_Grenades_PreciseThrow", +localize "STR_ACE_Grenades_RollGrenade", +localize "STR_ACE_Grenades_DropGrenade" ] select _mode; [_hint] call EFUNC(common,displayTextStructured); diff --git a/addons/grenades/functions/fnc_throwGrenade.sqf b/addons/grenades/functions/fnc_throwGrenade.sqf index e725ebd426..c7bc09a261 100644 --- a/addons/grenades/functions/fnc_throwGrenade.sqf +++ b/addons/grenades/functions/fnc_throwGrenade.sqf @@ -1,15 +1,24 @@ /* -* Author: commy2 -* -* Adjust the grenades throwing direction and speed to the selected throwing mode. -* -* Argument: -* input from "Fired" eventhandler -* -* Return value: -* Nothing -*/ - + * Author: commy2 + * Adjust the grenades throwing direction and speed to the selected throwing mode. + * + * Arguments: + * 0: unit - Object the event handler is assigned to + * 1: weapon - Fired weapon + * 2: muzzle - Muzzle that was used + * 3: mode - Current mode of the fired weapon + * 4: ammo - Ammo used + * 5: magazine - magazine name which was used + * 6: projectile - Object of the projectile that was shot + * + * Return Value: + * Nothing + * + * Example: + * [clientFiredBIS-XEH] call ace_grenades_fnc_throwGrenade + * + * Public: No + */ #include "script_component.hpp" private ["_unit", "_weapon", "_projectile", "_mode", "_fuzeTime"]; @@ -24,38 +33,38 @@ if (_weapon != "Throw") exitWith {}; _mode = missionNamespace getVariable [QGVAR(currentThrowMode), 0]; if (_mode != 0) then { - private "_velocity"; + private "_velocity"; - _velocity = velocity _projectile; + _velocity = velocity _projectile; - switch (_mode) do { - //high throw - case 1 : { - _velocity = [ - 0.5 * (_velocity select 0), - 0.5 * (_velocity select 1), - [0, 0, 0] distance (_velocity vectorMultiply 0.5) - ]; + switch (_mode) do { + //high throw + case 1 : { + _velocity = [ + 0.5 * (_velocity select 0), + 0.5 * (_velocity select 1), + [0, 0, 0] distance (_velocity vectorMultiply 0.5) + ]; + }; + //precise throw + case 2 : { + _velocity = (_unit weaponDirection _weapon) vectorMultiply (vectorMagnitude _velocity); + }; + //roll grande + case 3 : { + //@todo + }; + //drop grenade + case 4 : { + _velocity = [0, 0, 0]; + }; }; - //precise throw - case 2 : { - _velocity = (_unit weaponDirection _weapon) vectorMultiply (vectorMagnitude _velocity); - }; - //roll grande - case 3 : { - //@todo - }; - //drop grenade - case 4 : { - _velocity = [0, 0, 0]; - }; - }; - _projectile setVelocity _velocity; + _projectile setVelocity _velocity; }; if (typeOf _projectile == "ACE_G_M84") then { - _fuzeTime = getNumber (configFile >> "CfgAmmo" >> typeOf _projectile >> "fuseDistance"); - // _fuzeTime = getNumber (configFile >> "CfgAmmo" >> typeOf _projectile >> "explosionTime"); //@toDo pretty sure this should be explosionTime not fuseDistance - [FUNC(flashbangThrownFuze), 0, [_projectile, (time + _fuzeTime)]] call CBA_fnc_addPerFrameHandler; + _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 983b44c02a9add3fdd5e2a3e0888d6ae86a971a7 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 07:51:13 +0100 Subject: [PATCH 055/166] air burst ammo PFH --- addons/fcs/XEH_preInit.sqf | 1 + addons/fcs/functions/fnc_firedEH.sqf | 26 ++++++------------- .../fnc_handleAirBurstAmmunitionPFH.sqf | 21 +++++++++++++++ 3 files changed, 30 insertions(+), 18 deletions(-) create mode 100644 addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf diff --git a/addons/fcs/XEH_preInit.sqf b/addons/fcs/XEH_preInit.sqf index 18729ca54f..78a2fd091c 100644 --- a/addons/fcs/XEH_preInit.sqf +++ b/addons/fcs/XEH_preInit.sqf @@ -9,6 +9,7 @@ PREP(canUseRangefinder); PREP(firedEH); PREP(getAngle); PREP(getRange); +PREP(handleAirBurstAmmunitionPFH); PREP(keyDown); PREP(keyUp); PREP(reset); diff --git a/addons/fcs/functions/fnc_firedEH.sqf b/addons/fcs/functions/fnc_firedEH.sqf index 22371a26f4..38e2c90f3c 100644 --- a/addons/fcs/functions/fnc_firedEH.sqf +++ b/addons/fcs/functions/fnc_firedEH.sqf @@ -45,26 +45,16 @@ _offset = 0; [_projectile, (_vehicle getVariable format ["%1_%2", QGVAR(Azimuth), _turret]), _offset, 0] call EFUNC(common,changeProjectileDirection); // Air burst missile -// may need to get rewritten -if (getNumber (configFile >> "CfgAmmo" >> _ammo >> "ACE_Airburst") == 1) then { - _this spawn { - _vehicle = _this select 0; - _projectile = _this select 6; - _distance = _vehicle getVariable [format ["%1_%2", QGVAR(Distance), _turret], currentZeroing _vehicle]; +// handle locally only +if (!local _gunner) exitWith {}; - if (_distance < 50) exitWith {}; - if (_distance > 1500) exitWith {}; +if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(Airburst)) == 1) then { + private "_zeroing"; + _zeroing = _vehicle getVariable [format ["%1_%2", QGVAR(Distance), _turret], currentZeroing _vehicle]; - waitUntil {_projectile distance _vehicle > _distance || {!alive _projectile}}; - if (!alive _projectile) exitWith {}; + if (_zeroing < 50) exitWith {}; + if (_zeroing > 1500) exitWith {}; - _position = getPosATL _projectile; - - _subMunition = createVehicle ["ACE_B_35mm_ABM_Helper", _position, [], 0, "FLY"]; - _subMunition setPosATL _position; - _subMunition setVelocity [0, 0, -10]; - - deleteVehicle _projectile; - }; + [FUNC(handleAirBurstAmmunitionPFH), 0, [_vehicle, _projectile, _zeroing]] call CBA_fnc_addPerFrameHandler; }; diff --git a/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf b/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf new file mode 100644 index 0000000000..7e8480ce18 --- /dev/null +++ b/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf @@ -0,0 +1,21 @@ +// by commy2 + +_vehicle = _this select 0 select 0; +_projectile = _this select 0 select 1; +_zeroing = _this select 0 select 2; + +if (isNull _projectile || {!alive _projectile}) exitWith { + [_this select 1] call CBA_fnc_removePerFrameHandler; +}; + +if (_projectile distance _vehicle < _zeroing) exitWith {}; + +_position = getPosATL _projectile; + +_subMunition = createVehicle ["ACE_B_35mm_ABM_Helper", _position, [], 0, "FLY"]; +_subMunition setPosATL _position; +_subMunition setVelocity [0, 0, -10]; + +deleteVehicle _projectile; + +[_this select 1] call CBA_fnc_removePerFrameHandler; From 19cf05314e48ab9f9add73b9c0a99b3ff7012fed Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 08:09:52 +0100 Subject: [PATCH 056/166] fcs reset was still broken --- addons/fcs/config.cpp | 2 +- addons/fcs/functions/fnc_reset.sqf | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/addons/fcs/config.cpp b/addons/fcs/config.cpp index 3c7303d68b..20ae063c70 100644 --- a/addons/fcs/config.cpp +++ b/addons/fcs/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {ace_common, ace_interaction}; - author[] = {"KoffeinFlummi","BadGuy (simon84)"}; + author[] = {"KoffeinFlummi","BadGuy (simon84)","commy2"}; authorUrl = "https://github.com/KoffeinFlummi/"; VERSION_CONFIG; }; diff --git a/addons/fcs/functions/fnc_reset.sqf b/addons/fcs/functions/fnc_reset.sqf index f2b434ab34..a23a759fa3 100644 --- a/addons/fcs/functions/fnc_reset.sqf +++ b/addons/fcs/functions/fnc_reset.sqf @@ -12,13 +12,14 @@ #include "script_component.hpp" -private "_vehicle"; +private ["_vehicle", "_turret"]; _vehicle = _this select 0; +_turret = _this select 1; -[_vehicle, QGVAR(Distance), 0] call EFUNC(common,setVariablePublic); -[_vehicle, QGVAR(Magazines), []] call EFUNC(common,setVariablePublic); -[_vehicle, QGVAR(Elevation), 0] call EFUNC(common,setVariablePublic); -[_vehicle, QGVAR(Azimuth), 0] call EFUNC(common,setVariablePublic); +[_vehicle, format ["%1_%2", QGVAR(Distance), _turret], 0] call EFUNC(common,setVariablePublic); +[_vehicle, format ["%1_%2", QGVAR(Magazines), _turret], []] call EFUNC(common,setVariablePublic); +[_vehicle, format ["%1_%2", QGVAR(Elevation), _turret], 0] call EFUNC(common,setVariablePublic); +[_vehicle, format ["%1_%2", QGVAR(Azimuth), _turret], 0] call EFUNC(common,setVariablePublic); [localize "STR_ACE_FCS_HasBeenReset"] call EFUNC(common,displayTextStructured); From e72742da3112f655642a1a177fd94d2b635aba69 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 08:26:30 +0100 Subject: [PATCH 057/166] add macros for transport cargo config --- addons/flashsuppressors/CfgVehicles.hpp | 5 ----- addons/magazines/CfgVehicles.hpp | 5 ----- addons/main/script_macros.hpp | 16 ++++++++++++++++ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/addons/flashsuppressors/CfgVehicles.hpp b/addons/flashsuppressors/CfgVehicles.hpp index 40dc505d64..a973518b91 100644 --- a/addons/flashsuppressors/CfgVehicles.hpp +++ b/addons/flashsuppressors/CfgVehicles.hpp @@ -1,9 +1,4 @@ -#define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ - name = #ITEM; \ - count = COUNT; \ -} - class CfgVehicles { class NATO_Box_Base; class Box_NATO_Support_F: NATO_Box_Base { diff --git a/addons/magazines/CfgVehicles.hpp b/addons/magazines/CfgVehicles.hpp index b78eb71abc..a7c2654d71 100644 --- a/addons/magazines/CfgVehicles.hpp +++ b/addons/magazines/CfgVehicles.hpp @@ -1,9 +1,4 @@ -#define MACRO_ADDMAGAZINE(MAGAZINE,COUNT) class _xx_##MAGAZINE { \ - magazine = #MAGAZINE; \ - count = COUNT; \ -} - class CfgVehicles { class NATO_Box_Base; class Box_NATO_Wps_F: NATO_Box_Base { diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 3b59e8b373..cc589aac3e 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -199,6 +199,22 @@ #define GETEGVAR(var1,var2,var3) GETMVAR(EGVAR(var1,var2),var3) +#define MACRO_ADDWEAPON(WEAPON,COUNT) class _xx_##WEAPON { \ + weapon = #WEAPON; \ + count = COUNT; \ +} + +#define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ + name = #ITEM; \ + count = COUNT; \ +} + +#define MACRO_ADDMAGAZINE(MAGAZINE,COUNT) class _xx_##MAGAZINE { \ + magazine = #MAGAZINE; \ + count = COUNT; \ +} + + #ifdef DISABLE_COMPILE_CACHE #define PREP(fncName) DFUNC(fncName) = compile preprocessFileLineNumbers QUOTE(PATHTOF(functions\DOUBLES(fnc,fncName).sqf)) #else From 20f161a9da1f16447708cace8e1232046ee189a1 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 09:36:35 +0100 Subject: [PATCH 058/166] aircraft, remove redundant config entries, documentation --- addons/aircraft/CfgAmmo.hpp | 285 +------------------- addons/aircraft/config/config.cpp | 13 + addons/aircraft/config/script_component.hpp | 1 + 3 files changed, 27 insertions(+), 272 deletions(-) create mode 100644 addons/aircraft/config/config.cpp create mode 100644 addons/aircraft/config/script_component.hpp diff --git a/addons/aircraft/CfgAmmo.hpp b/addons/aircraft/CfgAmmo.hpp index 2c9d6a91e6..177753223f 100644 --- a/addons/aircraft/CfgAmmo.hpp +++ b/addons/aircraft/CfgAmmo.hpp @@ -1,302 +1,43 @@ class CfgAmmo { - class BulletBase; - class B_20mm: BulletBase { - deflecting = 3; - hit = 100; - indirectHit = 10; - indirectHitRange = 2; - model = "\A3\Weapons_f\Data\bullettracer\tracer_red"; - }; - + // adjust minigun caliber and deflection to other ammo class SubmunitionBullet; class B_65x39_Minigun_Caseless: SubmunitionBullet { - hit = 10; - indirectHit = 0; - indirectHitRange = 0; caliber = 1; - deflecting = 5; - typicalSpeed = 850; + deflecting = 15; }; class B_762x51_Minigun_Tracer_Red: SubmunitionBullet { - hit = 12; - indirectHit = 0; - indirectHitRange = 0; - model = "\A3\Weapons_f\Data\bullettracer\tracer_red"; caliber = 1.6; - deflecting = 5; - typicalSpeed = 850; - }; - - class M_Titan_AA; - class M_Zephyr: M_Titan_AA { - proxyShape = "\A3\Weapons_F\Ammo\Missile_AA_02_F.p3d"; - model = "\A3\Weapons_F\Ammo\Missile_AA_02_fly_F.p3d"; - airFriction = 0.078; - sideAirFriction = 0.18; - maneuvrability = 24; - class CamShakeFire {}; - class CamShakePlayerFire {}; - }; - - class M_Zephyr_Mi06: M_Zephyr { - maverickWeaponIndexOffset = 6; - }; - - class MissileBase; - class M_Air_AA: MissileBase { - model = "\A3\Weapons_F\Ammo\Missile_AT_02_fly_F"; - proxyShape = "\A3\Weapons_F\Ammo\Missile_AT_02_F"; - hit = 280; - indirectHit = 85; - indirectHitRange = 10; - maneuvrability = 27; - simulationStep = 0.002; - airLock = 1; - irLock = 1; - cost = 1500; - //maxSpeed = 2400; - timeToLive = 40; - airFriction = 0.05; - sideAirFriction = 0.1; - trackOversteer = 1; - trackLead = 1; - initTime = 0; - thrustTime = 12; - thrust = 340; - fuseDistance = 500; - weaponLockSystem = "2 + 16"; - maxControlRange = 8000; - class CamShakeExplode {}; - class CamShakeHit {}; - class CamShakeFire {}; - class CamShakePlayerFire {}; - }; - - class Missile_AA_04_F: MissileBase { - hit = 800; - indirectHit = 60; - indirectHitRange = 12; - airLock = 2; - irLock = 1; - laserLock = 0; - nvLock = 0; - weaponLockSystem = "2 + 16"; - cmimmunity = 0.8; - initTime = 0; - thrust = 380; - thrustTime = 9.5; - airFriction = 0.04; - sideAirFriction = 0.08; - //maxSpeed = 2600; - maneuvrability = 14; - simulationStep = 0.002; - fuseDistance = 500; - timeToLive = 19; - trackLead = 1; - trackOversteer = 1; + deflecting = 15; }; + // also adjust tracer, "muh lightshow"; also adjust splash damage radius + class BulletBase; class Gatling_30mm_HE_Plane_CAS_01_F: BulletBase { - model = "\A3\Weapons_f\Data\bullettracer\tracer_red.p3d"; - cost = 20; hit = 80; indirectHit = 12; - indirectHitRange = 3; + indirectHitRange = 3; //2; caliber = 1.4; - explosive = 0.6; - airlock = 1; deflecting = 3; - airFriction = -0.00042; - typicalSpeed = 960; - visibleFire = 32; - audibleFire = 32; - visibleFireTime = 3; fuseDistance = 3; - tracerScale = 2.5; tracerStartTime = 0.02; - tracerEndTime = 4.7; - multiSoundHit[] = {"soundHit1",0.2,"soundHit2",0.2,"soundHit3",0.2,"soundHit4",0.1,"soundHit5",0.15,"soundHit6",0.15}; - soundFly[] = {"A3\Sounds_F\weapons\Explosion\cannon_fly",1,1,50}; - explosionSoundEffect = "DefaultExplosion"; - explosionEffects = "ExploAmmoExplosion"; - craterEffects = "ExploAmmoCrater"; - soundHit1[] = {"A3\Sounds_F\weapons\Explosion\gr_explosion_1",3.16228,1,1600}; - soundHit2[] = {"A3\Sounds_F\weapons\Explosion\gr_explosion_2",3.16228,1,1600}; - soundHit3[] = {"A3\Sounds_F\weapons\Explosion\gr_explosion_3",3.16228,1,1600}; - soundHit4[] = {"A3\Sounds_F\weapons\Explosion\gr_explosion_4",3.16228,1,1600}; - soundHit5[] = {"A3\Sounds_F\weapons\Explosion\gr_explosion_5",3.16228,1,1600}; - soundHit6[] = {"A3\Sounds_F\weapons\Explosion\gr_explosion_6",3.16228,1,1600}; - class CamShakeExplode {}; - class CamShakeHit {}; - class CamShakeFire {}; - class CamShakePlayerFire {}; }; + + // helper projectiles to simulate a rof > fps class ACE_Gatling_30mm_HE_Plane_CAS_01_Deploy: Gatling_30mm_HE_Plane_CAS_01_F { simulation = "shotSubmunitions"; triggerTime = 0; submunitionAmmo = "ACE_Gatling_30mm_HE_Plane_CAS_01_Sub"; submunitionConeType[] = {"custom", {{0,0}, {0,0}, {0,0}} }; }; - class ACE_Gatling_30mm_HE_Plane_CAS_01_Sub: Gatling_30mm_HE_Plane_CAS_01_F { - }; + class ACE_Gatling_30mm_HE_Plane_CAS_01_Sub: Gatling_30mm_HE_Plane_CAS_01_F {}; + + // adjust damage and splash damage, closer to bluefor gatling with same caliber class Cannon_30mm_HE_Plane_CAS_02_F: Gatling_30mm_HE_Plane_CAS_01_F { - model = "\A3\Weapons_f\Data\bullettracer\tracer_green.p3d"; - hit = 70; - indirectHit = 11; + hit = 70; //40; + indirectHit = 11; //14; indirectHitRange = 3; - caliber = 2; - explosive = 0.6; }; - - class Missile_AGM_02_F: MissileBase { - model = "\A3\Weapons_F_EPC\Ammo\Missile_AGM_02_fly_F.p3d"; - proxyShape = "\A3\Weapons_F_EPC\Ammo\Missile_AGM_02_F.p3d"; - maverickWeaponIndexOffset = 2; - cost = 1500; - hit = 2100; - indirectHit = 85; - indirectHitRange = 8; - manualControl = 0; - maxControlRange = 8000; - airLock = 0; - irLock = 1; - laserLock = 0; - nvLock = 0; - weaponLockSystem = "2 + 16"; - cmimmunity = 0.8; - initTime = 0; - thrust = 240; - thrustTime = 5; - airFriction = 0.05; - sideAirFriction = 0.1; - maxSpeed = 828; - maneuvrability = 27; - simulationStep = 0.002; - fuseDistance = 500; - timeToLive = 40; - trackLead = 1; - trackOversteer = 1; - craterEffects = "AAMissileCrater"; - effectsMissile = "missile3"; - explosionEffects = "AAMissileExplosion"; - muzzleEffect = "BIS_fnc_effectFiredHeliRocket"; - whistleDist = 20; - class CamShakeExplode {}; - class CamShakeHit {}; - class CamShakeFire {}; - class CamShakePlayerFire {}; - }; - - class LaserBombCore; - class Bomb_04_F: LaserBombCore { - model = "\A3\Weapons_F_EPC\Ammo\Bomb_04_fly_F.p3d"; - proxyShape = "\A3\Weapons_F_EPC\Ammo\Bomb_04_F.p3d"; - maverickWeaponIndexOffset = 8; - hit = 6000; - indirectHit = 1400; - indirectHitRange = 15; - nvLock = 1; - weaponLockSystem = "2 + 16 + 4"; - maneuvrability = 20; - fuseDistance = 35; - trackLead = 0.95; - trackOversteer = 1; - craterEffects = "BombCrater"; - explosionEffects = "BombExplosion"; - explosionSoundEffect = "DefaultExplosion"; - explosionTime = 2; - multiSoundHit[] = {"soundHit1",0.2,"soundHit2",0.2,"soundHit3",0.2,"soundHit4",0.2,"soundHit5",0.2}; - soundHit1[] = {"\A3\Sounds_F\weapons\Explosion\expl_big_1",2.51189,1,2400}; - soundHit2[] = {"\A3\Sounds_F\weapons\Explosion\expl_big_2",2.51189,1,2400}; - soundHit3[] = {"\A3\Sounds_F\weapons\Explosion\expl_big_3",2.51189,1,2400}; - soundHit4[] = {"\A3\Sounds_F\weapons\Explosion\expl_shell_1",2.51189,1,2400}; - soundHit5[] = {"\A3\Sounds_F\weapons\Explosion\expl_shell_2",2.51189,1,2400}; - whistleDist = 24; - }; - - class Rocket_04_HE_F: MissileBase { - model = "\A3\Weapons_F_EPC\Ammo\Rocket_04_HE_fly_F.p3d"; - proxyShape = "\A3\Weapons_F_EPC\Ammo\Rocket_04_HE_F.p3d"; - maverickWeaponIndexOffset = 12; - cost = 500; - hit = 210; - indirectHit = 55; - indirectHitRange = 15; - manualControl = 0; - maxControlRange = 8000; - airLock = 0; - irLock = 1; - laserLock = 0; - nvLock = 0; - weaponLockSystem = 0; - cmimmunity = 1; - initTime = 0.002; - thrust = 1600; - thrustTime = 0.7; - airFriction = 0.0046; - sideAirFriction = 0.005; - maxSpeed = 610; - maneuvrability = 0; - fuseDistance = 50; - timeToLive = 60; - effectsMissileInit = "MissileDAR1"; - whistleDist = 30; - class CamShakeExplode {}; - class CamShakeHit {}; - class CamShakeFire {}; - class CamShakePlayerFire {}; - }; - - class Rocket_04_AP_F: Rocket_04_HE_F { - model = "\A3\Weapons_F_EPC\Ammo\Rocket_04_AP_fly_F.p3d"; - proxyShape = "\A3\Weapons_F_EPC\Ammo\Rocket_04_AP_F.p3d"; - maverickWeaponIndexOffset = 19; - hit = 400; - indirectHit = 20; - indirectHitRange = 10; - }; - - class Missile_AA_03_F: Missile_AA_04_F { - model = "\A3\Weapons_F_EPC\Ammo\Missile_AA_03_fly_F.p3d"; - proxyShape = "\A3\Weapons_F_EPC\Ammo\Missile_AA_03_F.p3d"; - maverickWeaponIndexOffset = 0; - hit = 900; - indirectHit = 50; - indirectHitRange = 15; - }; - - class Missile_AGM_01_F: Missile_AGM_02_F { - model = "\A3\Weapons_F_EPC\Ammo\Missile_AGM_01_fly_F.p3d"; - proxyShape = "\A3\Weapons_F_EPC\Ammo\Missile_AGM_01_F.p3d"; - maverickWeaponIndexOffset = 2; - hit = 2200; - indirectHit = 90; - indirectHitRange = 10; - }; - - class Bomb_03_F: Bomb_04_F { - model = "\A3\Weapons_F_EPC\Ammo\Bomb_03_F.p3d"; - proxyShape = "\A3\Weapons_F_EPC\Ammo\Bomb_03_F.p3d"; - maverickWeaponIndexOffset = 6; - hit = 6400; - indirectHit = 1400; - indirectHitRange = 16; - }; - - class Rocket_03_HE_F: Rocket_04_HE_F { - model = "\A3\Weapons_F_EPC\Ammo\Rocket_03_HE_fly_F.p3d"; - proxyShape = "\A3\Weapons_F_EPC\Ammo\Rocket_03_HE_F.p3d"; - maverickWeaponIndexOffset = 8; - }; - - class Rocket_03_AP_F: Rocket_04_AP_F { - model = "\A3\Weapons_F_EPC\Ammo\Rocket_03_AP_fly_F.p3d"; - proxyShape = "\A3\Weapons_F_EPC\Ammo\Rocket_03_AP_F.p3d"; - maverickWeaponIndexOffset = 28; - }; - - class RocketBase; }; diff --git a/addons/aircraft/config/config.cpp b/addons/aircraft/config/config.cpp new file mode 100644 index 0000000000..7ac4cf3bad --- /dev/null +++ b/addons/aircraft/config/config.cpp @@ -0,0 +1,13 @@ +#include "script_component.hpp" + +class CfgPatches { + class DOUBLES(ADDON,heli1) { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {QUOTE(ADDON)}; + author[] = {"commy2"}; + authorUrl = "https://github.com/commy2/"; + VERSION_CONFIG; + }; +}; diff --git a/addons/aircraft/config/script_component.hpp b/addons/aircraft/config/script_component.hpp new file mode 100644 index 0000000000..7368add67c --- /dev/null +++ b/addons/aircraft/config/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\aircraft\script_component.hpp" \ No newline at end of file From b1a1c855d99ffa1cee9bb6bc314a87dd9e78aee1 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 09:47:03 +0100 Subject: [PATCH 059/166] fix wrong class inheritance in laser selfdesignate --- addons/laser_selfdesignate/CfgVehicles.hpp | 60 ++++++++++------------ 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/addons/laser_selfdesignate/CfgVehicles.hpp b/addons/laser_selfdesignate/CfgVehicles.hpp index eed000544c..cb9d5a094c 100644 --- a/addons/laser_selfdesignate/CfgVehicles.hpp +++ b/addons/laser_selfdesignate/CfgVehicles.hpp @@ -1,35 +1,29 @@ class CfgVehicles { - class AllVehicles; - - class Air: AllVehicles { - class Turrets; - }; - class Helicopter: Air - { - class Turrets: Turrets { - class MainTurret; - }; - // TODO: move these to a different HUD addon - // commanderCanSee = 2+32; - // gunnerCanSee = 2+32; - // driverCanSee = 2+32; + class AllVehicles; + class Air: AllVehicles { + class Turrets; + }; - }; - class Helicopter_Base_F: Helicopter { - class Turrets: Turrets { - class MainTurret: MainTurret {}; - }; - }; - class Heli_Attack_01_base_F: Helicopter_Base_F { - class Turrets: Turrets { - class MainTurret: MainTurret {}; - }; - }; - class B_Heli_Attack_01_F: Heli_Attack_01_base_F { - class Turrets: Turrets { - class MainTurret: MainTurret { - stabilizedInAxes = 4; // This stablizes the turret a bit more for laser designation - }; - }; - }; -}; \ No newline at end of file + class Helicopter: Air { + class Turrets { + class MainTurret; + }; + + // TODO: move these to a different HUD addon + // commanderCanSee = 2+32; + // gunnerCanSee = 2+32; + // driverCanSee = 2+32; + + }; + class Helicopter_Base_F: Helicopter {}; + + class Heli_Attack_01_base_F: Helicopter_Base_F {}; + + class B_Heli_Attack_01_F: Heli_Attack_01_base_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + stabilizedInAxes = 4; // This stablizes the turret a bit more for laser designation + }; + }; + }; +}; From 3d4c43c6134e2058271e6cecf0399509a7e8df9c Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 09:50:26 +0100 Subject: [PATCH 060/166] replace tabs with spaces --- .../laser_selfdesignate/CfgEventhandlers.hpp | 32 +++++++-------- addons/laser_selfdesignate/CfgUI.hpp | 40 +++++++++---------- addons/laser_selfdesignate/CfgVehicles.hpp | 1 + addons/laser_selfdesignate/CfgWeapons.hpp | 19 ++++----- addons/laser_selfdesignate/config.cpp | 16 ++++---- 5 files changed, 55 insertions(+), 53 deletions(-) diff --git a/addons/laser_selfdesignate/CfgEventhandlers.hpp b/addons/laser_selfdesignate/CfgEventhandlers.hpp index 74deb4bcf6..ea33d05bcb 100644 --- a/addons/laser_selfdesignate/CfgEventhandlers.hpp +++ b/addons/laser_selfdesignate/CfgEventhandlers.hpp @@ -1,27 +1,27 @@ class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_pre_init)); - }; + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_pre_init)); + }; }; class Extended_PostInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_post_init)); - }; + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_post_init)); + }; }; class Extended_GetIn_EventHandlers { - class B_Heli_Attack_01_F { - class ADDON { - getIn = QUOTE(call FUNC(onGetin)); - }; - }; + class B_Heli_Attack_01_F { + class ADDON { + getIn = QUOTE(call FUNC(onGetin)); + }; + }; }; class Extended_GetOut_EventHandlers { - class B_Heli_Attack_01_F { - class ADDON { - getOut = QUOTE(call FUNC(onGetout)); - }; - }; + class B_Heli_Attack_01_F { + class ADDON { + getOut = QUOTE(call FUNC(onGetout)); + }; + }; }; diff --git a/addons/laser_selfdesignate/CfgUI.hpp b/addons/laser_selfdesignate/CfgUI.hpp index 11fab908d7..e8823e04f8 100644 --- a/addons/laser_selfdesignate/CfgUI.hpp +++ b/addons/laser_selfdesignate/CfgUI.hpp @@ -4,29 +4,29 @@ class RscControlsGroupNoScrollbars; /* This disables air radar. We need to make this a seperate HUD addon class RscInGameUI { - class RscUnitInfo - { - class CA_Radar: RscControlsGroupNoScrollbars - { - class controls - { - class CA_RadarBackground: RscPicture { - colorText[] = {0,0,0,0}; - text = ""; - }; - class CA_RadarIcon: RscPicture { - colorText[] = {0,0,0,0}; - }; - class CA_Heading: RscText { - colorText[] = {0,0,0,0}; - }; - }; - }; - }; + class RscUnitInfo + { + class CA_Radar: RscControlsGroupNoScrollbars + { + class controls + { + class CA_RadarBackground: RscPicture { + colorText[] = {0,0,0,0}; + text = ""; + }; + class CA_RadarIcon: RscPicture { + colorText[] = {0,0,0,0}; + }; + class CA_Heading: RscText { + colorText[] = {0,0,0,0}; + }; + }; + }; + }; }; class CfgInGameUI { - + }; */ \ No newline at end of file diff --git a/addons/laser_selfdesignate/CfgVehicles.hpp b/addons/laser_selfdesignate/CfgVehicles.hpp index cb9d5a094c..5b2fdd7d28 100644 --- a/addons/laser_selfdesignate/CfgVehicles.hpp +++ b/addons/laser_selfdesignate/CfgVehicles.hpp @@ -15,6 +15,7 @@ class CfgVehicles { // driverCanSee = 2+32; }; + class Helicopter_Base_F: Helicopter {}; class Heli_Attack_01_base_F: Helicopter_Base_F {}; diff --git a/addons/laser_selfdesignate/CfgWeapons.hpp b/addons/laser_selfdesignate/CfgWeapons.hpp index a966144b10..a62974ce40 100644 --- a/addons/laser_selfdesignate/CfgWeapons.hpp +++ b/addons/laser_selfdesignate/CfgWeapons.hpp @@ -1,10 +1,11 @@ class CfgWeapons { - class LauncherCore; - - class RocketPods: LauncherCore { - canLock = 1; // Disable locking unless newb mode - }; - class missiles_DAGR: RocketPods { - canLock = 1; // Disable locking unless newb mode - }; -}; \ No newline at end of file + // Disable locking unless newb mode + class LauncherCore; + class RocketPods: LauncherCore { + canLock = 1; + }; + + class missiles_DAGR: RocketPods { + canLock = 1; + }; +}; diff --git a/addons/laser_selfdesignate/config.cpp b/addons/laser_selfdesignate/config.cpp index 5452ee4e22..e19e438da0 100644 --- a/addons/laser_selfdesignate/config.cpp +++ b/addons/laser_selfdesignate/config.cpp @@ -1,17 +1,17 @@ #include "script_component.hpp" class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = { "ace_main", "ace_laser" }; - version = VERSION; - }; + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_main", "ace_laser"}; + version = VERSION; + }; }; #include "CfgUI.hpp" #include "CfgEventhandlers.hpp" #include "CfgWeapons.hpp" -#include "CfgVehicles.hpp" \ No newline at end of file +#include "CfgVehicles.hpp" From 06efab0082d8148f358ecd908f12c00448b21e4f Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 10:04:50 +0100 Subject: [PATCH 061/166] fix inheritance, new little bird unarmed base class in 1.38 --- addons/aircraft/CfgVehicles.hpp | 4 +++- addons/fcs/CfgVehicles.hpp | 4 +++- addons/realisticnames/config.cpp | 6 +++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/addons/aircraft/CfgVehicles.hpp b/addons/aircraft/CfgVehicles.hpp index 18be36b9e8..bea27c85ff 100644 --- a/addons/aircraft/CfgVehicles.hpp +++ b/addons/aircraft/CfgVehicles.hpp @@ -55,7 +55,9 @@ class CfgVehicles { }; }; - class B_Heli_Light_01_F: Heli_Light_01_base_F { + class Heli_Light_01_unarmed_base_F: Heli_Light_01_base_F {}; + + class B_Heli_Light_01_F: Heli_Light_01_unarmed_base_F { /*class Turrets: Turrets { class CopilotTurret: CopilotTurret {}; diff --git a/addons/fcs/CfgVehicles.hpp b/addons/fcs/CfgVehicles.hpp index 16902d9ee0..4cc010f917 100644 --- a/addons/fcs/CfgVehicles.hpp +++ b/addons/fcs/CfgVehicles.hpp @@ -432,7 +432,9 @@ class CfgVehicles { };*/ }; - class B_Heli_Light_01_F: Heli_Light_01_base_F { + class Heli_Light_01_unarmed_base_F: Heli_Light_01_base_F {}; + + class B_Heli_Light_01_F: Heli_Light_01_unarmed_base_F { /*class Turrets: Turrets { class CopilotTurret: CopilotTurret {}; };*/ diff --git a/addons/realisticnames/config.cpp b/addons/realisticnames/config.cpp index 347d0c1b2e..ea1318686b 100644 --- a/addons/realisticnames/config.cpp +++ b/addons/realisticnames/config.cpp @@ -292,8 +292,8 @@ class CfgVehicles { displayName = "$STR_ACE_RealisticNames_Heli_Attack_01_Name"; }; - class Heli_Light_01_base_F; - class B_Heli_Light_01_F: Heli_Light_01_base_F { + class Heli_Light_01_unarmed_base_F; + class B_Heli_Light_01_F: Heli_Light_01_unarmed_base_F { displayName = "$STR_ACE_RealisticNames_Heli_Light_01_Name"; }; @@ -302,7 +302,7 @@ class CfgVehicles { displayName = "$STR_ACE_RealisticNames_Heli_Light_01_armed_Name"; }; - class Heli_Light_01_civil_base_F: Heli_Light_01_base_F { + class Heli_Light_01_civil_base_F: Heli_Light_01_unarmed_base_F { displayName = "$STR_ACE_RealisticNames_Heli_Light_01_civil_Name"; }; From 8a348b002407f3973d93c155b0fd3656ef77275d Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 10:26:52 +0100 Subject: [PATCH 062/166] aircraft, remove old/redundant mag configs --- addons/aircraft/CfgMagazines.hpp | 193 +------------------------------ 1 file changed, 3 insertions(+), 190 deletions(-) diff --git a/addons/aircraft/CfgMagazines.hpp b/addons/aircraft/CfgMagazines.hpp index 7328eda091..0c306f8f04 100644 --- a/addons/aircraft/CfgMagazines.hpp +++ b/addons/aircraft/CfgMagazines.hpp @@ -1,202 +1,15 @@ class CfgMagazines { + // shoot helper object to tripple rof class VehicleMagazine; - class 24Rnd_PG_missiles; - - class 12Rnd_PG_missiles: 24Rnd_PG_missiles { - count = 12; - displayName = "$STR_A3_CfgMagazines_12Rnd_PG_missiles0"; - displayNameShort = "$STR_A3_CfgMagazines_12Rnd_PG_missiles_dns"; - descriptionShort = "$STR_A3_CfgMagazines_12Rnd_PG_missiles1"; - }; - class 12Rnd_missiles: VehicleMagazine { - scope = 2; - count = 12; - ammo = "M_AT"; - displayName = "$STR_A3_CfgMagazines_24Rnd_PuG_missiles0"; - displayNameShort = "$STR_A3_CfgMagazines_24Rnd_PuG_missiles_dns"; - descriptionShort = "$STR_A3_CfgMagazines_24Rnd_PuG_missiles0"; - initSpeed = 44; - maxLeadSpeed = 800; - nameSound = "rockets"; - sound[] = {"A3\sounds_f\weapons\rockets\explosion_missile_01",1,1,1200}; - reloadSound[] = {"",0.000316228,1}; - }; - - //minigun magazines, muzzle velocities and tracercounts - class 200Rnd_65x39_Belt: VehicleMagazine {}; - class 2000Rnd_65x39_Belt: 200Rnd_65x39_Belt {}; - class 2000Rnd_65x39_Belt_Tracer_Red: 2000Rnd_65x39_Belt { - }; - class 2000Rnd_65x39_Belt_Green: 2000Rnd_65x39_Belt {}; - class 2000Rnd_65x39_Belt_Tracer_Green: 2000Rnd_65x39_Belt_Green { - tracersEvery = 1; - }; - class 2000Rnd_65x39_Belt_Yellow: 2000Rnd_65x39_Belt { - tracersEvery = 1; - }; - class 2000Rnd_65x39_Belt_Tracer_Yellow: 2000Rnd_65x39_Belt_Yellow { - tracersEvery = 1; - }; - - class 5000Rnd_762x51_Belt: 2000Rnd_65x39_Belt { - tracersEvery = 1; - count = 5000; - }; - class 5000Rnd_762x51_Yellow_Belt: 5000Rnd_762x51_Belt {}; - class 4000Rnd_762x51_M134 : 5000Rnd_762x51_Belt { - count = 4000; - tracersEvery = 1; - }; - class 2000Rnd_762x51_M134 : 4000Rnd_762x51_M134 { - count = 2000; - tracersEvery = 1; - }; - - class 2Rnd_AAA_missiles: VehicleMagazine { - scope = 2; - displayName = "$STR_A3_CfgMagazines_2Rnd_AAA_missiles0"; - displayNameShort = "$STR_A3_CfgMagazines_2Rnd_AAA_missiles_dns"; - ammo = "M_Air_AA"; - count = 2; - maxLeadSpeed = 950; - nameSound = "missiles"; - }; - class 2Rnd_AAA_missiles_MI02: 2Rnd_AAA_missiles { - ammo = "M_Air_AA_MI02"; - }; - class 4Rnd_AAA_missiles: 2Rnd_AAA_missiles { - displayName = "$STR_A3_CfgMagazines_4Rnd_AAA_missiles0"; - displayNameShort = "$STR_A3_CfgMagazines_4Rnd_AAA_missiles_dns"; - count = 4; - }; - class 4Rnd_AAA_missiles_MI02: 4Rnd_AAA_missiles { - ammo = "M_Air_AA_MI02"; - }; - - class 4Rnd_GAA_missiles: VehicleMagazine { - scope = 2; - displayName = "$STR_A3_CfgMagazines_4Rnd_GAA_missiles0"; - displayNameShort = "$STR_A3_CfgMagazines_4Rnd_GAA_missiles_dns"; - count = 4; - ammo = "M_Zephyr"; - maxLeadSpeed = 950; - nameSound = "missiles"; - }; - - class 300Rnd_20mm_shells: VehicleMagazine { - scope = 2; - displayName = "$STR_A3_CfgMagazines_300Rnd_20mm_shells0"; - displayNameShort = "$STR_A3_CfgMagazines_300Rnd_20mm_shells_dns"; - ammo = "B_20mm"; - count = 300; - deflecting = 3; - maxLeadSpeed = 300; - tracersEvery = 5; - nameSound = "cannon"; - }; - class 1000Rnd_Gatling_30mm_Plane_CAS_01_F: VehicleMagazine { - scope = 2; - displayNameShort = ""; ammo = "ACE_Gatling_30mm_HE_Plane_CAS_01_Deploy"; count = 1170; - //count = 390; - //initSpeed = 3852; - maxLeadSpeed = 300; - nameSound = "cannon"; - tracersEvery = 1; - }; - - class 2Rnd_Missile_AA_04_F: VehicleMagazine { - scope = 2; - displayNameShort = "$STR_A3_CFGMAGAZINES_4RND_AAA_MISSILES_DNS"; - ammo = "Missile_AA_04_F"; - count = 2; - maxLeadSpeed = 220; - nameSound = "missiles"; - }; - class 6Rnd_Missile_AGM_02_F: VehicleMagazine { - scope = 2; - displayNameShort = "$STR_A3_CFGMAGAZINES_38RND_80MM_ROCKETS_DNS"; - ammo = "Missile_AGM_02_F"; - count = 6; - maxLeadSpeed = 450; - nameSound = "missiles"; - }; - class 2Rnd_Missile_AGM_02_F: VehicleMagazine { - scope = 2; - displayNameShort = "$STR_A3_CFGMAGAZINES_38RND_80MM_ROCKETS_DNS"; - ammo = "Missile_AGM_02_F"; - count = 2; - maxLeadSpeed = 450; - nameSound = "missiles"; - }; - - class 7Rnd_Rocket_04_HE_F: VehicleMagazine { - scope = 2; - displayNameShort = "$STR_A3_CFGMAGAZINES_40RND_20MM_G_BELT_DNS"; - ammo = "Rocket_04_HE_F"; - count = 7; - maxLeadSpeed = 200; - nameSound = "rockets"; - }; - class 7Rnd_Rocket_04_AP_F: 7Rnd_Rocket_04_HE_F { - displayNameShort = "$STR_A3_CFGMAGAZINES_TITAN_AP_DNS"; - ammo = "Rocket_04_AP_F"; - }; - - class 4Rnd_Bomb_04_F: VehicleMagazine { - scope = 2; - displayNameShort = "$STR_A3_CFGVEHICLES_BOMB0"; - ammo = "Bomb_04_F"; - count = 4; - maxLeadSpeed = 1000; - nameSound = "cannon"; - }; - - class 500Rnd_Cannon_30mm_Plane_CAS_02_F: 1000Rnd_Gatling_30mm_Plane_CAS_01_F { - displayNameShort = ""; - ammo = "Cannon_30mm_HE_Plane_CAS_02_F"; - count = 500; - }; - - class 2Rnd_Missile_AA_03_F: 2Rnd_Missile_AA_04_F { - displayNameShort = "$STR_A3_CFGMAGAZINES_4RND_AAA_MISSILES_DNS"; - ammo = "Missile_AA_03_F"; - count = 2; - }; - class 4Rnd_Missile_AGM_01_F: 6Rnd_Missile_AGM_02_F { - displayNameShort = "$STR_A3_CFGMAGAZINES_38RND_80MM_ROCKETS_DNS"; - ammo = "Missile_AGM_01_F"; - count = 4; - }; - - class 20Rnd_Rocket_03_HE_F: 7Rnd_Rocket_04_HE_F { - displayNameShort = "$STR_A3_CFGMAGAZINES_40RND_20MM_G_BELT_DNS"; - ammo = "Rocket_03_HE_F"; - count = 20; - }; - class 20Rnd_Rocket_03_AP_F: 7Rnd_Rocket_04_AP_F { - displayNameShort = "$STR_A3_CFGMAGAZINES_TITAN_AP_DNS"; - ammo = "Rocket_03_AP_F"; - count = 20; - }; - - class 2Rnd_Bomb_03_F: 4Rnd_Bomb_04_F { - displayNameShort = "$STR_A3_CFGVEHICLES_BOMB0"; - ammo = "Bomb_03_F"; - count = 2; }; + // an extended magazine for the comanche + class 300Rnd_20mm_shells; class ACE_500Rnd_20mm_shells_Comanche: 300Rnd_20mm_shells { - displayName = "20mm"; - displayNameShort = "20mm"; - ammo = "B_20mm"; count = 500; - deflecting = 3; - initSpeed = 1030; - maxLeadSpeed = 300; - tracersEvery = 5; }; }; From f358d099e62c96bddf7cc3346d62740c0c099b14 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 10:58:10 +0100 Subject: [PATCH 063/166] aircraft config cleanup --- addons/aircraft/CfgVehicles.hpp | 114 +++++++++++--------------------- 1 file changed, 38 insertions(+), 76 deletions(-) diff --git a/addons/aircraft/CfgVehicles.hpp b/addons/aircraft/CfgVehicles.hpp index bea27c85ff..5f419506c0 100644 --- a/addons/aircraft/CfgVehicles.hpp +++ b/addons/aircraft/CfgVehicles.hpp @@ -8,12 +8,9 @@ class CfgVehicles { class NewTurret { class Turrets; }; - class CargoTurret; }; - class Air: AllVehicles { - class AnimationSources; - }; + class Air: AllVehicles {}; class Helicopter: Air { class Turrets { @@ -33,6 +30,7 @@ class CfgVehicles { class Turrets: Turrets { class CopilotTurret; }; + class AnimationSources; }; class Helicopter_Base_H: Helicopter_Base_F { @@ -46,7 +44,7 @@ class CfgVehicles { lockDetectionSystem = 0; incomingMissileDetectionSystem = 16; driverCanEject = 1; - //class MFD {}; + class Turrets: Turrets { class CopilotTurret: CopilotTurret { canEject = 1; @@ -60,11 +58,6 @@ class CfgVehicles { class B_Heli_Light_01_F: Heli_Light_01_unarmed_base_F { /*class Turrets: Turrets { class CopilotTurret: CopilotTurret {}; - - class CargoTurret_01: CargoTurret {}; - class CargoTurret_02: CargoTurret_01 {}; - class CargoTurret_03: CargoTurret_02 {}; - class CargoTurret_04: CargoTurret_01 {}; };*/ }; @@ -72,7 +65,7 @@ class CfgVehicles { lockDetectionSystem = 0; incomingMissileDetectionSystem = 16; driverCanEject = 1; - //class MFD {}; + class Turrets: Turrets { class CopilotTurret: CopilotTurret { canEject = 1; @@ -86,7 +79,8 @@ class CfgVehicles { driverCanEject = 1; lockDetectionSystem = 12; incomingMissileDetectionSystem = 16; - magazines[] = {"2000Rnd_762x51_Belt_T_Green", "12Rnd_PG_missiles", "168Rnd_CMFlare_Chaff_Magazine"}; + magazines[] = {"2000Rnd_762x51_Belt_T_Green","12Rnd_PG_missiles","168Rnd_CMFlare_Chaff_Magazine"}; + class Turrets: Turrets { class CopilotTurret: CopilotTurret { canEject = 1; @@ -105,36 +99,7 @@ class CfgVehicles { lockDetectionSystem = 12; incomingMissileDetectionSystem = 16; driverCanEject = 1; - //class MFD {}; - class AnimationSources: AnimationSources { - class HitGlass1 { - source = "Hit"; - hitpoint = "HitGlass1"; - raw = 1; - }; - class HitGlass2: HitGlass1 { - hitpoint = "HitGlass2"; - }; - class HitGlass3: HitGlass1 { - hitpoint = "HitGlass3"; - }; - class HitGlass4: HitGlass1 { - hitpoint = "HitGlass4"; - }; - class Gatling { - source = "revolving"; - weapon = "ACE_gatling_20mm_Comanche"; - }; - class Hide { - source = "user"; - animPeriod = 0; - initPhase = 0; - }; - class Muzzle_flash { - source = "ammorandom"; - weapon = "ACE_gatling_20mm_Comanche"; - }; - }; + class Turrets: Turrets { class MainTurret: MainTurret { canEject = 1; @@ -143,6 +108,15 @@ class CfgVehicles { magazines[] = {"ACE_500Rnd_20mm_shells_Comanche","4Rnd_AAA_missiles","24Rnd_PG_missiles"}; }; }; + + class AnimationSources: AnimationSources { + class Gatling { + weapon = "ACE_gatling_20mm_Comanche"; + }; + class Muzzle_flash { + weapon = "ACE_gatling_20mm_Comanche"; + }; + }; }; class B_Heli_Attack_01_F: Heli_Attack_01_base_F {}; @@ -151,6 +125,7 @@ class CfgVehicles { lockDetectionSystem = 12; incomingMissileDetectionSystem = 16; driverCanEject = 1; + class Turrets: Turrets { class MainTurret: MainTurret { canEject = 1; @@ -162,6 +137,7 @@ class CfgVehicles { lockDetectionSystem = 12; incomingMissileDetectionSystem = 16; driverCanEject = 1; + class Turrets: Turrets { class CopilotTurret: CopilotTurret { canEject = 1; @@ -176,6 +152,7 @@ class CfgVehicles { canEject = 1; }; }; + /*class UserActions { class DoorL1_Open { available = 1; @@ -197,16 +174,14 @@ class CfgVehicles { lockDetectionSystem = 12; incomingMissileDetectionSystem = 16; driverCanEject = 1; - //class MFD {}; + class Turrets: Turrets { class CopilotTurret: CopilotTurret { canEject = 1; showHMD = 1; }; - - class CargoTurret_01: CargoTurret {}; - class CargoTurret_02: CargoTurret_01 {}; }; + /*class UserActions: UserActions { class DoorL1_Open { available = 1; @@ -248,9 +223,9 @@ class CfgVehicles { lockDetectionSystem = 0; incomingMissileDetectionSystem = 16; driverCanEject = 1; - //class MFD {}; weapons[] = {"M134_minigun","missiles_DAR","CMFlareLauncher"}; magazines[] = {"5000Rnd_762x51_Yellow_Belt","24Rnd_missiles","168Rnd_CMFlare_Chaff_Magazine"}; + class Turrets: Turrets { class MainTurret: MainTurret { canEject = 1; @@ -270,36 +245,37 @@ class CfgVehicles { class I_Heli_light_03_F: I_Heli_light_03_base_F { class Turrets: Turrets { class MainTurret: MainTurret {}; - - class CargoTurret_01: CargoTurret {}; - class CargoTurret_02: CargoTurret_01 {}; }; }; - class I_Heli_light_03_unarmed_base_F: I_Heli_light_03_base_F { - //class MFD {}; - }; + class I_Heli_light_03_unarmed_base_F: I_Heli_light_03_base_F {}; + class I_Heli_light_03_unarmed_F: I_Heli_light_03_unarmed_base_F {}; class Plane_CAS_01_base_F: Plane_Base_F { lockDetectionSystem = 12; incomingMissileDetectionSystem = 16; - //class MFD {}; + class Turrets; + #include }; class Plane_CAS_02_base_F: Plane_Base_F { lockDetectionSystem = 12; incomingMissileDetectionSystem = 16; + class Turrets; + #include }; class Plane_Fighter_03_base_F: Plane_Base_F { lockDetectionSystem = 12; incomingMissileDetectionSystem = 16; + class Turrets; + #include }; @@ -310,34 +286,34 @@ class CfgVehicles { }; class UAV_02_base_F: UAV { + weapons[] = {}; + magazines[] = {}; + class Turrets { class MainTurret; }; - weapons[] = {}; - magazines[] = {}; }; class UAV_02_CAS_base_F: UAV_02_base_F { + weapons[] = {}; + magazines[] = {}; + /*class Turrets: Turrets { class MainTurret: MainTurret {}; };*/ - weapons[] = {}; - magazines[] = {}; }; class B_Heli_Transport_03_base_F: Helicopter_Base_H { lockDetectionSystem = 12; incomingMissileDetectionSystem = 16; driverCanEject = 1; + class Turrets: Turrets { class CopilotTurret: CopilotTurret { canEject = 1; }; //class MainTurret: MainTurret {}; class RightDoorGun: MainTurret {}; - - class CargoTurret_01: CargoTurret {}; - class CargoTurret_02: CargoTurret_01 {}; }; }; @@ -348,9 +324,6 @@ class CfgVehicles { }; //class MainTurret: MainTurret {}; //class RightDoorGun: MainTurret {}; - - //class CargoTurret_01: CargoTurret {}; - //class CargoTurret_02: CargoTurret_01 {}; }; }; @@ -358,6 +331,7 @@ class CfgVehicles { lockDetectionSystem = 12; incomingMissileDetectionSystem = 16; driverCanEject = 1; + class Turrets: Turrets { class CopilotTurret: CopilotTurret { canEject = 1; @@ -376,15 +350,6 @@ class CfgVehicles { class LoadmasterTurret: LoadmasterTurret { canEject = 1; }; - - class CargoTurret_01: CargoTurret {}; - class CargoTurret_02: CargoTurret_01 {}; - class CargoTurret_03: CargoTurret_01 {}; - class CargoTurret_04: CargoTurret_01 {}; - class CargoTurret_05: CargoTurret_01 {}; - class CargoTurret_06: CargoTurret_05 {}; - class CargoTurret_07: CargoTurret_05 {}; - class CargoTurret_08: CargoTurret_05 {}; }; }; @@ -396,9 +361,6 @@ class CfgVehicles { class LoadmasterTurret: LoadmasterTurret { canEject = 1; }; - - class CargoTurret_01: CargoTurret {}; - class CargoTurret_02: CargoTurret_01 {}; }; }; }; From 075556c233bf32a893830582571dec35178a66c6 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 11:36:54 +0100 Subject: [PATCH 064/166] author aircraft --- addons/aircraft/config.cpp | 2 +- addons/aircraft/config/config.cpp | 13 ------------- addons/aircraft/config/script_component.hpp | 1 - 3 files changed, 1 insertion(+), 15 deletions(-) delete mode 100644 addons/aircraft/config/config.cpp delete mode 100644 addons/aircraft/config/script_component.hpp diff --git a/addons/aircraft/config.cpp b/addons/aircraft/config.cpp index 93e4eb8efe..86135c4bc9 100644 --- a/addons/aircraft/config.cpp +++ b/addons/aircraft/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; - author[] = {"KoffeinFlummi","Crusty"}; + author[] = {"KoffeinFlummi","Crusty","commy2"}; authorUrl = "https://github.com/KoffeinFlummi/"; VERSION_CONFIG; }; diff --git a/addons/aircraft/config/config.cpp b/addons/aircraft/config/config.cpp deleted file mode 100644 index 7ac4cf3bad..0000000000 --- a/addons/aircraft/config/config.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class DOUBLES(ADDON,heli1) { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {QUOTE(ADDON)}; - author[] = {"commy2"}; - authorUrl = "https://github.com/commy2/"; - VERSION_CONFIG; - }; -}; diff --git a/addons/aircraft/config/script_component.hpp b/addons/aircraft/config/script_component.hpp deleted file mode 100644 index 7368add67c..0000000000 --- a/addons/aircraft/config/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\aircraft\script_component.hpp" \ No newline at end of file From 57f8595e9ccdc8f1afa05b13cea71b41832bfde5 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 12:47:33 +0100 Subject: [PATCH 065/166] clean up aircraft weapons config --- addons/aircraft/CfgWeapons.hpp | 192 ++++++-------------------------- addons/aircraft/stringtable.xml | 14 ++- 2 files changed, 49 insertions(+), 157 deletions(-) diff --git a/addons/aircraft/CfgWeapons.hpp b/addons/aircraft/CfgWeapons.hpp index 321df4a3af..c5f22fc3a2 100644 --- a/addons/aircraft/CfgWeapons.hpp +++ b/addons/aircraft/CfgWeapons.hpp @@ -4,15 +4,10 @@ class Mode_Burst; class Mode_FullAuto; class CfgWeapons { - class MGunCore; - class MGun: MGunCore {}; - - class LMG_RCWS: MGun {}; - // Manual Switching Of Flare Mode class SmokeLauncher; class CMFlareLauncher: SmokeLauncher { - modes[] = {"Single", "Burst", "AIBurst"}; + modes[] = {"Single","Burst","AIBurst"}; class Single: Mode_SemiAuto { reloadTime = 0.1; }; @@ -21,13 +16,15 @@ class CfgWeapons { }; }; + // bigger mag for comanche class CannonCore; class gatling_20mm: CannonCore { - magazines[] = {"2000Rnd_20mm_shells","1000Rnd_20mm_shells","300Rnd_20mm_shells","ACE_500Rnd_20mm_shells_Comanche"}; + magazines[] += {"ACE_500Rnd_20mm_shells_Comanche"}; + // buff gatling rof class manual: CannonCore { - reloadTime = 0.023; - dispersion = 0.006; + reloadTime = 0.023; //0.04; + dispersion = 0.006; //0.0022; }; class close: manual {}; class short: close {}; @@ -36,21 +33,14 @@ class CfgWeapons { }; class ACE_gatling_20mm_Comanche: gatling_20mm { - displayName = "XM301"; - class close: close { - reloadTime = 0.04; - dispersion = 0.0022; - }; - class far: far { - reloadTime = 0.04; - dispersion = 0.0022; - }; + displayName = "$STR_ACE_Aircraft_gatling_20mm_Name"; + class manual: manual { reloadTime = 0.04; dispersion = 0.0022; - displayName = "XM301"; + displayName = "$STR_ACE_Aircraft_gatling_20mm_Name"; }; - class medium: medium { + class close: close { reloadTime = 0.04; dispersion = 0.0022; }; @@ -58,38 +48,53 @@ class CfgWeapons { reloadTime = 0.04; dispersion = 0.0022; }; + class medium: medium { + reloadTime = 0.04; + dispersion = 0.0022; + }; + class far: far { + reloadTime = 0.04; + dispersion = 0.0022; + }; }; + // buff gatling rof + class MGunCore; + class MGun: MGunCore {}; + + class LMG_RCWS: MGun {}; + class LMG_Minigun: LMG_RCWS { - magazines[] = {"1000Rnd_65x39_Belt","1000Rnd_65x39_Belt_Green","1000Rnd_65x39_Belt_Tracer_Green","1000Rnd_65x39_Belt_Tracer_Red","1000Rnd_65x39_Belt_Tracer_Yellow","1000Rnd_65x39_Belt_Yellow","2000Rnd_65x39_Belt","2000Rnd_65x39_Belt_Green","2000Rnd_65x39_Belt_Tracer_Green","2000Rnd_65x39_Belt_Tracer_Green_Splash","2000Rnd_65x39_Belt_Tracer_Red","2000Rnd_65x39_Belt_Tracer_Yellow","2000Rnd_65x39_Belt_Tracer_Yellow_Splash","2000Rnd_65x39_Belt_Yellow","2000Rnd_762x51_Belt_T_Green","2000Rnd_762x51_Belt_T_Red","2000Rnd_762x51_Belt_T_Yellow","200Rnd_65x39_Belt","200Rnd_65x39_Belt_Tracer_Green","200Rnd_65x39_Belt_Tracer_Red","200Rnd_65x39_Belt_Tracer_Yellow","5000Rnd_762x51_Belt","5000Rnd_762x51_Yellow_Belt"}; class manual: MGun { - reloadTime = 0.015; - dispersion = 0.006; + reloadTime = 0.075; //0.015; + dispersion = 0.00093; //0.006; }; class close: manual {}; class short: close {}; class medium: close {}; class far: close {}; }; + class LMG_Minigun_heli: LMG_Minigun { showAimCursorInternal = 0; class manual: manual { - reloadTime = 0.015; - dispersion = 0.006; + reloadTime = 0.015; //0.033; Note: This is a way to fast ROF (requires over 60 FPS) @todo + dispersion = 0.006; //0.0087; }; class close: manual {}; class short: close {}; class medium: close {}; class far: close {}; }; + class M134_minigun: MGunCore { class LowROF: Mode_FullAuto { - reloadTime = 0.015; - dispersion = 0.006; + reloadTime = 0.015; //0.03; same as above @todo + dispersion = 0.006; //0.0023; }; class HighROF: LowROF { - reloadTime = 0.015; - dispersion = 0.006; + reloadTime = 0.015; //0.03; + dispersion = 0.006; //0.0023; }; class close: HighROF {}; class short: close {}; @@ -100,19 +105,10 @@ class CfgWeapons { class Gatling_30mm_Plane_CAS_01_F: CannonCore { autoFire = 1; burst = 1; - reloadTime = 0.0154; class LowROF: Mode_FullAuto { autoFire = 0; - //burst = 65; - burst = 22; - //reloadTime = 0.0154; - reloadTime = 0.0462; - //sound[] = {"A3\Sounds_F_epc\weapons\cas_02_cannon",1.77828,1,3800}; - sound[] = {"A3\Sounds_F_EPC\Weapons\gau_03_burst",2.51189,1,4500,{25704,32159}}; - weaponSoundEffect = "DefaultRifle"; - dispersion = 0.005; - soundContinuous = 1; - textureType = "burst"; + burst = 22; //65; + reloadTime = 0.0462; //0.0154; //0.034; multiplier = 3; }; class close: LowROF {}; @@ -121,120 +117,4 @@ class CfgWeapons { class medium: close {}; class far: close {}; }; - - class RocketPods; - class Missile_AA_04_Plane_CAS_01_F: RocketPods { - holdsterAnimValue = 2; - aiRateOfFire = 5; - aiRateOfFireDistance = 500; - autoFire = 0; - cursor = "EmptyCursor"; - cursorAim = "missile"; - nameSound = "MissileLauncher"; - textureType = "fullAuto"; - weaponLockDelay = 3; - minRange = 300; - minRangeProbab = 0.25; - midRange = 2500; - midRangeProbab = 0.9; - maxRange = 9000; - maxRangeProbab = 0.01; - }; - - class MissileLauncher; - class Missile_AGM_02_Plane_CAS_01_F: MissileLauncher { - holdsterAnimValue = 3; - magazineReloadTime = 30; - reloadTime = 0.001; - textureType = "semi"; - weaponLockDelay = 3; - weaponSoundEffect = "DefaultRifle"; - }; - - class Rocket_04_HE_Plane_CAS_01_F: RocketPods { - holdsterAnimValue = 4; - canLock = 1; - modes[] = {"Far_AI","Medium_AI","Close_AI","Burst"}; - weaponLockDelay = 0; - class Far_AI: RocketPods { - canLock = 1; - weaponLockDelay = 0; - showToPlayer = 0; - minRange = 800; - minRangeProbab = 0.31; - midRange = 2500; - midRangeProbab = 0.71; - maxRange = 3200; - maxRangeProbab = 0.1; - burst = 1; - reloadTime = 0.001; - autoFire = 0; - aiRateOfFire = 5; - aiRateOfFireDistance = 500; - }; - class Medium_AI: Far_AI {}; - class Close_AI: Far_AI {}; - class Burst: RocketPods { - burst = 1; - reloadTime = 0.002; - minRange = 300; - minRangeProbab = 0.25; - midRange = 400; - midRangeProbab = 0.7; - maxRange = 1300; - maxRangeProbab = 0.1; - aiRateOfFire = 5; - aiRateOfFireDistance = 500; - autoFire = 0; - soundContinuous = 0; - textureType = "fullAuto"; - weaponSoundEffect = "DefaultRifle"; - }; - }; - - class Rocket_04_AP_Plane_CAS_01_F: Rocket_04_HE_Plane_CAS_01_F { - holdsterAnimValue = 5; - }; - - class Bomb_04_Plane_CAS_01_F: RocketPods { - holdsterAnimValue = 6; - aiRateOfFire = 5; - aiRateOfFireDistance = 500; - missileLockCone = 180; - nameSound = ""; - textureType = "fullAuto"; - weaponLockDelay = 1; - }; - - class Cannon_30mm_Plane_CAS_02_F: CannonCore { - scope = 1; - holdsterAnimValue = 1; - ballisticsComputer = 2; - canLock = 1; - modes[] = {"LowROF","close","near","short","medium","far"}; - nameSound = "cannon"; - shotFromTurret = 0; - muzzlePos = "Cannon_muzzleflash"; - muzzleEnd = "Cannon_barrel_end"; - selectionFireAnim = "Cannon_muzzleflash"; - autoFire = 1; - burst = 5; - reloadTime = 0.04; - class GunParticles { - class Effect { - effectName = "MachineGun2"; - positionName = "Cannon_barrel_start"; - directionName = "Cannon_barrel_end"; - }; - }; - class LowROF: Mode_FullAuto { - dispersion = 0.0055; - reloadTime = 0.04; - }; - class close: LowROF {}; - class near: close {}; - class short: close {}; - class medium: close {}; - class far: close {}; - }; }; diff --git a/addons/aircraft/stringtable.xml b/addons/aircraft/stringtable.xml index da013cac5e..4d1c49fff6 100644 --- a/addons/aircraft/stringtable.xml +++ b/addons/aircraft/stringtable.xml @@ -14,6 +14,18 @@ Rajada Raffica + + XM301 + XM301 + XM301 + XM301 + XM301 + XM301 + XM301 + XM301 + XM301 + XM301 + Open Cargo Door Laderampe öffnen @@ -35,4 +47,4 @@ Закрыть грузовой отсек - \ No newline at end of file + From 155503d4a105ee5c2b64deb05da5467d194cd821 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 14 Feb 2015 20:06:55 +0100 Subject: [PATCH 066/166] Merged GUI into common. Removed unnecessary GUI functions. Updated displayIcon function to be more dynamic Added client side settings for displaying icons. --- addons/common/HintConfig.hpp | 96 ++++++++++ addons/common/ProgressScreen.hpp | 3 - addons/common/XEH_preInit.sqf | 2 + addons/common/config.cpp | 10 + addons/{gui/UI => common}/define.hpp | 12 +- .../functions/fnc_blurScreen.sqf | 2 +- addons/common/functions/fnc_displayIcon.sqf | 111 +++++++++++ .../functions/fnc_displayInformation.sqf | 4 +- .../functions/fnc_displayMessage.sqf | 5 +- addons/common/functions/fnc_progressBar.sqf | 4 +- .../fnc_sendDisplayInformationTo.sqf | 2 +- .../functions/fnc_sendDisplayMessageTo.sqf | 2 +- addons/common/stringtable.xml | 6 + addons/gui/CfgEventHandlers.hpp | 11 -- addons/gui/GUI.hpp | 2 - addons/gui/README.md | 11 -- addons/gui/UI/RscTitles.hpp | 179 ------------------ addons/gui/XEH_postInit.sqf | 11 -- addons/gui/XEH_preInit.sqf | 25 --- addons/gui/config.cpp | 27 --- addons/gui/data/buttonDisabled.paa | Bin 1564 -> 0 bytes addons/gui/data/buttonDisabled_gradient.paa | Bin 1816 -> 0 bytes addons/gui/data/buttonNormal.paa | Bin 1564 -> 0 bytes addons/gui/data/buttonNormal_gradient.paa | Bin 1989 -> 0 bytes addons/gui/data/buttonNormal_gradient2.paa | Bin 2035 -> 0 bytes addons/gui/data/buttonNormal_gradient3.paa | Bin 2044 -> 0 bytes addons/gui/data/buttonNormal_gradient_top.paa | Bin 1995 -> 0 bytes .../gui/data/buttonNormal_gradient_top_w.paa | Bin 1856 -> 0 bytes addons/gui/empty.hpp | 21 -- addons/gui/functions/fnc_displayIcon.sqf | 79 -------- addons/gui/functions/fnc_loadingbar.sqf | 64 ------- addons/gui/functions/fnc_sendHintTo.sqf | 26 --- addons/gui/functions/fnc_sendMessageTo.sqf | 31 --- addons/gui/functions/script_component.hpp | 12 -- addons/gui/script_component.hpp | 12 -- addons/gui/stringtable.xml | 7 - addons/medical/config.cpp | 2 +- .../fnc_ActionCheckBloodPressureLocal.sqf | 2 +- .../functions/fnc_ActionCheckPulse.sqf | 6 +- .../fnc_ActioncheckBloodPressure.sqf | 6 +- .../medical/functions/fnc_actionCarryUnit.sqf | 4 +- .../functions/fnc_actionCheckPulseLocal.sqf | 2 +- .../functions/fnc_actionCheckResponse.sqf | 8 +- .../medical/functions/fnc_actionDragUnit.sqf | 4 +- .../functions/fnc_actionRemoveTourniquet.sqf | 4 +- addons/medical/functions/fnc_handleHeal.sqf | 2 +- ...fnc_handleTreatment_Action_AirwayLocal.sqf | 2 +- ...nc_handleTreatment_Action_BandageLocal.sqf | 2 +- .../fnc_handleTreatment_Action_CPR.sqf | 4 +- .../fnc_handleTreatment_Action_Stitching.sqf | 10 +- .../fnc_handleTreatment_Action_fullHeal.sqf | 8 +- .../fnc_handleTreatment_Category_Advanced.sqf | 6 +- .../fnc_handleTreatment_Category_Airway.sqf | 6 +- ...fnc_handleTreatment_Category_Bandaging.sqf | 8 +- ...nc_handleTreatment_Category_Medication.sqf | 6 +- .../functions/fnc_initalizeModuleCMS.sqf | 2 +- .../fnc_moduleAssignMedicalEquipment.sqf | 1 - .../functions/fnc_onTreatmentCompleted.sqf | 2 +- addons/medical/ui/define.hpp | 2 +- addons/medical/ui/menu.hpp | 4 +- 60 files changed, 292 insertions(+), 588 deletions(-) rename addons/{gui/UI => common}/define.hpp (97%) rename addons/{gui => common}/functions/fnc_blurScreen.sqf (99%) create mode 100644 addons/common/functions/fnc_displayIcon.sqf rename addons/{gui => common}/functions/fnc_displayInformation.sqf (92%) rename addons/{gui => common}/functions/fnc_displayMessage.sqf (85%) rename addons/{gui => common}/functions/fnc_sendDisplayInformationTo.sqf (95%) rename addons/{gui => common}/functions/fnc_sendDisplayMessageTo.sqf (95%) delete mode 100644 addons/gui/CfgEventHandlers.hpp delete mode 100644 addons/gui/GUI.hpp delete mode 100644 addons/gui/README.md delete mode 100644 addons/gui/UI/RscTitles.hpp delete mode 100644 addons/gui/XEH_postInit.sqf delete mode 100644 addons/gui/XEH_preInit.sqf delete mode 100644 addons/gui/config.cpp delete mode 100644 addons/gui/data/buttonDisabled.paa delete mode 100644 addons/gui/data/buttonDisabled_gradient.paa delete mode 100644 addons/gui/data/buttonNormal.paa delete mode 100644 addons/gui/data/buttonNormal_gradient.paa delete mode 100644 addons/gui/data/buttonNormal_gradient2.paa delete mode 100644 addons/gui/data/buttonNormal_gradient3.paa delete mode 100644 addons/gui/data/buttonNormal_gradient_top.paa delete mode 100644 addons/gui/data/buttonNormal_gradient_top_w.paa delete mode 100644 addons/gui/empty.hpp delete mode 100644 addons/gui/functions/fnc_displayIcon.sqf delete mode 100644 addons/gui/functions/fnc_loadingbar.sqf delete mode 100644 addons/gui/functions/fnc_sendHintTo.sqf delete mode 100644 addons/gui/functions/fnc_sendMessageTo.sqf delete mode 100644 addons/gui/functions/script_component.hpp delete mode 100644 addons/gui/script_component.hpp delete mode 100644 addons/gui/stringtable.xml diff --git a/addons/common/HintConfig.hpp b/addons/common/HintConfig.hpp index 3e3493a8ba..8c8dc38abb 100644 --- a/addons/common/HintConfig.hpp +++ b/addons/common/HintConfig.hpp @@ -52,6 +52,102 @@ class RscTitles { }; }; }; + class ACE_RscDisplayMessage { + duration = 7; + idd = 86411; + movingenable = 0; + onLoad = "uiNamespace setVariable ['ACE_RscDisplayMessage', _this select 0];" + fadein = 0; + class controlsBackground { + class header: ACE_gui_staticBase { + idc = 1; + type = CT_STATIC; + x = "safezoneX + (safezoneW / 10)"; + y = "safezoneY + (30 * (safeZoneH / 40))"; + w = "(safeZoneW / 10)"; + h = "(safeZoneH / 40)"; + style = ST_LEFT; + font = FontCSE; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + colorText[] = {0.85, 0.85, 0.85, 1.0}; + colorBackground[] = {0, 0, 0, 0.9}; + text = ""; + }; + class text: header { + idc = 2; + y = "safezoneY + (31 * (safeZoneH / 40))"; + w = "(safeZoneW / 10) * 1.3"; + colorText[] = {0.0, 0.0, 0.0, 1.0}; + colorBackground[] = {1, 1, 1, 0.9}; + text = ""; + }; + }; + }; + + class ACE_RscDisplayInformation { + duration = 15; + idd = 86412; + movingenable = 0; + onLoad = "uiNamespace setVariable ['ACE_RscDisplayInformation', _this select 0];" + fadein = 0; + class controlsBackground { + class header: ACE_gui_staticBase { + idc = 1; + type = CT_STATIC; + x = "safezoneX + (safezoneW / 10)"; + y = "safezoneY + (6 * (safeZoneH / 40))"; + w = "(safeZoneW / 10)"; + h = "(safeZoneH / 40)"; + style = ST_LEFT; + font = FontCSE; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + colorText[] = {0.85, 0.85, 0.85, 1.0}; + colorBackground[] = {0, 0, 0, 0.9}; + text = ""; + }; + class text: header { + idc = 2; + y = "safezoneY + (7.1 * (safeZoneH / 40))"; + w = "(safeZoneW / 10) * 1.3"; + colorText[] = {0.0, 0.0, 0.0, 1.0}; + colorBackground[] = {1, 1, 1, 0.9}; + text = ""; + }; + class text2: text { + idc = 3; + y = "safezoneY + (8.2 * (safeZoneH / 40))"; + }; + class text3: text { + idc = 4; + y = "safezoneY + (9.3 * (safeZoneH / 40))"; + }; + class text4: text { + idc = 5; + y = "safezoneY + (10.4 * (safeZoneH / 40))"; + }; + class text5: text { + idc = 6; + y = "safezoneY + (11.5 * (safeZoneH / 40))"; + }; + + + class icon: ACE_gui_backgroundBase { + type = CT_STATIC; + idc = 10; + style = ST_PICTURE; + colorBackground[] = {0,0,0,1}; + colorText[] = {1, 1, 1, 1}; + font = FontCSE; + text = ""; + sizeEx = 0.032; + x = "safezoneX + (safezoneW / 10)"; + y = "safezoneY + (4 * (safeZoneH / 40))"; + w = "(safeZoneH / 40)*2"; + h = "(safeZoneH / 40)*2"; + }; + }; + }; + class ACE_EventHandlerHelper: ACE_Rsc_Display_Base { idd = -1; class controls { diff --git a/addons/common/ProgressScreen.hpp b/addons/common/ProgressScreen.hpp index 31184f00f4..d7df49efdf 100644 --- a/addons/common/ProgressScreen.hpp +++ b/addons/common/ProgressScreen.hpp @@ -1,6 +1,3 @@ -class ACE_gui_RscProgress; -class ACE_gui_staticBase; - class GVAR(ProgressBar_Dialog) { idd = -1; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 64a06a0f8c..079d0cf686 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -16,6 +16,7 @@ PREP(adminKick); PREP(ambientBrightness); PREP(applyForceWalkStatus); PREP(binarizeNumber); +PREP(blurScreen); PREP(callCustomEventHandlers); PREP(callCustomEventHandlersGlobal); PREP(canGetInPosition); @@ -31,6 +32,7 @@ PREP(convertKeyCode); PREP(createOrthonormalReference); PREP(currentChannel); PREP(disableUserInput); +PREP(displayIcon); PREP(displayText); PREP(displayTextPicture); PREP(displayTextStructured); diff --git a/addons/common/config.cpp b/addons/common/config.cpp index 84052cbdfb..b1c479b54f 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -94,8 +94,18 @@ class ACE_Settings { isClientSetable = 1; displayName = "$STR_ACE_Common_EnableNumberHotkeys"; }; + class GVAR(settingFeedbackIcons) { + value = 1; + typeName = "SCALAR"; + force = 0; + isClientSetable = 1; + displayName = "$STR_ACE_Common_SettingFeedbackIconsName"; + description = "$STR_ACE_Common_SettingFeedbackIconsDesc"; + values[] = {"Hide", "Top right, downwards", "Top right, to the left", "Top left, downwards", "Top left, to the right"}; + }; }; +#include "define.hpp" #include #include #include diff --git a/addons/gui/UI/define.hpp b/addons/common/define.hpp similarity index 97% rename from addons/gui/UI/define.hpp rename to addons/common/define.hpp index 13ce7d8a3e..f1cc009864 100644 --- a/addons/gui/UI/define.hpp +++ b/addons/common/define.hpp @@ -182,12 +182,12 @@ class ACE_gui_buttonBase { bottom = 0.00; }; textureNoShortcut = ""; - animTextureNormal = QUOTE( PATHTOF(data\buttonNormal_gradient_top.paa) ); - animTextureDisabled = QUOTE( PATHTOF(data\buttonDisabled_gradient.paa)); - animTextureOver = QUOTE( PATHTOF(data\buttonNormal_gradient_top.paa)); - animTextureFocused = QUOTE( PATHTOF(data\buttonNormal_gradient_top.paa)); - animTexturePressed = QUOTE( PATHTOF(data\buttonNormal_gradient_top.paa)); - animTextureDefault = QUOTE( PATHTOF(data\buttonNormal_gradient_top.paa)); + animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; + animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.8)"; + animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; + animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; period = 0.5; font = FontCSE; soundClick[] = {"\A3\ui_f\data\sound\RscButton\soundClick",0.09,1}; diff --git a/addons/gui/functions/fnc_blurScreen.sqf b/addons/common/functions/fnc_blurScreen.sqf similarity index 99% rename from addons/gui/functions/fnc_blurScreen.sqf rename to addons/common/functions/fnc_blurScreen.sqf index 1cde214587..c3d101a37e 100644 --- a/addons/gui/functions/fnc_blurScreen.sqf +++ b/addons/common/functions/fnc_blurScreen.sqf @@ -39,4 +39,4 @@ if (_show) then { GVAR(MENU_ppHandle_GUI_BLUR_SCREEN) = nil; }; }; -}; \ No newline at end of file +}; diff --git a/addons/common/functions/fnc_displayIcon.sqf b/addons/common/functions/fnc_displayIcon.sqf new file mode 100644 index 0000000000..94fa887da9 --- /dev/null +++ b/addons/common/functions/fnc_displayIcon.sqf @@ -0,0 +1,111 @@ +/** + * fn_gui_displayIcon.sqf + * @Descr: + * @Author: Glowbal + * + * @Arguments: [] + * @Return: + * @PublicAPI: true + * + * @Example ["myID", true, QUOTE(PATHTOF(data\icon_group.paa)), [1,1,1,1], 0] call ace_gui_fnc_displayIcon; + */ + +#include "script_component.hpp" + +// positions for the icon UI +#define RIGHT_SIDE (safezoneW + safezoneX) +#define LEFT_SIDE safezoneX +#define TOP_SIDE safeZoneY +#define BOTTOM_SIDE (safeZoneH + safezoneY) +#define ICON_WIDTH (2 * (((safezoneW / safezoneH) min 1.2) / 40)) +#define X_POS_ICONS (RIGHT_SIDE - (1.5 * ICON_WIDTH)) +#define Y_POS_ICONS (TOP_SIDE + (2.5 * ICON_WIDTH)) +#define DIFFERENCE_ICONS (1.1 * ICON_WIDTH) +#define X_POS_ICONS_SECOND (RIGHT_SIDE - (4.4 * ICON_WIDTH)) +#define Y_POS_ICONS_SECOND (TOP_SIDE + (1.1 * ICON_WIDTH)) + +// setting values +#define TOP_RIGHT_DOWN 1 +#define TOP_RIGHT_LEFT 2 +#define TOP_LEFT_DOWN 3 +#define TOP_LEFT_RIGHT 4 + +// other constants +#define DEFAULT_TIME 6 + +private ["_iconId", "_show", "_icon", "_allControls", "_refresh", "_timeAlive", "_list", "_color"]; +_iconId = _this select 0; +_show = _this select 1; +_icon = _this select 2; +_color = _this select 3; +_timeAlive = if (count _this > 4) then {_this select 4} else {DEFAULT_TIME}; + +disableSerialization; +_list = missionNamespace getvariable [QGVAR(displayIconList),[]]; + +_refresh = { + private ["_allControls"]; + // Refreshing of all icons.. + _allControls = missionNamespace getvariable [QGVAR(displayIconListControls), []]; + { + ctrlDelete _x; + }foreach _allControls; + + _allControls = []; + + private ["_ctrl", "_setting"]; + _setting = missionNamespace getvariable[QGVAR(settingFeedbackIcons), 0]; + if (_setting > 0) then { + { + // +19000 because we want to make certain we are using free IDCs.. + _ctrl = ((findDisplay 46) ctrlCreate ["RscPicture", _foreachIndex + 19000]); + _position = switch (_setting) do { + case TOP_RIGHT_DOWN: {[X_POS_ICONS, Y_POS_ICONS + (_foreachIndex * DIFFERENCE_ICONS), ICON_WIDTH, ICON_WIDTH]}; + case TOP_RIGHT_LEFT: {[X_POS_ICONS_SECOND - ((_foreachIndex+3) * DIFFERENCE_ICONS), Y_POS_ICONS_SECOND - (ICON_WIDTH / 2), ICON_WIDTH, ICON_WIDTH]}; + case TOP_LEFT_DOWN: {[LEFT_SIDE + (0.5 * ICON_WIDTH), Y_POS_ICONS + (_foreachIndex * DIFFERENCE_ICONS), ICON_WIDTH, ICON_WIDTH]}; + case TOP_LEFT_RIGHT: {[LEFT_SIDE + (0.5 * ICON_WIDTH) - ((_foreachIndex+3) * DIFFERENCE_ICONS), Y_POS_ICONS_SECOND, ICON_WIDTH, ICON_WIDTH]}; + default {[X_POS_ICONS, Y_POS_ICONS + (_foreachIndex * DIFFERENCE_ICONS), ICON_WIDTH, ICON_WIDTH]}; + }; + _ctrl ctrlSetPosition _position; + _ctrl ctrlsetText (_x select 1); + _ctrl ctrlSetTextColor (_x select 2); + _ctrl ctrlCommit 0; + _allControls pushback _ctrl; + }foreach (missionNamespace getvariable [QGVAR(displayIconList),[]]); + }; + missionNamespace setvariable [QGVAR(displayIconListControls), _allControls]; +}; + +if (_show) then { + if ({(_x select 0 == _iconId)} count _list == 0) then { + _list pushback [_iconId, _icon, _color, time]; + } else { + { + if (_x select 0 == _iconId) exitwith { + _list set [_foreachIndex, [_iconId, _icon, _color, time]]; + }; + }foreach _list; + }; + missionNamespace setvariable [QGVAR(displayIconList), _list]; + call _refresh; + + if (_timeAlive >= 0) then { + [{ + [_this select 0, false, "", [0,0,0], 0] call FUNC(displayIcon); + }, [_iconId], _timeAlive, _timeAlive] call EFUNC(common,waitAndExecute); + }; + +} else { + if ({(_x select 0 == _iconId)} count _list == 1) then { + private "_newList"; + _newList = []; + { + if (_x select 0 != _iconId) then { + _newList pushback _x; + }; + }foreach _list; + + missionNamespace setvariable [QGVAR(displayIconList), _newList]; + call _refresh; + }; +}; diff --git a/addons/gui/functions/fnc_displayInformation.sqf b/addons/common/functions/fnc_displayInformation.sqf similarity index 92% rename from addons/gui/functions/fnc_displayInformation.sqf rename to addons/common/functions/fnc_displayInformation.sqf index c4eb96984b..64a27b0e40 100644 --- a/addons/gui/functions/fnc_displayInformation.sqf +++ b/addons/common/functions/fnc_displayInformation.sqf @@ -19,10 +19,10 @@ _type = [_this, 2, 0, [0]] call BIS_fnc_Param; _icon = [_this, 3, "",[""]] call BIS_fnc_Param; if (_title != "") then { - DISPLAY_LAYER cutRsc [QGVAR(RSC_DISPLAY_INFORMATION),"PLAIN"]; + DISPLAY_LAYER cutRsc ['ACE_RscDisplayInformation',"PLAIN"]; disableSerialization; - _display = uiNamespace getvariable QGVAR(RSC_DISPLAY_INFORMATION); + _display = uiNamespace getvariable 'ACE_RscDisplayInformation'; if (!isnil "_display") then { _headerCtrl = _display displayCtrl 1; _headerCtrl ctrlSetText _title; diff --git a/addons/gui/functions/fnc_displayMessage.sqf b/addons/common/functions/fnc_displayMessage.sqf similarity index 85% rename from addons/gui/functions/fnc_displayMessage.sqf rename to addons/common/functions/fnc_displayMessage.sqf index 3dceab2638..317de8b240 100644 --- a/addons/gui/functions/fnc_displayMessage.sqf +++ b/addons/common/functions/fnc_displayMessage.sqf @@ -18,10 +18,10 @@ _content = [_this, 1, "",[""]] call BIS_fnc_Param; _type = [_this, 2, 0, [0]] call BIS_fnc_Param; if (_title != "" && _content != "") then { - DISPLAY_LAYER cutRsc [QGVAR(RSC_DISPLAY_MESSAGE),"PLAIN"]; + DISPLAY_LAYER cutRsc ['ACE_RscDisplayMessage',"PLAIN"]; disableSerialization; - _display = uiNamespace getvariable QGVAR(RSC_DISPLAY_MESSAGE); + _display = uiNamespace getvariable 'ACE_RscDisplayMessage'; if (!isnil "_display") then { _headerCtrl = _display displayCtrl 1; _contentCtrl = _display displayCtrl 2; @@ -29,6 +29,7 @@ if (_title != "" && _content != "") then { _headerCtrl ctrlSetText _title; _contentCtrl ctrlSetText _content; + // TODO get a font that has the same width characters for all. Ask Jaynus. _contentAmountOfChars = count (toArray _content); _pos = ctrlPosition _contentCtrl; _pos set [2, _contentAmountOfChars * ((((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)/ 3.3) max (safeZoneW / 11)]; diff --git a/addons/common/functions/fnc_progressBar.sqf b/addons/common/functions/fnc_progressBar.sqf index ab4cb7b69c..1d73cccc79 100644 --- a/addons/common/functions/fnc_progressBar.sqf +++ b/addons/common/functions/fnc_progressBar.sqf @@ -36,10 +36,10 @@ _perFrameFunction = { PARAMS_2(_parameters,_pfhID); EXPLODE_8_PVT(_parameters,_args,_onFinish,_onFail,_condition,_player,_startTime,_totalTime,_exceptions); private ["_elapsedTime", "_errorCode"]; - + _elapsedTime = time - _startTime; _errorCode = -1; - + if (isNull (uiNamespace getVariable [QGVAR(ctrlProgressBar), controlNull])) then { _errorCode = 1; } else { diff --git a/addons/gui/functions/fnc_sendDisplayInformationTo.sqf b/addons/common/functions/fnc_sendDisplayInformationTo.sqf similarity index 95% rename from addons/gui/functions/fnc_sendDisplayInformationTo.sqf rename to addons/common/functions/fnc_sendDisplayInformationTo.sqf index ae4012b5fe..f22894e057 100644 --- a/addons/gui/functions/fnc_sendDisplayInformationTo.sqf +++ b/addons/common/functions/fnc_sendDisplayInformationTo.sqf @@ -42,6 +42,6 @@ if (isPlayer _reciever) then { }foreach _content; - [_title,_content,_type] call EFUNC(gui,displayInformation); + [_title,_content,_type] call EFUNC(common,displayInformation); }; }; \ No newline at end of file diff --git a/addons/gui/functions/fnc_sendDisplayMessageTo.sqf b/addons/common/functions/fnc_sendDisplayMessageTo.sqf similarity index 95% rename from addons/gui/functions/fnc_sendDisplayMessageTo.sqf rename to addons/common/functions/fnc_sendDisplayMessageTo.sqf index c66af97266..3c5b399659 100644 --- a/addons/gui/functions/fnc_sendDisplayMessageTo.sqf +++ b/addons/common/functions/fnc_sendDisplayMessageTo.sqf @@ -41,6 +41,6 @@ if (isPlayer _reciever) then { }foreach _parameters; _content = format _localizationArray; - [_title,_content,_type] call EFUNC(gui,displayMessage); + [_title,_content,_type] call EFUNC(common,displayMessage); }; }; \ No newline at end of file diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index f2d944eb7a..f7705f8ad9 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -315,6 +315,12 @@ Ignoruj prośby wysłane przez innych graczy. Akceptacji wymagają między innymi akcje używania / współdzielenia wyposażenia, wykonywania określonych czynności. Rechazar Peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones. + + Feedback icons + + + Select the position of or disable the feedback icons on your screen. These icons will show to provide extra feedback on your character status and actions performed. + \ No newline at end of file diff --git a/addons/gui/CfgEventHandlers.hpp b/addons/gui/CfgEventHandlers.hpp deleted file mode 100644 index c9142e676b..0000000000 --- a/addons/gui/CfgEventHandlers.hpp +++ /dev/null @@ -1,11 +0,0 @@ -class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE( call compile preprocessFileLineNumbers QUOTE(QUOTE(PATHTOF(XEH_preInit.sqf))) ); - }; -}; - -class Extended_PostInit_EventHandlers { - class ADDON { - init = QUOTE( call compile preprocessFileLineNumbers QUOTE(QUOTE(PATHTOF(XEH_postInit.sqf))) ); - }; -}; \ No newline at end of file diff --git a/addons/gui/GUI.hpp b/addons/gui/GUI.hpp deleted file mode 100644 index 71e8dc0090..0000000000 --- a/addons/gui/GUI.hpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "UI\define.hpp" -#include "UI\RscTitles.hpp" diff --git a/addons/gui/README.md b/addons/gui/README.md deleted file mode 100644 index a6fe74f6c2..0000000000 --- a/addons/gui/README.md +++ /dev/null @@ -1,11 +0,0 @@ -ace_gui -======= - -to be scrapped. - - -## Maintainers - -The people responsible for merging changes to this component or answering potential questions. - -- [Glowbal](https://github.com/Glowbal) diff --git a/addons/gui/UI/RscTitles.hpp b/addons/gui/UI/RscTitles.hpp deleted file mode 100644 index 02e68e8d32..0000000000 --- a/addons/gui/UI/RscTitles.hpp +++ /dev/null @@ -1,179 +0,0 @@ - -#define RIGHT_SIDE (safezoneW + safezoneX) -#define LEFT_SIDE safezoneX -#define TOP_SIDE safeZoneY -#define BOTTOM_SIDE (safeZoneH + safezoneY) - -#define ICON_WIDTH (1.75 * (((safezoneW / safezoneH) min 1.2) / 40)) -#define X_POS_ICONS RIGHT_SIDE - (1.1 * ICON_WIDTH) -#define Y_POS_ICONS TOP_SIDE + (2.2 * ICON_WIDTH) -#define DIFFERENCE_ICONS (1.1 * ICON_WIDTH) - -class RscTitles { - class GVAR(iconsDisplay) { - duration = 1e+011; - idd = 1111; - movingenable = 0; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(iconsDisplay)), _this select 0)]); - class controlsBackground { - class icon_1: ACE_gui_backgroundBase { - text = ""; - colorText[] = {0.0,1.0,0.0,0.4}; - idc = 10501; - x = X_POS_ICONS; - y = Y_POS_ICONS + (0 * DIFFERENCE_ICONS); - w = ICON_WIDTH; - h = ICON_WIDTH; - }; - class icon_2: icon_1 { - idc = 10502; - y = Y_POS_ICONS + (1 * DIFFERENCE_ICONS); - }; - class icon_3: icon_1 { - idc = 10503; - y = Y_POS_ICONS + (2 * DIFFERENCE_ICONS); - }; - class icon_4: icon_1 { - idc = 10504; - y = Y_POS_ICONS + (3 * DIFFERENCE_ICONS); - }; - class icon_5: icon_1 { - idc = 10505; - y = Y_POS_ICONS + (4 * DIFFERENCE_ICONS); - }; - class icon_6: icon_1 { - idc = 10506; - y = Y_POS_ICONS + (5 * DIFFERENCE_ICONS); - }; - }; - }; - - class GVAR(RSC_PROGRESSBAR_LOADING) { - idd = -1; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(RSC_PROGRESSBAR_LOADING)), _this select 0)]); - fadein = 0; - fadeout = 0; - duration = 10e10; - class Controls { - class background: ACE_gui_backgroundBase { - idc = -1; - colorBackground[] = {0,0,0,1}; - colorText[] = {1, 1, 1, 1}; - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "29 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "0.4 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - text = "#(argb,8,8,3)color(0,0,0,0.4)"; - }; - - class Progress: ACE_gui_RscProgress { - idc = 6; - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "29 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "0.4 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - colorFrame[] = {0,0,0,0}; - colorBar[] = {0.27,0.5,0.31,0.6}; - texture = "#(argb,8,8,3)color(1,1,1,0.7)"; - }; - }; - }; - - - class GVAR(RSC_DISPLAY_MESSAGE) { - duration = 7; - idd = 86411; - movingenable = 0; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(RSC_DISPLAY_MESSAGE)), _this select 0)]); - fadein = 0; - class controlsBackground { - class header: ACE_gui_staticBase { - idc = 1; - type = CT_STATIC; - x = "safezoneX + (safezoneW / 10)"; - y = "safezoneY + (30 * (safeZoneH / 40))"; - w = "(safeZoneW / 10)"; - h = "(safeZoneH / 40)"; - style = ST_LEFT; - font = FontCSE; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.85, 0.85, 0.85, 1.0}; - colorBackground[] = {0, 0, 0, 0.9}; - text = ""; - }; - class text: header { - idc = 2; - y = "safezoneY + (31 * (safeZoneH / 40))"; - w = "(safeZoneW / 10) * 1.3"; - colorText[] = {0.0, 0.0, 0.0, 1.0}; - colorBackground[] = {1, 1, 1, 0.9}; - text = ""; - }; - }; - }; - - class GVAR(RSC_DISPLAY_INFORMATION) { - duration = 15; - idd = 86412; - movingenable = 0; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(RSC_DISPLAY_INFORMATION)), _this select 0)]); - fadein = 0; - class controlsBackground { - class header: ACE_gui_staticBase { - idc = 1; - type = CT_STATIC; - x = "safezoneX + (safezoneW / 10)"; - y = "safezoneY + (6 * (safeZoneH / 40))"; - w = "(safeZoneW / 10)"; - h = "(safeZoneH / 40)"; - style = ST_LEFT; - font = FontCSE; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.85, 0.85, 0.85, 1.0}; - colorBackground[] = {0, 0, 0, 0.9}; - text = ""; - }; - class text: header { - idc = 2; - y = "safezoneY + (7.1 * (safeZoneH / 40))"; - w = "(safeZoneW / 10) * 1.3"; - colorText[] = {0.0, 0.0, 0.0, 1.0}; - colorBackground[] = {1, 1, 1, 0.9}; - text = ""; - }; - class text2: text { - idc = 3; - y = "safezoneY + (8.2 * (safeZoneH / 40))"; - }; - class text3: text { - idc = 4; - y = "safezoneY + (9.3 * (safeZoneH / 40))"; - }; - class text4: text { - idc = 5; - y = "safezoneY + (10.4 * (safeZoneH / 40))"; - }; - class text5: text { - idc = 6; - y = "safezoneY + (11.5 * (safeZoneH / 40))"; - }; - - - class icon: ACE_gui_backgroundBase { - type = CT_STATIC; - idc = 10; - style = ST_PICTURE; - colorBackground[] = {0,0,0,1}; - colorText[] = {1, 1, 1, 1}; - font = FontCSE; - text = ""; - sizeEx = 0.032; - x = "safezoneX + (safezoneW / 10)"; - y = "safezoneY + (4 * (safeZoneH / 40))"; - w = "(safeZoneH / 40)*2"; - h = "(safeZoneH / 40)*2"; - }; - }; - }; - -}; \ No newline at end of file diff --git a/addons/gui/XEH_postInit.sqf b/addons/gui/XEH_postInit.sqf deleted file mode 100644 index 4172145202..0000000000 --- a/addons/gui/XEH_postInit.sqf +++ /dev/null @@ -1,11 +0,0 @@ -/** - * XEH_postInit.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -#include "script_component.hpp" diff --git a/addons/gui/XEH_preInit.sqf b/addons/gui/XEH_preInit.sqf deleted file mode 100644 index b5cc064d18..0000000000 --- a/addons/gui/XEH_preInit.sqf +++ /dev/null @@ -1,25 +0,0 @@ -/** - * XEH_preInit.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -#include "script_component.hpp" - -ADDON = false; - -PREP(loadingBar); -PREP(displayInformation); -PREP(displayMessage); -PREP(blurScreen); -PREP(displayIcon); -PREP(sendHintTo); -PREP(sendMessageTo); -PREP(sendDisplayInformationTo); -PREP(sendDisplayMessageTo); - -ADDON = true; diff --git a/addons/gui/config.cpp b/addons/gui/config.cpp deleted file mode 100644 index 2f7666be13..0000000000 --- a/addons/gui/config.cpp +++ /dev/null @@ -1,27 +0,0 @@ - -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ACE_main"}; - version = VERSION; - author[] = {$STR_ACE_Common_ACETeam}; - authorUrl = "http://csemod.com"; // TODO website link? - }; -}; -class CfgAddons { - class PreloadAddons { - class ADDON { - list[] = {QUOTE(ADDON)}; - }; - }; -}; - -#include "CfgEventHandlers.hpp" - -// TODO Port over the UI defines -#include "GUI.hpp" -#include "empty.hpp" diff --git a/addons/gui/data/buttonDisabled.paa b/addons/gui/data/buttonDisabled.paa deleted file mode 100644 index 2c2a10856b22386ce5dccdda85c34006259f1086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1564 zcmWF)b$53Radr=LWMN=n@bvWj59UWW`hxiXfdIr0c60N00P+if_zg&cY%q;MfuWRz zfmw4Y6F&knAea!=r~qn+jE2W(c#P&3SQ;QbH!wDY{rT_BAi$u^I9m1~B_t+(w6Nr3 MTp;@YKcsjE0G`c5>Hq)$ diff --git a/addons/gui/data/buttonDisabled_gradient.paa b/addons/gui/data/buttonDisabled_gradient.paa deleted file mode 100644 index 43b1b8d100e67efb7e607cc0fdc3e83437268092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1816 zcmeH|KWI}y9LIn6yZ0w4iMhMHK4T~)EisZKNC+hqDUyFAz8KOV*@}e@x#NEK`~Kj5cYKcf-L1(= zCBIy(tmG8{sMTujU%i^Y*3+)ndirL$d_Cvs4R5?tJ#*~VgcuZ6ph+7;!wy5Y?~Mch z5;+Es+nV39la5KHPbtL}6RR0tz>h&`ghsOM_jeOfi!teZk#;r1tcz!zWYMXbputsE zX3i9W6qsa=L_BNY65HfHi!?YRGJ-j>9lp;WH^>@U=IE?pZQltq!yVV1T?3g_9J z-%yuDfkU09D8o9xC+cKDGzA1OOVjv_Baomw9KLkoA@0&VgU>B67KW1Izr?q(2kkGXhOuHB*a8lK<2HHJO3u%7=?JWWN>xk zz<@-59`pELJf7=a_X;q$K~AEQ#sqA)jtJ^F0}$RmV!}mvBpfS0QLx t{Ys{FsahW$c^NgxkcUvU+Zxyf#gQ0%XRx-+aK$alM4U< diff --git a/addons/gui/data/buttonNormal.paa b/addons/gui/data/buttonNormal.paa deleted file mode 100644 index 84936d83562e20d2d7bc064e6487a87305e0e4f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1564 zcmWF)b$53Radr=LWMN=nU}R+c59UWW`hxiXfdIr0c60N00P+if_zg&cY%q;MfuWRz zftjI!i5~$O5KIVbQ~)(ZM#Ez?JVx^iEDeyJ8yFcDeEaXsAi$u^I9m1~B_t+(w6Nr3 MWLWX{KcsjE04MuGD*ylh diff --git a/addons/gui/data/buttonNormal_gradient.paa b/addons/gui/data/buttonNormal_gradient.paa deleted file mode 100644 index 2210f987411ee2a407ba63733091384a6fb00e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1989 zcmdT_&ubGw6n^i`>}H#8eh^j&A%;x|A%qxmh@liI-2~c*5iQ10LMW01ky1oTD5XdV zW(tceWsx8rJv350dF)9HfMs1s%Rgz@S6EqX&-6k##14 zoqg<%uDQg!h@x`jT$ZvVP^8AfZX~)Q<)jrU`sF??U2l4Fcy+05DM}( z&Ok(-$1)Y5%6J9aPzb{(o~0I6I6Q#_JY$7J%7?~5p3Z4N9-Au?1Uv~(bAlQvL`y-= z0$k-GjAI%)ZmKdbOOTE#3!t^p2tYAI3z(6UXqD2miYgR!%s{aNum*mR(ZT?}hAgzX z9>(X8r8+FJ#v-l*HdDAjRmjsizCsge2b&?j;y~mm!$NpYlSIB_#BPq(b$70-QEPYZ zqfMZqEdso2mm@4sb}K>&Y^kWEX$s=dN;!L8CND~&1fmAhSaMR@f)Zg8?_pPAZ4i?n ziA63R;tE6{NEIpf7++$yPAz*16AWrtpc<{AO&ZCp0-)12EWswz@CCeQkHEi)%b2DP zi3ze%_Ct*P{GbAd-(x!dpTL_V9g5Po2U~W(*SAIQ(uM*XJ0(s_hs zm{V41B~CIAvph?V=RN;at|wLdKDg#=kusim_6LV*6<1V@RG-Xyi+pa$Io8~AOqNV7 zHJ(Fb5(;q)Qwk#ijEaJJTCCFEkDj9Dd8MW`44=%TGn!_<_Xww4f4SvO ZgP=MCJpJCmus=_!xITRSF&N#$KLJ6wth)dJ diff --git a/addons/gui/data/buttonNormal_gradient2.paa b/addons/gui/data/buttonNormal_gradient2.paa deleted file mode 100644 index cabe6c7feda6907aca65b3aad4ee27ce6c91f491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2035 zcmd5-L1^1%6n^jhzkVyR9C@A=jOV$w2__g}JTRflN{Qr=1lBRud07adnAnUG(rz>% zgfdE&sNfAzL@;6Ov_dk%PCM=}#&#P$-uHj+ zz3+eif9a#wW@e05b7s!q0AQNt(Xl^oyyy8x?&bL(PEWr-<@%qwzb)b3{`a*DMMw%@ zZ~aATI3P5AE9*VP5N!HxY(4@gOus;C1Q-zFF{XUnzZbQ{msUYmIC3teI$1+l9m)?Q z(Iu%NtxLa_ZqhBB7i(mZ1(KCx#U6ZuGG0mSyva&dG}qwLzN`USJm@6ElXX6W)POU% ziXZKBUd-4LLuE~+5kph8RPQIjWyvyn#v&MR_sSZSdqxH;{2hgDFmsXGl8xn@fQx8~ z1Du9}n8zz*f;`7sxCUk(9`ZVMvEAZ3P=T-MoBL+(`Pzb&#Q=ptu%>_$SN>u~*qQS> z7|j!_lJ+9?3t4Ou6qD)H$7Zi%(oz*|8G*A5S9lJ`P={ffW9<=Ep&}|QgZ5GeO3fNw z!r! z3hHEChB4??-SaPK1TC5cD-TmR>o&CugnQ$79k*q+2G%54w9Ku~aUBYfrIz#+=Dx@6 zMd~`2vBDM*Oj@AZ=#WN&wV+6F04s2hY4{!d#JfcA!B|FFYPSLq)(Lby#8xkIxnL%p>cs?>YPZ{ZAdM ze^-XPea`OhD=deU7ze8edr;&BR$~p)A1?aDy-JhVWoOrVF?C4$hymS%NKOSCv5X`g#qmSMv;8bQ(4{*>Mc=!4LLaG}> zY5*wA=xge*C=01qO*YWjngnwU^Hg<@=yJ(K_oWpbZnYrPhuv%;z?03Ert+k%u_Ybt z5hiq_V~6n@zIpY*>fxxbBb@6b?A60CRo$Q2l`O}zPOZ{o#Q;}GICfL}*biOLDv-K* Y`1H|}lIQ#qnM*x=^yiI#kNmIpe=FM30RR91 diff --git a/addons/gui/data/buttonNormal_gradient3.paa b/addons/gui/data/buttonNormal_gradient3.paa deleted file mode 100644 index 7da9fbcf8a7bea39e3108f236c4322101bac95a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2044 zcmd5--)kF35dLO%Z*`VWKM>atgb-)d2qA=!gD}PoMkf_J(3Fx^5ymwk$fAT0LI}nL zQ-Z12pq3+CgIv-+g%XtzD3p>wDQ#)rO5d6XKjfci9|C=8QCD$Qx#U4$3dtUKyK}qq z%{Q|%yXRk7S@D~Vm6k67%+1XWp2@5Jn?reE+E9LHdHJoHk*}HeGi5%uNV^DcPDz}r!xe1Q@Zo-Xqzf;n-wBPmD;lI|+ zxyW_>6y@dXj<_M}>wM7)D3?}Ppt`zG%gCx#I?Hv~EzzV+)H8S@E8HP8jimt46~oBsRknz%f~hrxXnchY?2}+9hs(CLJ3iBiMYtKM~+C*bkI(rQRWL&Rt5Sv zDDe$)(D0~?26nKGBoqadq90H}ZBu6GE-Ji^E24dw_$D@rbb(u#=bQ8u$u50E8)>;^ zAgWvzNYl}*dWrMu?uh5pbGt5gzJ7WxWH=P+l-&I^%!+vqJ6Xnj0tJj0aJl4(XK5vp`(k?m!*E6wvfe1zSOinq6f6Q&Yf_HkQZxI=QZA@ zkX=>+O?Z4CS8z+X^aXwv-Uqlv*Nwp))(adGR5Hg&IpX>f$8&Px?u@-Kr=r~-g!jUJ zuOI4ndwVwadQ$WqQ7{P<6br4i66;Q!g$ZEL6oRNo)V{qk`E+yF`oB;{8*+MB6m@ z^^d_Drku_b#Fvkb(tdU^#A$Rf{5YPA(~O=RN^hhPwahUXRsEc@y2a@#`HQIkK1&&M z3Zx8Dy*nAJHo`J}tl=ge$mzfp?GgoXYlDI#vnDi?;hZ6i4o7N}6)ujJa;)Eb&O)5T UZ{PpBV#FX$-~Rd6;PCqX8=e`$(*OVf diff --git a/addons/gui/data/buttonNormal_gradient_top.paa b/addons/gui/data/buttonNormal_gradient_top.paa deleted file mode 100644 index 904e1a62f7a1cf7e03644d5a965fbe3b177b23b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1995 zcmd5--Afxm5TBXdyPWaz!Epr%A)G;u5JK=lg4iOtOHrYg);0}dMZ|<6B2pxXNRiO2 zkd{NPBBgzkVu}cbQV{x3O8Zv&C$#@W9|WIDdeMdi`Vh!Nb(g)}*}3`62Q#w|u1!u_ z`P^i|;s9WpX5*ZmwQe`*hBun@{fUV?S&x3~tu@*E^gLdI0cR4hd*3P4p3pvCoCcbk z;)BWs`47K`i)>qmUov#xGZ9l%j-1QVFo`})_C@_jbVC}EHl(kEYqXBDa+w4P*bxzC z)Zh^+IPC)_2HQ{+>cNyt64?twTn|yu(nETn_DSZ7B&?b>57zZsT!(ng($M5LRkq3O zd0Lblj7MY`MO!|?35dzFI88Pv1(wG$*irbwhpB{+=X+qnD`x+7>yo_dLG2s4FGrvS z%s_FJmMDpif}Ckwg9>ax z7-V!%!_P1b*)osf0SwbTtg@vQq-`iBae)eup>2GRyoMjK7~vZp#0aGsM6fffu5ex* zwCp^csp?eva601>sOSofS6{m^mLazkBNIzu6;m`0Lr_Y3RWFl2h++!F9At6I3#nTI z!UQg3Rbgci{xJ|MTs*-Ih`|6Y=cVU(jMaH6x#I{Xn?sxCXbWA^NoJ4-gN|SocA1WE z;Ttoa!Y;0R3M(W=$wiREaSHR6tyegn-4nOc_QLCmO1z rltL#c718P7dJj~0IJF5Q+?H5(fyLIZ6sYfa*P!_Ne*SJ;yvBb36MwL| diff --git a/addons/gui/data/buttonNormal_gradient_top_w.paa b/addons/gui/data/buttonNormal_gradient_top_w.paa deleted file mode 100644 index 23dd190afc5bab9aecf46185e74c365abbfd22fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1856 zcmeHIL1+^}6#f6tB)gR~nVH?hZK$;kwMr;aODUd0616E6QPc*hl0y;6!9(yAq?97+ zp@$xehth+G;?Yyd!7S2?AmT|pxr<0I;>S)!M;#^Vi$B6<8bJ9v{Dv3ve~)??b`x*R}-xa5Dt#)(47p8g$%U z&uUM)*6?=WAM3}&LB)B+!uEYz2gi4P`<~|} z&}%4YM1WrsI@n=MLqQ3$h?~qJw;wn>ARSExIULkxD9Hs~;4h6TLIyb%@G(5YMa;5~ zJ@5vy+8TU~eLA(>vl(wDU^cYQ_45(A!E|^>y#mHW0*R$qANIluSXelrxwHLck>h}EU7_VJyk!9VSPzW@TT$21nbOb zDyn`OR%-fUl$|@>+4B4K920wL9&+RUdx2Qf+HPF~0gn)v^?kn_J5@A_|FnwE?+-}b z?p2@A31fsQ^aQ>(iL)Va(qL!E+04)g1SqHyo^#f-{Ygw}u7D&w_bs%ip+*%Ph6a_v eUZ5;0mS$u43ZcRdM2Q`3Qd3hWqpjBN7x)YODXS;| diff --git a/addons/gui/empty.hpp b/addons/gui/empty.hpp deleted file mode 100644 index 698784e2c6..0000000000 --- a/addons/gui/empty.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "\z\ace\addons\gui\UI\define.hpp" - -class ACE_common_empty_screen { - idd = 679123; - onLoad = "uiNamespace setVariable [""ACE_common_empty_screen"", _this select 0]"; - onUnload = "if (missionNamespace getvariable [""ACE_common_DISABLE_USER_INPUT_SCREEN"", false)]) then { createDialog ""ACE_common_empty_screen""; }"; - class controlsBackground { - class background : ACE_gui_backgroundBase { - idc = 1; - x = safezoneX; - y = safezoneY; - w = safezoneW; - h = safezoneH; - text = ""; - moving = 0; - }; - }; - - class controls { - }; -}; diff --git a/addons/gui/functions/fnc_displayIcon.sqf b/addons/gui/functions/fnc_displayIcon.sqf deleted file mode 100644 index 98895c6346..0000000000 --- a/addons/gui/functions/fnc_displayIcon.sqf +++ /dev/null @@ -1,79 +0,0 @@ -/** - * fn_gui_displayIcon.sqf - * @Descr: - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: true - * - * @Example ["myID", true, QUOTE(PATHTOF(data\icon_group.paa)), [1,1,1,1]] call ace_gui_fnc_displayIcon; - */ - -#include "script_component.hpp" - -#define MAX_N_ICONS 6 - -private ["_iconId", "_show", "_icon", "_spot", "_idc", "_display","_next_IDC", "_nextText"]; -_iconId = _this select 0; -_show = _this select 1; -_icon = _this select 2; -_color = _this select 3; - -disableSerialization; -_list = missionNamespace getvariable [QGVAR(displayIconList),[]]; -_display = uiNamespace getvariable QGVAR(iconsDisplay); - -if (isNil "_display") then { - // Display the icons - 11401 cutRsc [QGVAR(iconsDisplay),"PLAIN"]; - _display = uiNamespace getvariable QGVAR(iconsDisplay); -}; - -if (_show) then { - if ({(_x select 0 == _iconId)} count _list == 0) then { - _list pushback [_iconId, _icon, _color]; - } else { - { - if (_x select 0 == _iconId) exitwith { - _list set [_foreachIndex, [_iconId, _icon, _color]]; - }; - }foreach _list; - }; - - missionNamespace setvariable [QGVAR(displayIconList), _list]; - - { - if (_x select 0 == _iconId) exitwith { - _idc = 10501 + _foreachIndex; - _ctrl = _display displayCtrl _idc; - _ctrl ctrlsetText _icon; - _ctrl ctrlSetTextColor _color; - }; - }foreach _list; -} else { - if ({(_x select 0 == _iconId)} count _list == 1) then { - _newList = []; - { - if (_x select 0 != _iconId) then { - _newList pushback _x; - }; - }foreach _list; - - missionNamespace setvariable [QGVAR(displayIconList), _newList]; - - for "_i" from 0 to (MAX_N_ICONS - 1) /* step +1 */ do { - _idc = 10501 + _i; - _ctrl = _display displayCtrl _idc; - _ctrl ctrlsetText ""; - _ctrl ctrlSetTextColor [1,1,1,1]; - }; - - { - _idc = 10501 + _foreachIndex; - _ctrl = _display displayCtrl _idc; - _ctrl ctrlsetText (_x select 1); - _ctrl ctrlSetTextColor (_x select 2); - }foreach _newList; - }; -}; diff --git a/addons/gui/functions/fnc_loadingbar.sqf b/addons/gui/functions/fnc_loadingbar.sqf deleted file mode 100644 index 4aba751235..0000000000 --- a/addons/gui/functions/fnc_loadingbar.sqf +++ /dev/null @@ -1,64 +0,0 @@ -/** - * fn_gui_loadingbar.sqf - * @Descr: Displays a loading bar and halts script until loading bar has finished - * @Author: Glowbal - * - * @Arguments: [timeToWait NUMBER, condition CODE (Optional), onSuccess CODE (Optional), onFailure CODE (Optional), arguments ARRAY (Optional)] - * @Return: BOOl Returns true if loading bar has fully finished. Otherwise false - * @PublicAPI: true - */ - -#include "script_component.hpp" - -private ["_timeToWait","_cond","_onfailure","_onSuccess","_args"]; -_timeToWait = _this select 0; -_cond = [_this, 1, {true}, [{true}]] call BIS_fnc_Param; -_onSuccess = [_this, 2, {}, [{}]] call BIS_fnc_Param; -_onfailure = [_this, 3, {}, [{}]] call BIS_fnc_Param; -_args = [_this, 4, [], [[]]] call BIS_fnc_Param; - - -if (_timeToWait > 0) exitwith { - GVAR(LOADING_BAR_STATUS) = 0; - disableSerialization; - 1534 cutRsc [QGVAR(RSC_PROGRESSBAR_LOADING),"plain"]; - [{ - private ["_args","_timeToWait","_start","_cond","_onSuccess","_onfailure","_params"]; - _args = _this select 0; - - _start = _args select 0; - _timeToWait = _args select 1; - _cond = _args select 2; - _onSuccess = _args select 3; - _onfailure = _args select 4; - _params = _args select 5; - - if !(_params call _cond) exitwith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - 1534 cutText ["","plain"]; - _params call _onfailure; - }; - - if (GVAR(LOADING_BAR_STATUS) >= 1) exitwith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - 1534 cutText ["","plain"]; - _params call _onSuccess; - }; - private "_dialog"; - disableSerialization; - _dialog = uiNamespace getvariable QGVAR(RSC_PROGRESSBAR_LOADING); - - GVAR(LOADING_BAR_STATUS) = (diag_tickTime - _start) / _timeToWait; - (_dialog displayCtrl 6) progressSetPosition GVAR(LOADING_BAR_STATUS); - - }, 0, [diag_tickTime, _timeToWait, _cond, _onSuccess, _onfailure, _args]] call CBA_fnc_addPerFrameHandler; - true; -}; - -if (_args call _cond) exitwith { - _args call _onSuccess; - true; -}; - -_args call _onfailure; -false; \ No newline at end of file diff --git a/addons/gui/functions/fnc_sendHintTo.sqf b/addons/gui/functions/fnc_sendHintTo.sqf deleted file mode 100644 index 0454cc5691..0000000000 --- a/addons/gui/functions/fnc_sendHintTo.sqf +++ /dev/null @@ -1,26 +0,0 @@ -/** - * fn_sendHintTo.sqf - * @Descr: Sends a hint to player unit across network - * @Author: Glowbal - * - * @Arguments: [reciever OBJECT, message STRING] - * @Return: void - * @PublicAPI: true - */ - -#include "script_component.hpp" - -private ["_reciever","_message"]; -_reciever = _this select 0; -_message = _this select 1; - -if (isPlayer _reciever) then { - if (!local _reciever) then { - [_this, QUOTE(FUNC(sendHintTo)), _reciever, false] call EFUNC(common,execRemoteFnc); - } else { - if (isLocalized _message) then { - _message = localize _message; - }; - hintsilent format ["%1",_message]; - }; -}; \ No newline at end of file diff --git a/addons/gui/functions/fnc_sendMessageTo.sqf b/addons/gui/functions/fnc_sendMessageTo.sqf deleted file mode 100644 index a4e0e4ccd5..0000000000 --- a/addons/gui/functions/fnc_sendMessageTo.sqf +++ /dev/null @@ -1,31 +0,0 @@ -/** - * fn_sendMessageTo.sqf - * @Descr: Sends a chat message to player unit across the network - * @Author: Glowbal - * - * @Arguments: [reciever OBJECT, message STRING] - * @Return: void - * @PublicAPI: true - */ - -#include "script_component.hpp" - -private ["_reciever","_message"]; -_reciever = _this select 0; -_message = _this select 1; - - -if (isPlayer _reciever) then { - if (!local _reciever) then { - [_this, QUOTE(FUNC(sendMessageTo)), _reciever, false] call EFUNC(common,execRemoteFnc); - } else { - if (isnil QGVAR(LOGIC_OBJECT)) exitwith { - // need to create an object instead - }; - - if (isLocalized _message) then { - _message = localize _message; - }; - GVAR(LOGIC_OBJECT) globalChat format ["%1",_message]; - }; -}; diff --git a/addons/gui/functions/script_component.hpp b/addons/gui/functions/script_component.hpp deleted file mode 100644 index e9276928ad..0000000000 --- a/addons/gui/functions/script_component.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#define COMPONENT GUI -#include "\z\ace\addons\main\script_mod.hpp" - -#ifdef DEBUG_ENABLED_GUI - #define DEBUG_MODE_FULL -#endif - -#ifdef DEBUG_SETTINGS_GUI - #define DEBUG_SETTINGS DEBUG_SETTINGS_GUI -#endif - -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/gui/script_component.hpp b/addons/gui/script_component.hpp deleted file mode 100644 index e9276928ad..0000000000 --- a/addons/gui/script_component.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#define COMPONENT GUI -#include "\z\ace\addons\main\script_mod.hpp" - -#ifdef DEBUG_ENABLED_GUI - #define DEBUG_MODE_FULL -#endif - -#ifdef DEBUG_SETTINGS_GUI - #define DEBUG_SETTINGS DEBUG_SETTINGS_GUI -#endif - -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/gui/stringtable.xml b/addons/gui/stringtable.xml deleted file mode 100644 index 6a7807c925..0000000000 --- a/addons/gui/stringtable.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/addons/medical/config.cpp b/addons/medical/config.cpp index 96af8ac1ca..19fae7d3e8 100644 --- a/addons/medical/config.cpp +++ b/addons/medical/config.cpp @@ -7,7 +7,7 @@ class CfgPatches units[] = {"ACE_medical_supply_crate_cms", "ACE_bandage_basicItem","ACE_packing_bandageItem","ACE_bandageElasticItem","ACE_tourniquetItem","ACE_splintItem","ACE_morphineItem","ACE_atropineItem","ACE_epinephrineItem","ACE_plasma_ivItem","ACE_plasma_iv_500Item","ACE_plasma_iv250Item","ACE_blood_ivItem","ACE_blood_iv_500Item","ACE_blood_iv_250Item","ACE_saline_ivItem","ACE_saline_iv_500Item","ACE_saline_iv_250Item","ACE_quikclotItem","ACE_nasopharyngeal_tubeItem","ACE_opaItem","ACE_liquidSkinItem","ACE_chestsealItem","ACE_personal_aid_kitItem"}; weapons[] = {"ACE_surgical_kit"}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ACE_gui","ACE_common"}; + requiredAddons[] = {"ACE_common"}; version = VERSION; author[] = {$STR_ACE_Common_ACETeam, "Glowbal"}; authorUrl = "http://csemod.com"; diff --git a/addons/medical/functions/fnc_ActionCheckBloodPressureLocal.sqf b/addons/medical/functions/fnc_ActionCheckBloodPressureLocal.sqf index 9f645e80ad..bd17d769ec 100644 --- a/addons/medical/functions/fnc_ActionCheckBloodPressureLocal.sqf +++ b/addons/medical/functions/fnc_ActionCheckBloodPressureLocal.sqf @@ -51,7 +51,7 @@ if ([_caller] call FUNC(isMedic)) then { _title = format["STR_ACE_CHECK_BLOODPRESSURE"]; _content = ["STR_ACE_CHECK_BLOODPRESSURE_CHECKED_MEDIC", _output]; -[_caller, _title, _content, 0,[[_unit] call EFUNC(common,getName), round(_bloodPressureHigh),round(_bloodPressureLow)] ] call EFUNC(gui,sendDisplayInformationTo); +[_caller, _title, _content, 0,[[_unit] call EFUNC(common,getName), round(_bloodPressureHigh),round(_bloodPressureLow)] ] call EFUNC(common,sendDisplayInformationTo); if (_logOutPut != "") then { [_unit,"examine",format["%1 checked Blood Pressure: %2",[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToQuickViewLog); diff --git a/addons/medical/functions/fnc_ActionCheckPulse.sqf b/addons/medical/functions/fnc_ActionCheckPulse.sqf index 52e9158329..00e7f49490 100644 --- a/addons/medical/functions/fnc_ActionCheckPulse.sqf +++ b/addons/medical/functions/fnc_ActionCheckPulse.sqf @@ -19,7 +19,7 @@ if ([_caller] call FUNC(isSetTreatmentMutex)) exitwith {}; _title = format["STR_ACE_CHECK_PULSE"]; _content = ["STR_ACE_CHECK_PULSE_CONTENT"]; -[_caller, _title, _content] call EFUNC(gui,sendDisplayInformationTo); +[_caller, _title, _content] call EFUNC(common,sendDisplayInformationTo); _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [2 + round(random(1)), @@ -32,8 +32,8 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [_caller,false] call FUNC(treatmentMutex); }, // on success { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); [(_this select 0),false] call FUNC(treatmentMutex); }, // on failure [_caller, _target] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); diff --git a/addons/medical/functions/fnc_ActioncheckBloodPressure.sqf b/addons/medical/functions/fnc_ActioncheckBloodPressure.sqf index d96ae8b19c..2f79bad6b2 100644 --- a/addons/medical/functions/fnc_ActioncheckBloodPressure.sqf +++ b/addons/medical/functions/fnc_ActioncheckBloodPressure.sqf @@ -19,7 +19,7 @@ if ([_caller] call FUNC(isSetTreatmentMutex)) exitwith {}; _title = format["STR_ACE_CHECK_BLOODPRESSURE"]; _content = ["STR_ACE_CHECK_BLOODPRESSURE_CONTENT"]; -[_caller, _title, _content] call EFUNC(gui,sendDisplayInformationTo); +[_caller, _title, _content] call EFUNC(common,sendDisplayInformationTo); _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [2 + round(random(1)), @@ -32,9 +32,9 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [_caller,false] call FUNC(treatmentMutex); }, // on success { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); [(_this select 0),false] call FUNC(treatmentMutex); }, // on failure [_caller, _target] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); diff --git a/addons/medical/functions/fnc_actionCarryUnit.sqf b/addons/medical/functions/fnc_actionCarryUnit.sqf index d3cfb35aee..2dd1bb8f7f 100644 --- a/addons/medical/functions/fnc_actionCarryUnit.sqf +++ b/addons/medical/functions/fnc_actionCarryUnit.sqf @@ -87,9 +87,9 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; }, // on success { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); [(_this select 0), false] call FUNC(treatmentMutex); [(_this select 0), objNull,[0, 0, 0]] call EFUNC(common,carryObj); }, // on failure [_caller, _unit, _killOnDrop] // arguments -] call EFUNC(gui,loadingBar); \ No newline at end of file +] call EFUNC(common,loadingBar); \ No newline at end of file diff --git a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf index ae69f52272..5707f403df 100644 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf @@ -44,7 +44,7 @@ if (_heartRate > 1.0) then { _title = "STR_ACE_CHECK_PULSE"; _content = ["STR_ACE_CHECK_PULSE_CHECKED_MEDIC",_heartRateOutput]; -[_caller, _title, _content, 0, [[_unit] call EFUNC(common,getName), round(_heartRate)]] call EFUNC(gui,sendDisplayInformationTo); +[_caller, _title, _content, 0, [[_unit] call EFUNC(common,getName), round(_heartRate)]] call EFUNC(common,sendDisplayInformationTo); if (_logOutPut != "") then { [_unit,"examine",format["%1 checked Heart Rate: %2",[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToQuickViewLog); diff --git a/addons/medical/functions/fnc_actionCheckResponse.sqf b/addons/medical/functions/fnc_actionCheckResponse.sqf index d2201e15f2..4ec2d269ad 100644 --- a/addons/medical/functions/fnc_actionCheckResponse.sqf +++ b/addons/medical/functions/fnc_actionCheckResponse.sqf @@ -19,7 +19,7 @@ if ([_caller] call FUNC(isSetTreatmentMutex)) exitwith {}; _title = format["STR_ACE_CHECK_RESPONSE"]; _content = ["STR_ACE_CHECK_RESPONSE_CONTENT"]; -[_caller, _title, _content] call EFUNC(gui,sendDisplayInformationTo); +[_caller, _title, _content] call EFUNC(common,sendDisplayInformationTo); _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [2 + round(random(1)), @@ -38,14 +38,14 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; _title = format["STR_ACE_CHECK_RESPONSE"]; _content = [format[localize "STR_ACE_CHECK_REPONSE_YOU_CHECKED",[_target] call EFUNC(common,getName)],_output]; - [_caller, _title, _content] call EFUNC(gui,sendDisplayInformationTo); + [_caller, _title, _content] call EFUNC(common,sendDisplayInformationTo); [_target,"examine",_output] call FUNC(addToQuickViewLog); [_caller,false] call FUNC(treatmentMutex); }, // on success { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); [(_this select 0),false] call FUNC(treatmentMutex); }, // on failure [_caller, _target] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); diff --git a/addons/medical/functions/fnc_actionDragUnit.sqf b/addons/medical/functions/fnc_actionDragUnit.sqf index d0fa1c70ea..d43b9a54dc 100644 --- a/addons/medical/functions/fnc_actionDragUnit.sqf +++ b/addons/medical/functions/fnc_actionDragUnit.sqf @@ -94,9 +94,9 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; }, // on success { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); [(_this select 0), false] call FUNC(treatmentMutex); [(_this select 0), objNull,[0, 0, 0]] call EFUNC(common,carryObj); }, // on failure [_caller, _unit, _killOnDrop] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); diff --git a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf index 30363453e2..4d747eb3b5 100644 --- a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf +++ b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf @@ -53,10 +53,10 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [_caller,false] call FUNC(treatmentMutex); }, // on success { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); [(_this select 0),false] call FUNC(treatmentMutex); }, // on failure [_caller, _target, _selectionName] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); diff --git a/addons/medical/functions/fnc_handleHeal.sqf b/addons/medical/functions/fnc_handleHeal.sqf index 04e17a5d4c..ffd910116b 100644 --- a/addons/medical/functions/fnc_handleHeal.sqf +++ b/addons/medical/functions/fnc_handleHeal.sqf @@ -19,7 +19,7 @@ if (!(isPlayer _healer) && GVAR(setting_allowAIFullHeal) && !([_unit] call EFUNC [_unit, QGVAR(bandagedWounds),[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]] call EFUNC(common,setDefinedVariable); if (_unit != _healer) then { - [_unit,"STR_ACE_BANDAGED","STR_ACE_IS_BANDAGING_YOU", 0, [[_healer] call EFUNC(common,getName)]] call EFUNC(gui,sendDisplayMessageTo); + [_unit,"STR_ACE_BANDAGED","STR_ACE_IS_BANDAGING_YOU", 0, [[_healer] call EFUNC(common,getName)]] call EFUNC(common,sendDisplayMessageTo); }; [_unit,"treatment",format["%1 has patched up the patient",[_healer] call EFUNC(common,getName)]] call FUNC(addActivityToLog); diff --git a/addons/medical/functions/fnc_handleTreatment_Action_AirwayLocal.sqf b/addons/medical/functions/fnc_handleTreatment_Action_AirwayLocal.sqf index a140f74f6b..8d468aa60a 100644 --- a/addons/medical/functions/fnc_handleTreatment_Action_AirwayLocal.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Action_AirwayLocal.sqf @@ -19,7 +19,7 @@ _removeItem = _this select 3; if (!local _target) exitwith{}; -[_target,"STR_ACE_AIRWAY","STR_ACE_IS_TREATING_YOUR_AIRWAY",0, [([_caller] call EFUNC(common,getName))]] call EFUNC(gui,sendDisplayMessageTo); +[_target,"STR_ACE_AIRWAY","STR_ACE_IS_TREATING_YOUR_AIRWAY",0, [([_caller] call EFUNC(common,getName))]] call EFUNC(common,sendDisplayMessageTo); [_target,_removeItem] call FUNC(addToTriageList); diff --git a/addons/medical/functions/fnc_handleTreatment_Action_BandageLocal.sqf b/addons/medical/functions/fnc_handleTreatment_Action_BandageLocal.sqf index c6a09fa4de..e39f12596e 100644 --- a/addons/medical/functions/fnc_handleTreatment_Action_BandageLocal.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Action_BandageLocal.sqf @@ -24,7 +24,7 @@ if (!local _target) exitwith{ }; if (_caller != _target) then { - [_target,"STR_ACE_BANDAGING", "STR_ACE_IS_BANDAGING_YOU", 0, [[_treatingPerson] call EFUNC(common,getName)]] call EFUNC(gui,sendDisplayMessageTo); + [_target,"STR_ACE_BANDAGING", "STR_ACE_IS_BANDAGING_YOU", 0, [[_treatingPerson] call EFUNC(common,getName)]] call EFUNC(common,sendDisplayMessageTo); }; [_target,_removeItem] call FUNC(addToTriageList); diff --git a/addons/medical/functions/fnc_handleTreatment_Action_CPR.sqf b/addons/medical/functions/fnc_handleTreatment_Action_CPR.sqf index 61e12687a7..eea3b459ee 100644 --- a/addons/medical/functions/fnc_handleTreatment_Action_CPR.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Action_CPR.sqf @@ -56,7 +56,7 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; }, // on success { private ["_caller","_target", "_selectionName", "_prevAnim"]; - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); @@ -66,6 +66,6 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on failure [_caller, _target, _selectionName, _removeItem, _prevAnim] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); true; \ No newline at end of file diff --git a/addons/medical/functions/fnc_handleTreatment_Action_Stitching.sqf b/addons/medical/functions/fnc_handleTreatment_Action_Stitching.sqf index a6e9156966..69e8848acf 100644 --- a/addons/medical/functions/fnc_handleTreatment_Action_Stitching.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Action_Stitching.sqf @@ -23,7 +23,7 @@ _selectionName = _this select 2; _removeItem = _this select 3; _prevAnim = _this select 4; -[_caller,"STR_ACE_STITCHING","STR_ACE_START_STITCHING_INJURIES", 0, [[_injuredPerson] call EFUNC(common,getName),_selectionName]] call EFUNC(gui,sendDisplayMessageTo); +[_caller,"STR_ACE_STITCHING","STR_ACE_START_STITCHING_INJURIES", 0, [[_injuredPerson] call EFUNC(common,getName),_selectionName]] call EFUNC(common,sendDisplayMessageTo); _bandagedWounds = [_injuredPerson,QGVAR(bandagedWounds)] call EFUNC(common,getDefinedVariable); _bodyPartN = [_selectionName] call FUNC(getBodyPartNumber); @@ -46,12 +46,12 @@ _caller setvariable [QGVAR(lastStichPerformed), diag_tickTime]; _prevAnim = _args select 4; if ((vehicle _caller != _caller) || ((getPos _caller) distance (_caller getvariable GVAR(ORIGINAL_POSITION_PLAYER))) >= 1) then { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); }; - [QGVAR(treatmentIconID), false, QUOTE(PATHTOF(data\icons\icon_advanced_treatment.paa)), [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), false, QUOTE(PATHTOF(data\icons\icon_advanced_treatment.paa)), [1,1,1,1]] call EFUNC(common,displayIcon); ["Medical_handleTreatment_Stitching", [_caller, _target, _selectionName, _removeItem, false]] call ace_common_fnc_localEvent; ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; @@ -83,7 +83,7 @@ _caller setvariable [QGVAR(lastStichPerformed), diag_tickTime]; if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); }; - [QGVAR(treatmentIconID), false, QUOTE(PATHTOF(data\icons\icon_advanced_treatment.paa)), [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), false, QUOTE(PATHTOF(data\icons\icon_advanced_treatment.paa)), [1,1,1,1]] call EFUNC(common,displayIcon); ["Medical_handleTreatment_Stitching", [_caller, _target, _selectionName, _removeItem, true]] call ace_common_fnc_localEvent; ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; @@ -99,6 +99,6 @@ _caller setvariable [QGVAR(lastStichPerformed), diag_tickTime]; {}, // on success {}, // on failure [_caller] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); true; \ No newline at end of file diff --git a/addons/medical/functions/fnc_handleTreatment_Action_fullHeal.sqf b/addons/medical/functions/fnc_handleTreatment_Action_fullHeal.sqf index 53f82f74f0..d48ac82e1a 100644 --- a/addons/medical/functions/fnc_handleTreatment_Action_fullHeal.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Action_fullHeal.sqf @@ -42,7 +42,7 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); }; - [QGVAR(treatmentIconID), false, "", [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), false, "", [1,1,1,1]] call EFUNC(common,displayIcon); ["Medical_handleTreatment_FullHeal", [_caller, _target, _selectionName, _removeItem, true]] call ace_common_fnc_localEvent; ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on success @@ -54,18 +54,18 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; _removeItem = _this select 3; _prevAnim = _this select 4; - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); }; - [QGVAR(treatmentIconID), false, "", [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), false, "", [1,1,1,1]] call EFUNC(common,displayIcon); ["Medical_handleTreatment_FullHeal", [_caller, _target, _selectionName, _removeItem, false]] call ace_common_fnc_localEvent; ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on failure [_caller, _target, _selectionName, _removeItem, _prevAnim] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); if (!(_unit getvariable [QEGVAR(common,isDead),false]) && alive _unit) then { diff --git a/addons/medical/functions/fnc_handleTreatment_Category_Advanced.sqf b/addons/medical/functions/fnc_handleTreatment_Category_Advanced.sqf index 2189a57a29..e74f86c438 100644 --- a/addons/medical/functions/fnc_handleTreatment_Category_Advanced.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Category_Advanced.sqf @@ -31,7 +31,7 @@ if (vehicle _caller == _caller && (vehicle _target == _target) && !(stance _call if (ACE_player == _caller) then { // Displaying the treatment icon action - [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\icon_advanced_treatment.paa)), [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\icon_advanced_treatment.paa)), [1,1,1,1]] call EFUNC(common,displayIcon); }; _isHandled = switch (_removeItem) do { @@ -77,7 +77,7 @@ _isHandled = switch (_removeItem) do { _selectionName = _this select 2; _removeItem = _this select 3; _prevAnim = _this select 4; - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); @@ -87,7 +87,7 @@ _isHandled = switch (_removeItem) do { ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on failure [_caller, _target, _selectionName, _removeItem, _prevAnim] // arguments - ] call EFUNC(gui,loadingBar); + ] call EFUNC(common,loadingBar); true; }; }; diff --git a/addons/medical/functions/fnc_handleTreatment_Category_Airway.sqf b/addons/medical/functions/fnc_handleTreatment_Category_Airway.sqf index 3456e6df18..0c6d2b0f65 100644 --- a/addons/medical/functions/fnc_handleTreatment_Category_Airway.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Category_Airway.sqf @@ -31,7 +31,7 @@ if (_part == 0 || _part == 1) exitwith { if (ACE_player == _caller) then { // Displaying the treatment icon action - [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\icon_airway_management.paa)), [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\icon_airway_management.paa)), [1,1,1,1]] call EFUNC(common,displayIcon); }; // Get the current position for the treatment person @@ -57,7 +57,7 @@ if (_part == 0 || _part == 1) exitwith { }, // on success { private ["_caller","_target", "_selectionName", "_prevAnim"]; - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); @@ -67,7 +67,7 @@ if (_part == 0 || _part == 1) exitwith { ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on failure [_caller, _target, _selectionName, _removeItem, _prevAnim] // arguments - ] call EFUNC(gui,loadingBar); + ] call EFUNC(common,loadingBar); true; }; // TODO display message to caller diff --git a/addons/medical/functions/fnc_handleTreatment_Category_Bandaging.sqf b/addons/medical/functions/fnc_handleTreatment_Category_Bandaging.sqf index c1113166f5..64239d7a83 100644 --- a/addons/medical/functions/fnc_handleTreatment_Category_Bandaging.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Category_Bandaging.sqf @@ -39,11 +39,11 @@ if (ACE_player == _caller) then { }; default { - [_caller, "STR_ACE_BANDAGING", "STR_ACE_APPLY_BANDAGE", 0, [[_target] call EFUNC(common,getName), _selectionName]] call EFUNC(gui,sendDisplayMessageTo); + [_caller, "STR_ACE_BANDAGING", "STR_ACE_APPLY_BANDAGE", 0, [[_target] call EFUNC(common,getName), _selectionName]] call EFUNC(common,sendDisplayMessageTo); }; }; // Displaying the treatment icon action - [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\bandage_fracture_small.paa)), [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\bandage_fracture_small.paa)), [1,1,1,1]] call EFUNC(common,displayIcon); }; // Get the current position for the treatment person @@ -83,7 +83,7 @@ if (isnil QGVAR(setting_bandageWaitingTime)) then { }, // on success { private ["_caller","_target","_selectedData", "_selectionName", "_prevAnim"]; - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); @@ -92,6 +92,6 @@ if (isnil QGVAR(setting_bandageWaitingTime)) then { ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on failure [_caller, _target, _selectionName, _removeItem, _prevAnim] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); true; \ No newline at end of file diff --git a/addons/medical/functions/fnc_handleTreatment_Category_Medication.sqf b/addons/medical/functions/fnc_handleTreatment_Category_Medication.sqf index f57ab20783..980c478226 100644 --- a/addons/medical/functions/fnc_handleTreatment_Category_Medication.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Category_Medication.sqf @@ -28,7 +28,7 @@ if (vehicle _caller == _caller && (vehicle _target == _target) && !(stance _call if (ACE_player == _caller) then { // Displaying the treatment icon action - [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\medication_small.paa)), [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\medication_small.paa)), [1,1,1,1]] call EFUNC(common,displayIcon); }; // Get the current position for the treatment person @@ -54,7 +54,7 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; }, // on success { private ["_caller","_target", "_selectionName", "_prevAnim"]; - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); @@ -64,6 +64,6 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on failure [_caller, _target, _selectionName, _removeItem, _prevAnim] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); true; diff --git a/addons/medical/functions/fnc_initalizeModuleCMS.sqf b/addons/medical/functions/fnc_initalizeModuleCMS.sqf index 40e50c6fb0..79d9f8083d 100644 --- a/addons/medical/functions/fnc_initalizeModuleCMS.sqf +++ b/addons/medical/functions/fnc_initalizeModuleCMS.sqf @@ -46,7 +46,7 @@ if (GVAR(setting_AdvancedLevel) == -1) exitwith{}; GVAR(isEnabled) = true; -waituntil{!isnil "ACE_gui" && !isnil "ACE_common"}; +waituntil{!isnil "ACE_common"}; if (GVAR(setting_AdvancedLevel) > 0) then { diff --git a/addons/medical/functions/fnc_moduleAssignMedicalEquipment.sqf b/addons/medical/functions/fnc_moduleAssignMedicalEquipment.sqf index f26cfd9ffc..7ffeea2002 100644 --- a/addons/medical/functions/fnc_moduleAssignMedicalEquipment.sqf +++ b/addons/medical/functions/fnc_moduleAssignMedicalEquipment.sqf @@ -21,7 +21,6 @@ private ["_logic","_setting","_objects", "_medicsLoadout", "_nonMedics", "_code" _logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; if (!isNull _logic) then { _setting = _logic getvariable ["equipment",0]; - waituntil {!isnil "ACE_gui"}; // ensure the player unit is available. waituntil {time>0}; _start = diag_tickTime; diff --git a/addons/medical/functions/fnc_onTreatmentCompleted.sqf b/addons/medical/functions/fnc_onTreatmentCompleted.sqf index 4505575f00..146e55c3b1 100644 --- a/addons/medical/functions/fnc_onTreatmentCompleted.sqf +++ b/addons/medical/functions/fnc_onTreatmentCompleted.sqf @@ -23,4 +23,4 @@ if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { [_caller,false] call FUNC(treatmentMutex); // TODO: BUG: if AI finishes treatment, it will also hide the icon for the player -[QGVAR(treatmentIconID), false, "", [1,1,1,1]] call EFUNC(gui,displayIcon); +[QGVAR(treatmentIconID), false, "", [1,1,1,1]] call EFUNC(common,displayIcon); diff --git a/addons/medical/ui/define.hpp b/addons/medical/ui/define.hpp index 3af837e4f1..be45e0ff90 100644 --- a/addons/medical/ui/define.hpp +++ b/addons/medical/ui/define.hpp @@ -1 +1 @@ -#include "\z\ace\addons\gui\UI\define.hpp" \ No newline at end of file +#include "\z\ace\addons\common\define.hpp" \ No newline at end of file diff --git a/addons/medical/ui/menu.hpp b/addons/medical/ui/menu.hpp index f65b5ab807..db7266d0e7 100644 --- a/addons/medical/ui/menu.hpp +++ b/addons/medical/ui/menu.hpp @@ -1,8 +1,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(gui,blurScreen); [_this select 0] call FUNC(onMenuOpen);); - onUnload = QUOTE([ARR_2(QUOTE(QGVAR(id)), false)] call EFUNC(gui,blurScreen); [ARR_2(QUOTE(QGVAR(onMenuOpen)), 'onEachFrame')] call BIS_fnc_removeStackedEventHandler;); + 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); [ARR_2(QUOTE(QGVAR(onMenuOpen)), 'onEachFrame')] call BIS_fnc_removeStackedEventHandler;); class controlsBackground { class HeaderBackground: ACE_gui_backgroundBase{ idc = -1; From 0ae41609c2db42373540a40319bdebaa0fca202d Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 20:20:03 +0100 Subject: [PATCH 067/166] no fcs for ais --- addons/fcs/functions/fnc_firedEH.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/fcs/functions/fnc_firedEH.sqf b/addons/fcs/functions/fnc_firedEH.sqf index 38e2c90f3c..237b68fc87 100644 --- a/addons/fcs/functions/fnc_firedEH.sqf +++ b/addons/fcs/functions/fnc_firedEH.sqf @@ -25,7 +25,8 @@ private ["_gunner", "_turret"]; _gunner = [_vehicle, _weapon] call EFUNC(common,getGunner); _turret = [_gunner] call EFUNC(common,getTurretIndex); -//if (ACE_player != _gunner) exitWith {}; // global +// Exit if the unit isn't a player +if !([_unit] call EFUNC(common,isPlayer)) exitWith {}; private ["_FCSMagazines", "_FCSElevation", "_offset"]; From 13c21275744977da578b973f0a2c393b6cc85f69 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 14 Feb 2015 20:29:07 +0100 Subject: [PATCH 068/166] Clean up of old CSE code Removed all _F suffixes Reorganized the RPEP list. Removed unnecessary functions. --- addons/common/CfgEventHandlers.hpp | 2 +- addons/common/XEH_preInit.sqf | 131 ++++++++---------- .../functions/fnc_broadcastSound3D_f.sqf | 16 --- .../functions/fnc_closeAllDialogs_f.sqf | 14 -- ...{fnc_disableAI_f.sqf => fnc_disableAI.sqf} | 0 addons/common/functions/fnc_dropWeapon_f.sqf | 39 ------ addons/common/functions/fnc_findItem.sqf | 25 ---- addons/common/functions/fnc_findMagazine.sqf | 21 --- .../common/functions/fnc_getCanInteract.sqf | 12 -- .../functions/fnc_getCustomResults_f.sqf | 45 ------ .../common/functions/fnc_getWeaponItems_f.sqf | 14 -- .../{fnc_inWater_f.sqf => fnc_inWater.sqf} | 0 addons/common/functions/fnc_isHC.sqf | 24 ---- ..._isModLoaded_f.sqf => fnc_isModLoaded.sqf} | 0 ...nc_loadPerson_f.sqf => fnc_loadPerson.sqf} | 6 +- ...sonLocal_f.sqf => fnc_loadPersonLocal.sqf} | 6 +- .../common/functions/fnc_moveToTempGroup.sqf | 6 +- ...efaults_f.sqf => fnc_resetAllDefaults.sqf} | 10 +- .../common/functions/fnc_revealObject_f.sqf | 15 -- ..._sendRequest_f.sqf => fnc_sendRequest.sqf} | 0 .../fnc_setDisableUserInputStatus.sqf | 10 +- ...{fnc_setVolume_f.sqf => fnc_setVolume.sqf} | 0 ...upSide_f.sqf => fnc_switchToGroupSide.sqf} | 6 +- ...nloadPerson_f.sqf => fnc_unloadPerson.sqf} | 8 +- addons/medical/XEH_postInit.sqf | 4 +- addons/medical/XEH_preInit.sqf | 4 +- .../medical/functions/fnc_actionCarryUnit.sqf | 2 +- .../medical/functions/fnc_actionDragUnit.sqf | 2 +- .../medical/functions/fnc_actionLoadUnit.sqf | 2 +- .../functions/fnc_actionPlaceInBodyBag.sqf | 2 +- .../functions/fnc_actionUnloadUnit.sqf | 2 +- ...OfBody_f.sqf => fnc_cleanUpCopyOfBody.sqf} | 6 +- .../functions/fnc_getBloodVolumeChange.sqf | 2 +- .../functions/fnc_getUnconsciousCondition.sqf | 6 +- .../medical/functions/fnc_handleDropUnit.sqf | 2 +- ...c_handleTreatment_Action_fullHealLocal.sqf | 2 +- .../functions/fnc_handleUnitVitals.sqf | 2 +- ...opyOfBody_f.sqf => fnc_makeCopyOfBody.sqf} | 0 .../functions/fnc_moduleBasicRevive.sqf | 8 +- addons/medical/functions/fnc_onKilled.sqf | 4 +- .../functions/fnc_onStartMovingUnit.sqf | 2 +- .../fnc_registerUnconsciousCondition.sqf | 6 +- addons/medical/functions/fnc_setDead.sqf | 16 +-- .../functions/fnc_setUnconsciousState.sqf | 14 +- 44 files changed, 129 insertions(+), 369 deletions(-) delete mode 100644 addons/common/functions/fnc_broadcastSound3D_f.sqf delete mode 100644 addons/common/functions/fnc_closeAllDialogs_f.sqf rename addons/common/functions/{fnc_disableAI_f.sqf => fnc_disableAI.sqf} (100%) delete mode 100644 addons/common/functions/fnc_dropWeapon_f.sqf delete mode 100644 addons/common/functions/fnc_findItem.sqf delete mode 100644 addons/common/functions/fnc_findMagazine.sqf delete mode 100644 addons/common/functions/fnc_getCanInteract.sqf delete mode 100644 addons/common/functions/fnc_getCustomResults_f.sqf delete mode 100644 addons/common/functions/fnc_getWeaponItems_f.sqf rename addons/common/functions/{fnc_inWater_f.sqf => fnc_inWater.sqf} (100%) delete mode 100644 addons/common/functions/fnc_isHC.sqf rename addons/common/functions/{fnc_isModLoaded_f.sqf => fnc_isModLoaded.sqf} (100%) rename addons/common/functions/{fnc_loadPerson_f.sqf => fnc_loadPerson.sqf} (86%) rename addons/common/functions/{fnc_loadPersonLocal_f.sqf => fnc_loadPersonLocal.sqf} (83%) rename addons/common/functions/{fnc_resetAllDefaults_f.sqf => fnc_resetAllDefaults.sqf} (74%) delete mode 100644 addons/common/functions/fnc_revealObject_f.sqf rename addons/common/functions/{fnc_sendRequest_f.sqf => fnc_sendRequest.sqf} (100%) rename addons/common/functions/{fnc_setVolume_f.sqf => fnc_setVolume.sqf} (100%) rename addons/common/functions/{fnc_switchToGroupSide_f.sqf => fnc_switchToGroupSide.sqf} (92%) rename addons/common/functions/{fnc_unloadPerson_f.sqf => fnc_unloadPerson.sqf} (89%) rename addons/medical/functions/{fnc_cleanUpCopyOfBody_f.sqf => fnc_cleanUpCopyOfBody.sqf} (76%) rename addons/medical/functions/{fnc_makeCopyOfBody_f.sqf => fnc_makeCopyOfBody.sqf} (100%) diff --git a/addons/common/CfgEventHandlers.hpp b/addons/common/CfgEventHandlers.hpp index b9c5d7e4ce..522df03d4f 100644 --- a/addons/common/CfgEventHandlers.hpp +++ b/addons/common/CfgEventHandlers.hpp @@ -38,7 +38,7 @@ class Extended_Respawn_EventHandlers { respawn = QUOTE(_this call FUNC(setName)); }; class GVAR(RESETDefaults) { - respawn = QUOTE(_this call FUNC(resetAllDefaults_F)); + respawn = QUOTE(_this call FUNC(resetAllDefaults)); }; }; }; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 64a06a0f8c..7a70ae7bb3 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -15,12 +15,16 @@ PREP(addSetting); PREP(adminKick); PREP(ambientBrightness); PREP(applyForceWalkStatus); +PREP(beingCarried); PREP(binarizeNumber); PREP(callCustomEventHandlers); PREP(callCustomEventHandlersGlobal); PREP(canGetInPosition); +PREP(canInteract); PREP(canInteractWith); PREP(canUseWeapon); +PREP(carriedByObj); +PREP(carryObj); PREP(changeProjectileDirection); PREP(checkPBOs); PREP(claim); @@ -30,6 +34,10 @@ PREP(codeToString); PREP(convertKeyCode); PREP(createOrthonormalReference); PREP(currentChannel); +PREP(debug); +PREP(debugModule); +PREP(defineVariable); +PREP(disableAI); PREP(disableUserInput); PREP(displayText); PREP(displayTextPicture); @@ -42,12 +50,21 @@ PREP(execRemoteFnc); PREP(executePersistent); PREP(filter); PREP(fixLoweredRifleAnimation); +PREP(getAllDefinedSetVariables); PREP(getAllGear); PREP(getCaptivityStatus); +PREP(getCarriedBy); +PREP(getCarriedObj); PREP(getConfigCommander); PREP(getConfigGunner); +PREP(getDeathAnim); PREP(getDefaultAnim); +PREP(getDefinedVariable); +PREP(getDefinedVariableDefault); +PREP(getDefinedVariableInfo); PREP(getDoorTurrets); +PREP(getFirstObjectIntersection); +PREP(getFirstTerrainIntersection); PREP(getForceWalkStatus); PREP(getGunner); PREP(getHitPoints); @@ -56,6 +73,7 @@ PREP(getInPosition); PREP(getMarkerType); PREP(getName); PREP(getNumberFromMissionSQM); +PREP(getNumberMagazinesIn); PREP(getPitchBankYaw); PREP(getSettingData); PREP(getStringFromMissionSQM); @@ -74,29 +92,44 @@ PREP(getUavControlPosition); PREP(getVehicleCargo); PREP(getVehicleCodriver); PREP(getVehicleCrew); +PREP(getVersion); PREP(getWeaponAzimuthAndInclination); PREP(getWeaponIndex); PREP(getWeaponType); PREP(getWindDirection); PREP(goKneeling); PREP(hadamardProduct); +PREP(hasItem); +PREP(hasMagazine); +PREP(inheritsFrom); +PREP(insertionSort); PREP(interpolateFromArray); PREP(inTransitionAnim); +PREP(inWater); +PREP(isArrested); PREP(isAutoWind); +PREP(isAwake); PREP(isEngineer); PREP(isEOD); +PREP(isHC); PREP(isInBuilding); +PREP(isModLoaded); PREP(isPlayer); PREP(isTurnedOut); PREP(letterToCode); +PREP(limitMovementSpeed); +PREP(loadPerson); +PREP(loadPersonLocal); PREP(loadSettingsFromProfile); PREP(loadSettingsOnServer); PREP(map); PREP(moduleCheckPBOs); PREP(moduleLSDVehicles); +PREP(moveToTempGroup); PREP(muteUnit); PREP(numberToDigits); PREP(numberToDigitsString); +PREP(onAnswerRequest); PREP(onLoadRscDisplayChannel); PREP(owned); PREP(player); @@ -104,33 +137,53 @@ PREP(playerSide); PREP(progressBar); PREP(queueAnimation); PREP(readSettingFromModule); +PREP(receiveRequest); PREP(removeActionEventHandler); PREP(removeActionMenuEventHandler); PREP(removeCameraEventHandler); PREP(removeCustomEventHandler); PREP(removeMapMarkerCreatedEventHandler); PREP(removeScrollWheelEventHandler); +PREP(requestCallback); +PREP(resetAllDefaults); PREP(restoreVariablesJIP); PREP(revertKeyCodeLocalized); PREP(sanitizeString); +PREP(sendRequest); PREP(serverLog); +PREP(setArrestState); +PREP(setCanInteract); PREP(setCaptivityStatus); +PREP(setCarriedBy); +PREP(setDefinedVariable); +PREP(setDisableUserInputStatus); PREP(setForceWalkStatus); +PREP(setHearingCapability); PREP(setName); PREP(setParameter); PREP(setPitchBankYaw); -PREP(setVariableJIP); -PREP(setVariablePublic); +PREP(setProne); PREP(setSetting); PREP(setSettingFromConfig); +PREP(setVariableJIP); +PREP(setVariablePublic); +PREP(setVolume); +PREP(sortAlphabeticallyBy); +PREP(stringCompare); PREP(stringToColoredText); +PREP(string_removeWhiteSpace); PREP(subString); +PREP(switchToGroupSide); +PREP(throttledPublicVariable); PREP(toBin); PREP(toBitmask); PREP(toHex); PREP(toNumber); -PREP(throttledPublicVariable); +PREP(uniqueElementsOnly); +PREP(unloadPerson); PREP(unmuteUnit); +PREP(useItem); +PREP(useMagazine); PREP(waitAndExecute); // ACE_Debug @@ -195,74 +248,6 @@ if (hasInterface) then { }, 0, []] call cba_fnc_addPerFrameHandler; }; -PREP(stringCompare); -PREP(string_removeWhiteSpace); -PREP(isHC); -PREP(sendRequest_f); -PREP(requestCallback); -PREP(receiveRequest); -PREP(onAnswerRequest); -PREP(debug); -PREP(debugModule); -PREP(defineVariable); -PREP(setDefinedVariable); -PREP(getDefinedVariable); -PREP(getAllDefinedSetVariables); -PREP(getDefinedVariableInfo); -PREP(getDefinedVariableDefault); -PREP(getDeathAnim); -PREP(insertionSort); -PREP(uniqueElementsOnly); -PREP(sortAlphabeticallyBy); -PREP(hasMagazine); -PREP(useMagazine); -PREP(findMagazine); -PREP(hasItem); -PREP(useItem); -PREP(findItem); -PREP(getNumberMagazinesIn); -PREP(setCanInteract); -PREP(getCanInteract); -PREP(canInteract); -PREP(resetAllDefaults_f); -PREP(broadcastSound3D_f); - -PREP(isAwake); -PREP(setProne); - -PREP(setDisableUserInputStatus); - -PREP(dropWeapon_f); -PREP(inWater_f); -PREP(setVolume_f); -PREP(closeAllDialogs_f); -PREP(disableAI_f); -PREP(switchToGroupSide_f); -PREP(getFirstObjectIntersection); -PREP(getFirstTerrainIntersection); -PREP(setHearingCapability); -PREP(revealObject_f); -PREP(getWeaponItems_f); -PREP(isModLoaded_f); -PREP(inheritsFrom); -PREP(getVersion); -PREP(carryObj); -PREP(carriedByObj); -PREP(getCarriedObj); -PREP(getCarriedBy); -PREP(beingCarried); -PREP(setCarriedBy); - - -PREP(moveToTempGroup); - - -PREP(limitMovementSpeed); -PREP(setArrestState); -PREP(isArrested); -PREP(loadPerson_F); -PREP(loadPersonLocal_F); -PREP(unloadPerson_F); - - ADDON = true; + +isHC = !(hasInterface || isDedicated); diff --git a/addons/common/functions/fnc_broadcastSound3D_f.sqf b/addons/common/functions/fnc_broadcastSound3D_f.sqf deleted file mode 100644 index 93f95bb431..0000000000 --- a/addons/common/functions/fnc_broadcastSound3D_f.sqf +++ /dev/null @@ -1,16 +0,0 @@ -/** - * fn_broadcastSound3D_f.sqf - * @Descr: Plays a sound in 3D - * @Author: Glowbal - * - * @Arguments: [unit OBJECT, sound STRING] - * @Return: void - * @PublicAPI: true - */ - -#include "script_component.hpp" - -if (isDedicated) exitwith{}; -_unit = [_this, 0, ObjNull,[ObjNull]] call BIS_fnc_Param; -_sound = [_this, 1, "",[""]] call BIS_fnc_Param; -_unit say3D _sound; \ No newline at end of file diff --git a/addons/common/functions/fnc_closeAllDialogs_f.sqf b/addons/common/functions/fnc_closeAllDialogs_f.sqf deleted file mode 100644 index b5ce1bc280..0000000000 --- a/addons/common/functions/fnc_closeAllDialogs_f.sqf +++ /dev/null @@ -1,14 +0,0 @@ -/** - * fn_closeAllDialogs_f.sqf - * @Descr: Close all dialogs - * @Author: Glowbal - * - * @Arguments: [] - * @Return: void - * @PublicAPI: true - */ -#include "script_component.hpp" - -while {dialog} do { - closeDialog 0; -}; \ No newline at end of file diff --git a/addons/common/functions/fnc_disableAI_f.sqf b/addons/common/functions/fnc_disableAI.sqf similarity index 100% rename from addons/common/functions/fnc_disableAI_f.sqf rename to addons/common/functions/fnc_disableAI.sqf diff --git a/addons/common/functions/fnc_dropWeapon_f.sqf b/addons/common/functions/fnc_dropWeapon_f.sqf deleted file mode 100644 index bf1358b5e7..0000000000 --- a/addons/common/functions/fnc_dropWeapon_f.sqf +++ /dev/null @@ -1,39 +0,0 @@ -/** - * fn_dropWeapon_f.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ -#include "script_component.hpp" -private ["_unit","_currentWeapon","_currentAnimation", "_WeaponHolder"]; -_unit = [_this, 0, ObjNull,[ObjNull]] call BIS_fnc_Param; - -_currentWeapon = currentWeapon _unit; -_currentAnimation = animationState _unit; -_WeaponHolder = "GroundWeaponHolder" createVehicle position _unit; - -_unit removeWeapon _currentWeapon; -_weaponHolder addWeaponCargoGlobal [_currentWeapon, 1]; -//_unit action [ "DropWeapon", _WeaponHolder, _currentWeapon ]; -_WeaponHolder setPos (getPos _unit); -//_unit switchMove _currentAnimation; - -_primairyWeapon = primaryWeapon _unit; -_secondairyWeapon = secondaryWeapon _unit; -_handGunWeapon = handgunWeapon _unit; - -switch (_currentWeapon) do { - case _primairyWeapon: { - - }; - case _secondairyWeapon: { - - }; - case _handGunWeapon: { - - }; - default {}; -}; \ No newline at end of file diff --git a/addons/common/functions/fnc_findItem.sqf b/addons/common/functions/fnc_findItem.sqf deleted file mode 100644 index 5c4469ea7f..0000000000 --- a/addons/common/functions/fnc_findItem.sqf +++ /dev/null @@ -1,25 +0,0 @@ -/** - * fn_findItem.sqf - * @Descr: - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: true - */ -#include "script_component.hpp" -private ["_unit","_magazine","_return"]; -_unit = _this select 0; -_item = _this select 1; - -if (_item in (uniformItems _unit)) exitwith {1}; -if (_item in (vestItems _unit)) exitwith {2}; -if (_item in (backpackItems _unit)) exitwith {3}; -if (_item in (assignedItems _unit)) exitwith {4}; -if (_item in (primaryWeaponItems _unit)) exitwith {5}; -if (_item in (secondaryWeaponItems _unit)) exitwith {6}; -if (_item in (handgunItems _unit)) exitwith {7}; -if (_item in (items _unit)) exitwith {8}; // in case it is in items but cannot be found in any other container (should never reach this) - -// If we cannot find the item, return 0. -0; \ No newline at end of file diff --git a/addons/common/functions/fnc_findMagazine.sqf b/addons/common/functions/fnc_findMagazine.sqf deleted file mode 100644 index 549d016e8d..0000000000 --- a/addons/common/functions/fnc_findMagazine.sqf +++ /dev/null @@ -1,21 +0,0 @@ -/** - * fn_findMagazine.sqf - * @Descr: Find where the current magazines are. Order: uniform, vest, backpack, any. - * @Author: Glowbal - * - * @Arguments: [unit OBJECT, magazine STRING (Classname of magazine)] - * @Return: NUMBER 0 = none, 1 = in uniform, 2 = in vest, 3 = in backpack, 4 = found outside container - * @PublicAPI: true - */ -#include "script_component.hpp" -private ["_unit","_magazine"]; -_unit = _this select 0; -_magazine = _this select 1; - -if (_magazine in (getMagazineCargo uniformContainer _unit)) exitwith {1}; -if (_magazine in (getMagazineCargo vestContainer _unit)) exitwith {2}; -if (_magazine in (getMagazineCargo backpackContainer _unit)) exitwith {3}; -if (_magazine in (magazines _unit)) exitwith {4}; // in case it cannot be found in any other container. Most likely loaded in a weapon. - -// If we cannot find the item, return 0. -0; \ No newline at end of file diff --git a/addons/common/functions/fnc_getCanInteract.sqf b/addons/common/functions/fnc_getCanInteract.sqf deleted file mode 100644 index 87f572b93d..0000000000 --- a/addons/common/functions/fnc_getCanInteract.sqf +++ /dev/null @@ -1,12 +0,0 @@ -/** - * fn_getCanInteract.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ -#include "script_component.hpp" - -((_this select 0) getvariable [QGVAR(canInteract),0]) \ No newline at end of file diff --git a/addons/common/functions/fnc_getCustomResults_f.sqf b/addons/common/functions/fnc_getCustomResults_f.sqf deleted file mode 100644 index 4b68f85c9c..0000000000 --- a/addons/common/functions/fnc_getCustomResults_f.sqf +++ /dev/null @@ -1,45 +0,0 @@ -/** - * fn_getCustomResults_f.sqf - * @Descr: Executes custom results eventhandlers, collects their output and returns this. - * @Author: Glowbal - * - * @Arguments: [arguments ANY, handle STRING] - * @Return: ARRAY Collection of all return values of all executed CustomResult handlers - * @PublicAPI: true - */ - -#include "script_component.hpp" - -private ["_arguments","_handle","_ehCfg","_eventHandlerCollection","_eventHandlerName","_cfg","_code","_classType", "_return"]; -_arguments = _this select 0; -_handle = _this select 1; - -_eventHandlerName = ("ace_f_custom_results_eventhandler_" + _handle); -_eventHandlerCollection = missionNamespace getvariable _eventHandlerName; -if (isnil "_eventHandlerCollection") then { - _eventHandlerCollection = []; - - // TODO Get a replacement for this - _cfg = (ConfigFile >> "Advanced_Combat_Environment" >> "CustomResults" >> _handle); - if (isClass _cfg) then { - _numberOfEH = count _cfg; - for [{_EHiterator=0}, {(_EHiterator< _numberOfEH)}, {_EHiterator=_EHiterator+1}] do { - _ehCfg = _cfg select _EHiterator; - if (isClass _ehCfg) then { - _classType = (ConfigName _ehCfg); - _code = (compile getText(_ehCfg >> "onCall")); - _eventHandlerCollection pushback [_classType, _code]; - true; - }; - }; - }; - missionNamespace setvariable [_eventHandlerName, _eventHandlerCollection]; -}; - -_return = []; -{ - _return pushback (_arguments call (_x select 1)); - false; -}count _eventHandlerCollection; - -_return diff --git a/addons/common/functions/fnc_getWeaponItems_f.sqf b/addons/common/functions/fnc_getWeaponItems_f.sqf deleted file mode 100644 index d18ce28a72..0000000000 --- a/addons/common/functions/fnc_getWeaponItems_f.sqf +++ /dev/null @@ -1,14 +0,0 @@ -/** - * fn_getWeaponItems_f.sqf - * @Descr: Get the weapon items from the unit. - * @Author: Glowbal - * - * @Arguments: [unit OBJECT] - * @Return: - * @PublicAPI: false - */ -#include "script_component.hpp" -private "_unit"; -_unit = _this select 0; - -[primaryWeaponItems _unit, secondaryWeaponItems _unit, handgunItems _unit]; \ No newline at end of file diff --git a/addons/common/functions/fnc_inWater_f.sqf b/addons/common/functions/fnc_inWater.sqf similarity index 100% rename from addons/common/functions/fnc_inWater_f.sqf rename to addons/common/functions/fnc_inWater.sqf diff --git a/addons/common/functions/fnc_isHC.sqf b/addons/common/functions/fnc_isHC.sqf deleted file mode 100644 index 82a9d49ba2..0000000000 --- a/addons/common/functions/fnc_isHC.sqf +++ /dev/null @@ -1,24 +0,0 @@ -/** - * fn_isHC.sqf - * @Descr: Check if current locality is a headless client - * @Author: Glowbal - * - * @Arguments: [] - * @Return: BOOL True if locality is headless client OR is not in multiplayer - * @PublicAPI: true - */ - -#include "script_component.hpp" - -private ["_return"]; - -if (!isMultiplayer) then { - _return = true; -} else { - if (isServer && !isDedicated) then { - _return = true; - } else { - _return = !(hasInterface || isDedicated); - }; -}; -_return \ No newline at end of file diff --git a/addons/common/functions/fnc_isModLoaded_f.sqf b/addons/common/functions/fnc_isModLoaded.sqf similarity index 100% rename from addons/common/functions/fnc_isModLoaded_f.sqf rename to addons/common/functions/fnc_isModLoaded.sqf diff --git a/addons/common/functions/fnc_loadPerson_f.sqf b/addons/common/functions/fnc_loadPerson.sqf similarity index 86% rename from addons/common/functions/fnc_loadPerson_f.sqf rename to addons/common/functions/fnc_loadPerson.sqf index 5944879c62..0d2995db1b 100644 --- a/addons/common/functions/fnc_loadPerson_f.sqf +++ b/addons/common/functions/fnc_loadPerson.sqf @@ -10,7 +10,7 @@ #include "script_component.hpp" -#define GROUP_SWITCH_ID QUOTE(FUNC(loadPerson_F)) +#define GROUP_SWITCH_ID QUOTE(FUNC(loadPerson)) private ["_caller", "_unit","_vehicle", "_loadcar", "_loadhelicopter", "_loadtank"]; _caller = [_this, 0, ObjNull,[ObjNull]] call BIS_fnc_Param; @@ -34,9 +34,9 @@ if (_unit distance _loadcar <= 10) then { }; }; if (!isNull _vehicle) then { - [_unit, true, GROUP_SWITCH_ID, side group _caller] call FUNC(switchToGroupSide_f); + [_unit, true, GROUP_SWITCH_ID, side group _caller] call FUNC(switchToGroupSide); [_caller,objNull] call FUNC(carryObj); [_unit,objNull] call FUNC(carryObj); - [[_unit, _vehicle,_caller], QUOTE(FUNC(loadPersonLocal_F)), _unit, false] call EFUNC(common,execRemoteFnc); + [[_unit, _vehicle,_caller], QUOTE(FUNC(loadPersonLocal)), _unit, false] call EFUNC(common,execRemoteFnc); }; _vehicle \ No newline at end of file diff --git a/addons/common/functions/fnc_loadPersonLocal_f.sqf b/addons/common/functions/fnc_loadPersonLocal.sqf similarity index 83% rename from addons/common/functions/fnc_loadPersonLocal_f.sqf rename to addons/common/functions/fnc_loadPersonLocal.sqf index dbba09111a..6e31050cf9 100644 --- a/addons/common/functions/fnc_loadPersonLocal_f.sqf +++ b/addons/common/functions/fnc_loadPersonLocal.sqf @@ -16,13 +16,13 @@ _vehicle = [_this, 1, ObjNull,[ObjNull]] call BIS_fnc_Param; _caller = [_this, 2, ObjNull,[ObjNull]] call BIS_fnc_Param; if (!alive _unit) then { - _unit = [_unit,_caller] call FUNC(makeCopyOfBody_F); + _unit = [_unit,_caller] call FUNC(makeCopyOfBody); }; _unit moveInCargo _vehicle; -_loaded = _vehicle getvariable [QGVAR(loaded_persons_F),[]]; +_loaded = _vehicle getvariable [QGVAR(loaded_persons),[]]; _loaded pushback _unit; -_vehicle setvariable [QGVAR(loaded_persons_F),_loaded,true]; +_vehicle setvariable [QGVAR(loaded_persons),_loaded,true]; if (!([_unit] call FUNC(isAwake))) then { _handle = [_unit,_vehicle] spawn { private ["_unit","_vehicle"]; diff --git a/addons/common/functions/fnc_moveToTempGroup.sqf b/addons/common/functions/fnc_moveToTempGroup.sqf index b146e67ef3..802bc2285d 100644 --- a/addons/common/functions/fnc_moveToTempGroup.sqf +++ b/addons/common/functions/fnc_moveToTempGroup.sqf @@ -18,12 +18,12 @@ if (_moveTo) then { _previousGroup = group _unit; _newGroup = createGroup (side _previousGroup); [_unit] joinSilent _newGroup; - _unit setvariable [QGVAR(previousGroup_F),_previousGroup]; + _unit setvariable [QGVAR(previousGroup),_previousGroup]; } else { - _previousGroup = _unit getvariable QGVAR(previousGroup_F); + _previousGroup = _unit getvariable QGVAR(previousGroup); if (!isnil "_previousGroup") then { _currentGroup = group _unit; - _unit setvariable [QGVAR(previousGroup_F),nil]; + _unit setvariable [QGVAR(previousGroup),nil]; [_unit] joinSilent _previousGroup; if (count units _currentGroup == 0) then { deleteGroup _currentGroup; diff --git a/addons/common/functions/fnc_resetAllDefaults_f.sqf b/addons/common/functions/fnc_resetAllDefaults.sqf similarity index 74% rename from addons/common/functions/fnc_resetAllDefaults_f.sqf rename to addons/common/functions/fnc_resetAllDefaults.sqf index c415b5b32c..63e6764d01 100644 --- a/addons/common/functions/fnc_resetAllDefaults_f.sqf +++ b/addons/common/functions/fnc_resetAllDefaults.sqf @@ -17,17 +17,17 @@ _unit setvariable ["ACE_isDead",nil,true]; _unit setvariable ["ACE_isUnconscious", nil, true]; if (isPlayer _unit) then { - [true] call FUNC(setVolume_f); - [false] call FUNC(disableKeyInput_f); - if (["ace_medical"] call FUNC(isModLoader_f)) then { + [true] call FUNC(setVolume); + [false] call FUNC(disableKeyInput); + if (["ace_medical"] call FUNC(isModLoader)) then { [false] call EFUNC(medical,effectBlackOut); }; - if !(isnil QGVAR(DISABLE_USER_INPUT_COLLECTION_F)) then { + if !(isnil QGVAR(DISABLE_USER_INPUT_COLLECTION)) then { // clear all disable user input { [_X, false] call FUNC(setDisableUserInputStatus); - }foreach GVAR(DISABLE_USER_INPUT_COLLECTION_F); + }foreach GVAR(DISABLE_USER_INPUT_COLLECTION); }; }; diff --git a/addons/common/functions/fnc_revealObject_f.sqf b/addons/common/functions/fnc_revealObject_f.sqf deleted file mode 100644 index 9c5a34f59a..0000000000 --- a/addons/common/functions/fnc_revealObject_f.sqf +++ /dev/null @@ -1,15 +0,0 @@ -/** - * fnc_revealObject_f.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -#include "script_component.hpp" - -if (hasInterface) then { - player reveal (_this select 0); -}; \ No newline at end of file diff --git a/addons/common/functions/fnc_sendRequest_f.sqf b/addons/common/functions/fnc_sendRequest.sqf similarity index 100% rename from addons/common/functions/fnc_sendRequest_f.sqf rename to addons/common/functions/fnc_sendRequest.sqf diff --git a/addons/common/functions/fnc_setDisableUserInputStatus.sqf b/addons/common/functions/fnc_setDisableUserInputStatus.sqf index 2451cbe90f..2cf25b827a 100644 --- a/addons/common/functions/fnc_setDisableUserInputStatus.sqf +++ b/addons/common/functions/fnc_setDisableUserInputStatus.sqf @@ -13,16 +13,16 @@ _id = _this select 0; _disable = _this select 1; -if (isnil QGVAR(DISABLE_USER_INPUT_COLLECTION_F)) then { - GVAR(DISABLE_USER_INPUT_COLLECTION_F) = []; +if (isnil QGVAR(DISABLE_USER_INPUT_COLLECTION)) then { + GVAR(DISABLE_USER_INPUT_COLLECTION) = []; }; if (_disable) then { - GVAR(DISABLE_USER_INPUT_COLLECTION_F) pushback _id; + GVAR(DISABLE_USER_INPUT_COLLECTION) pushback _id; [true] call FUNC(disableUserInput); } else { - GVAR(DISABLE_USER_INPUT_COLLECTION_F) = GVAR(DISABLE_USER_INPUT_COLLECTION_F) - [_id]; - if (GVAR(DISABLE_USER_INPUT_COLLECTION_F) isEqualTo []) then { + GVAR(DISABLE_USER_INPUT_COLLECTION) = GVAR(DISABLE_USER_INPUT_COLLECTION) - [_id]; + if (GVAR(DISABLE_USER_INPUT_COLLECTION) isEqualTo []) then { [false] call FUNC(disableUserInput); }; }; \ No newline at end of file diff --git a/addons/common/functions/fnc_setVolume_f.sqf b/addons/common/functions/fnc_setVolume.sqf similarity index 100% rename from addons/common/functions/fnc_setVolume_f.sqf rename to addons/common/functions/fnc_setVolume.sqf diff --git a/addons/common/functions/fnc_switchToGroupSide_f.sqf b/addons/common/functions/fnc_switchToGroupSide.sqf similarity index 92% rename from addons/common/functions/fnc_switchToGroupSide_f.sqf rename to addons/common/functions/fnc_switchToGroupSide.sqf index 97b043adbe..528d32853c 100644 --- a/addons/common/functions/fnc_switchToGroupSide_f.sqf +++ b/addons/common/functions/fnc_switchToGroupSide.sqf @@ -16,7 +16,7 @@ _switch = [_this, 1, false,[false]] call BIS_fnc_Param; _id = [_this, 2, "", [""]] call BIS_fnc_Param; _side = [_this, 3, side _unit,[west]] call BIS_fnc_Param; -_previousGroupsList = _unit getvariable [QGVAR(previousGroupSwitchTo_F),[]]; +_previousGroupsList = _unit getvariable [QGVAR(previousGroupSwitchTo),[]]; if (_switch) then { // go forward _previousGroup = group _unit; @@ -30,7 +30,7 @@ if (_switch) then { [_unit] joinSilent _newGroup; _previousGroupsList pushback [_previousGroup, _originalSide, _id, true]; - _unit setvariable [QGVAR(previousGroupSwitchTo_F), _previousGroupsList, true]; + _unit setvariable [QGVAR(previousGroupSwitchTo), _previousGroupsList, true]; } else { // go one back { @@ -60,5 +60,5 @@ if (_switch) then { }foreach _previousGroupsList; _previousGroupsList = _previousGroupsList - [objNull]; reverse _previousGroupsList; // we have to reverse again, to ensure the list is in the right order. - _unit setvariable [QGVAR(previousGroupSwitchTo_F), _previousGroupsList, true]; + _unit setvariable [QGVAR(previousGroupSwitchTo), _previousGroupsList, true]; }; diff --git a/addons/common/functions/fnc_unloadPerson_f.sqf b/addons/common/functions/fnc_unloadPerson.sqf similarity index 89% rename from addons/common/functions/fnc_unloadPerson_f.sqf rename to addons/common/functions/fnc_unloadPerson.sqf index 1aaaee84a1..33c0e9c0c2 100644 --- a/addons/common/functions/fnc_unloadPerson_f.sqf +++ b/addons/common/functions/fnc_unloadPerson.sqf @@ -10,7 +10,7 @@ #include "script_component.hpp" -#define GROUP_SWITCH_ID QUOTE(FUNC(loadPerson_F)) +#define GROUP_SWITCH_ID QUOTE(FUNC(loadPerson)) private ["_caller", "_unit","_vehicle", "_loaded"]; _caller = [_this, 0, ObjNull,[ObjNull]] call BIS_fnc_Param; @@ -27,11 +27,11 @@ if (!alive _unit) then { _unit action ["Eject", vehicle _unit]; }; -[_unit, false, GROUP_SWITCH_ID, side group _caller] call FUNC(switchToGroupSide_f); +[_unit, false, GROUP_SWITCH_ID, side group _caller] call FUNC(switchToGroupSide); -_loaded = _vehicle getvariable [QGVAR(loaded_persons_F),[]]; +_loaded = _vehicle getvariable [QGVAR(loaded_persons),[]]; _loaded = _loaded - [_unit]; -_vehicle setvariable [QGVAR(loaded_persons_F),_loaded,true]; +_vehicle setvariable [QGVAR(loaded_persons),_loaded,true]; if (!([_unit] call FUNC(isAwake))) then { _handle = [_unit,_vehicle] spawn { diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 062df32ddf..6f5c1b5978 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -50,8 +50,8 @@ call FUNC(handleDisplayEffects); ["onUnconscious", FUNC(onUnconscious)] call ace_common_fnc_addEventHandler; ["carryObjectDropped", FUNC(onCarryObjectDropped)] call ace_common_fnc_addEventHandler; -if (isNil QGVAR(ENABLE_REVIVE_F)) then { - GVAR(ENABLE_REVIVE_F) = 0; +if (isNil QGVAR(ENABLE_REVIVE)) then { + GVAR(ENABLE_REVIVE) = 0; }; diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index 57800cd5b7..144c877aeb 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -141,8 +141,8 @@ PREP(setUnconsciousState); PREP(isUnconscious); PREP(getUnconsciousCondition); PREP(registerUnconsciousCondition); -PREP(cleanUpCopyOfBody_F); -PREP(makeCopyOfBody_F); +PREP(cleanUpCopyOfBody); +PREP(makeCopyOfBody); PREP(canGoUnconsciousState); PREP(setDead); PREP(moduleBasicRevive); diff --git a/addons/medical/functions/fnc_actionCarryUnit.sqf b/addons/medical/functions/fnc_actionCarryUnit.sqf index d3cfb35aee..f717efb403 100644 --- a/addons/medical/functions/fnc_actionCarryUnit.sqf +++ b/addons/medical/functions/fnc_actionCarryUnit.sqf @@ -42,7 +42,7 @@ if (!alive _unit) exitwith { [_caller, false] call FUNC(treatmentMutex); [{ _this call FUNC(actionCarryUnit); - }, [_caller, ([_unit,_caller] call FUNC(makeCopyOfBody_F)), _killOnDrop], 0.25, 0.25] call EFUNC(common,waitAndExecute); + }, [_caller, ([_unit,_caller] call FUNC(makeCopyOfBody)), _killOnDrop], 0.25, 0.25] call EFUNC(common,waitAndExecute); }; if !([_caller,_unit] call EFUNC(common,carryObj)) exitwith { diff --git a/addons/medical/functions/fnc_actionDragUnit.sqf b/addons/medical/functions/fnc_actionDragUnit.sqf index d0fa1c70ea..56f88ead9c 100644 --- a/addons/medical/functions/fnc_actionDragUnit.sqf +++ b/addons/medical/functions/fnc_actionDragUnit.sqf @@ -40,7 +40,7 @@ if (!alive _unit) exitwith { [_caller, false] call FUNC(treatmentMutex); [{ _this call FUNC(actionDragUnit); - }, [_caller, ([_unit,_caller] call FUNC(makeCopyOfBody_F)), _killOnDrop], 0.25, 0.25] call EFUNC(common,waitAndExecute); + }, [_caller, ([_unit,_caller] call FUNC(makeCopyOfBody)), _killOnDrop], 0.25, 0.25] call EFUNC(common,waitAndExecute); }; if (primaryWeapon _caller == "") then { diff --git a/addons/medical/functions/fnc_actionLoadUnit.sqf b/addons/medical/functions/fnc_actionLoadUnit.sqf index cd20140bdb..afe70746d2 100644 --- a/addons/medical/functions/fnc_actionLoadUnit.sqf +++ b/addons/medical/functions/fnc_actionLoadUnit.sqf @@ -22,7 +22,7 @@ if ([_unit] call cse_fnc_isAwake) exitwith { [_caller,objNull] call cse_fnc_carryObj; [_unit,objNull] call cse_fnc_carryObj; -_vehicle = [_caller, _unit] call EFUNC(common,loadPerson_F); +_vehicle = [_caller, _unit] call EFUNC(common,loadPerson); if (!isNull _vehicle) then { if (!isnil QGVAR(DROP_ADDACTION)) then { _caller removeAction GVAR(DROP_ADDACTION); diff --git a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf b/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf index 8df95c24d9..fc43fe06d8 100644 --- a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf +++ b/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf @@ -36,7 +36,7 @@ _bodyBagCreated setvariable [QEGVAR(common,nameOfBody), _nameOfUnit, true]; // reset the position to ensure it is on the correct one. _bodyBagCreated setPos _onPosition; -[[_bodyBagCreated], QEFUNC(common,revealObject_f), true] call BIS_fnc_MP; +[[_bodyBagCreated], QEFUNC(common,revealObject), true] call BIS_fnc_MP; _bodyBagCreated setvariable [QEGVAR(logistics,enableDrag), true, true]; diff --git a/addons/medical/functions/fnc_actionUnloadUnit.sqf b/addons/medical/functions/fnc_actionUnloadUnit.sqf index 6eefb4b138..0b6b6fe9de 100644 --- a/addons/medical/functions/fnc_actionUnloadUnit.sqf +++ b/addons/medical/functions/fnc_actionUnloadUnit.sqf @@ -19,7 +19,7 @@ _drag = [_this, 2, false, [false]] call BIS_fnc_Param; if (vehicle _unit == _unit) exitwith {}; if (([_unit] call cse_fnc_isAwake)) exitwith {}; -if ([_caller, _unit] call EFUNC(common,unloadPerson_F)) then { +if ([_caller, _unit] call EFUNC(common,unloadPerson)) then { if (_drag) then { if ((vehicle _caller) == _caller) then { [[_caller,_unit], QUOTE(FUNC(actionDragUnit)), _caller, false] call BIS_fnc_MP; diff --git a/addons/medical/functions/fnc_cleanUpCopyOfBody_f.sqf b/addons/medical/functions/fnc_cleanUpCopyOfBody.sqf similarity index 76% rename from addons/medical/functions/fnc_cleanUpCopyOfBody_f.sqf rename to addons/medical/functions/fnc_cleanUpCopyOfBody.sqf index b20169e9f5..292f332f91 100644 --- a/addons/medical/functions/fnc_cleanUpCopyOfBody_f.sqf +++ b/addons/medical/functions/fnc_cleanUpCopyOfBody.sqf @@ -13,12 +13,12 @@ private ["_unit", "_copy"]; _unit = _this select 0; -_copy = _unit getvariable QGVAR(copyOfBody_f); +_copy = _unit getvariable QGVAR(copyOfBody); if (isnil "_copy") exitwith {false}; [format["Cleaning up a copy of Body: %1 %2", _unit, _copy]] call EFUNC(common,debug); // lets clean it up -_unit setvariable [QGVAR(originalCopy_f), nil, true]; -_unit setvariable [QGVAR(copyOfBody_f), nil, true]; +_unit setvariable [QGVAR(originalCopy), nil, true]; +_unit setvariable [QGVAR(copyOfBody), nil, true]; if (!isNull _copy) then { deleteVehicle _copy; }; diff --git a/addons/medical/functions/fnc_getBloodVolumeChange.sqf b/addons/medical/functions/fnc_getBloodVolumeChange.sqf index 69b240b1d7..cfec53e157 100644 --- a/addons/medical/functions/fnc_getBloodVolumeChange.sqf +++ b/addons/medical/functions/fnc_getBloodVolumeChange.sqf @@ -38,7 +38,7 @@ if (_bloodVolume < 100.0) then { _bloodVolumeChange = _bloodVolumeChange + BLOOD_CHANGE_PER_SECOND; _ivVolume = (_unit getvariable [QGVAR(salineIVVolume), 0]) + IV_CHANGE_PER_SECOND; _unit setvariable [QGVAR(salineIVVolume),_ivVolume]; - if ([QEGVAR(fieldRations,module)] call EFUNC(common,isModuleEnabled_F)) then { + if ([QEGVAR(fieldRations,module)] call EFUNC(common,isModuleEnabled)) then { if ([_unit] call EFUNC(fieldRations,canDrink)) then { _unit setvariable [QEGVAR(fieldRations,drinkStatus), (_unit getvariable [QEGVAR(fieldRations,drinkStatus), 100]) + 0.2]; }; diff --git a/addons/medical/functions/fnc_getUnconsciousCondition.sqf b/addons/medical/functions/fnc_getUnconsciousCondition.sqf index 097a5682ec..a322439742 100644 --- a/addons/medical/functions/fnc_getUnconsciousCondition.sqf +++ b/addons/medical/functions/fnc_getUnconsciousCondition.sqf @@ -13,8 +13,8 @@ private ["_unit","_return"]; _unit = _this select 0; -if (isnil QGVAR(unconsciousConditions_F)) then { - GVAR(unconsciousConditions_F) = []; +if (isnil QGVAR(unconsciousConditions)) then { + GVAR(unconsciousConditions) = []; }; _return = false; @@ -25,5 +25,5 @@ _return = false; }; }; if (_return) exitwith{}; -}foreach GVAR(unconsciousConditions_F); +}foreach GVAR(unconsciousConditions); _return \ No newline at end of file diff --git a/addons/medical/functions/fnc_handleDropUnit.sqf b/addons/medical/functions/fnc_handleDropUnit.sqf index c82fe8ce79..45e1268d30 100644 --- a/addons/medical/functions/fnc_handleDropUnit.sqf +++ b/addons/medical/functions/fnc_handleDropUnit.sqf @@ -26,7 +26,7 @@ if ((isNull ([_caller] call EFUNC(common,getCarriedObj))) || !([_caller] call EF _caller removeWeapon "ACE_FakePrimaryWeapon"; }; - [_target, false] call EFUNC(common,disableAI_f); + [_target, false] call EFUNC(common,disableAI); _caller setvariable[QGVAR(onStartMovingUnitParams), nil]; // handle the drag & carry administration diff --git a/addons/medical/functions/fnc_handleTreatment_Action_fullHealLocal.sqf b/addons/medical/functions/fnc_handleTreatment_Action_fullHealLocal.sqf index 1d08a00e23..414c5c4a28 100644 --- a/addons/medical/functions/fnc_handleTreatment_Action_fullHealLocal.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Action_fullHealLocal.sqf @@ -56,7 +56,7 @@ if (alive _unit) exitwith { _unit setDamage 0; // Resetting potential revive state - [_unit,QEGVAR(common,ENABLE_REVIVE_SETDEAD_F), 0] call EFUNC(common,setDefinedVariable); + [_unit,QEGVAR(common,ENABLE_REVIVE_SETDEAD), 0] call EFUNC(common,setDefinedVariable); [_unit,QEGVAR(common,ENABLE_REVIVE_COUNTER), 0] call EFUNC(common,setDefinedVariable); diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index 7ced1ec393..cb2e77b342 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -93,7 +93,7 @@ if ((missionNamespace getvariable[QGVAR(setting_AdvancedLevel), 0]) > 0) exitwit // Check vitals for medical status // TODO check for in revive state instead of variable - if ((_unit getvariable[QEGVAR(common,ENABLE_REVIVE_SETDEAD_F),0]) == 0) then { + if ((_unit getvariable[QEGVAR(common,ENABLE_REVIVE_SETDEAD),0]) == 0) then { _bloodPressureL = _bloodPressure select 0; _bloodPressureH = _bloodPressure select 1; diff --git a/addons/medical/functions/fnc_makeCopyOfBody_f.sqf b/addons/medical/functions/fnc_makeCopyOfBody.sqf similarity index 100% rename from addons/medical/functions/fnc_makeCopyOfBody_f.sqf rename to addons/medical/functions/fnc_makeCopyOfBody.sqf diff --git a/addons/medical/functions/fnc_moduleBasicRevive.sqf b/addons/medical/functions/fnc_moduleBasicRevive.sqf index b02d873313..79da194024 100644 --- a/addons/medical/functions/fnc_moduleBasicRevive.sqf +++ b/addons/medical/functions/fnc_moduleBasicRevive.sqf @@ -15,10 +15,10 @@ _logic = _this select 0; GVAR(Module) = true; -[_logic, QGVAR(ENABLE_REVIVE_F), "enableFor" ] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(REVIVE_TIMER_MAX_F), "timer" ] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(REVIVE_NUMBER_MAX_F), "amountOf" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(ENABLE_REVIVE), "enableFor" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(REVIVE_TIMER_MAX), "timer" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(REVIVE_NUMBER_MAX), "amountOf" ] call EFUNC(common,readSettingFromModule); [ - {(((_this select 0) getvariable[QGVAR(ENABLE_REVIVE_SETDEAD_F),0]) > 0)} + {(((_this select 0) getvariable[QGVAR(ENABLE_REVIVE_SETDEAD),0]) > 0)} ] call FUNC(registerUnconsciousCondition); diff --git a/addons/medical/functions/fnc_onKilled.sqf b/addons/medical/functions/fnc_onKilled.sqf index e3609a57e5..2b8dd987b6 100644 --- a/addons/medical/functions/fnc_onKilled.sqf +++ b/addons/medical/functions/fnc_onKilled.sqf @@ -6,7 +6,7 @@ if (!local _unit) exitwith {}; [_unit, QGVAR(amountOfPain),0,true] call EFUNC(common,setDefinedVariable); [_unit, QGVAR(heartRate),0,true] call EFUNC(common,setDefinedVariable); [_unit, QGVAR(bloodPressure), [0,0],true] call EFUNC(common,setDefinedVariable); -if (_unit getvariable[QEGVAR(common,unconscious_non_captive_f),false]) then { +if (_unit getvariable[QEGVAR(common,unconscious_non_captive),false]) then { _unit setCaptive false; - _unit setvariable[QEGVAR(common,unconscious_non_captive_f),nil]; + _unit setvariable[QEGVAR(common,unconscious_non_captive),nil]; }; \ No newline at end of file diff --git a/addons/medical/functions/fnc_onStartMovingUnit.sqf b/addons/medical/functions/fnc_onStartMovingUnit.sqf index 7fe3dd8d65..84678d5379 100644 --- a/addons/medical/functions/fnc_onStartMovingUnit.sqf +++ b/addons/medical/functions/fnc_onStartMovingUnit.sqf @@ -20,6 +20,6 @@ _dragging = _this select 3; _caller setvariable[QGVAR(onStartMovingUnitParams), [_caller, _target, _killOnDrop, _dragging]]; -[_target, true] call EFUNC(common,disableAI_f); +[_target, true] call EFUNC(common,disableAI); nil; \ No newline at end of file diff --git a/addons/medical/functions/fnc_registerUnconsciousCondition.sqf b/addons/medical/functions/fnc_registerUnconsciousCondition.sqf index f34d05b57d..1e0413e8d6 100644 --- a/addons/medical/functions/fnc_registerUnconsciousCondition.sqf +++ b/addons/medical/functions/fnc_registerUnconsciousCondition.sqf @@ -10,13 +10,13 @@ #include "script_component.hpp" -if (isnil QGVAR(unconsciousConditions_F)) then { - GVAR(unconsciousConditions_F) = []; +if (isnil QGVAR(unconsciousConditions)) then { + GVAR(unconsciousConditions) = []; }; if (typeName _this == typeName []) then { { if (typeName _x == typeName {}) then { - GVAR(unconsciousConditions_F) pushback _x; + GVAR(unconsciousConditions) pushback _x; }; }foreach _this; }; \ No newline at end of file diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf index d43c1e1afc..2d91911a3c 100644 --- a/addons/medical/functions/fnc_setDead.sqf +++ b/addons/medical/functions/fnc_setDead.sqf @@ -24,11 +24,11 @@ if (!local _unit) exitwith { [[_unit, _force], QUOTE(FUNC(setDead)), _unit, false] call BIS_fnc_MP; }; -if (isnil QGVAR(ENABLE_REVIVE_F)) then { - GVAR(ENABLE_REVIVE_F) = 0; +if (isnil QGVAR(ENABLE_REVIVE)) then { + GVAR(ENABLE_REVIVE) = 0; }; -if (((GVAR(ENABLE_REVIVE_F) == 1 && isPlayer _unit) || (GVAR(ENABLE_REVIVE_F) == 2)) && !_force && (alive (vehicle _unit))) exitwith { +if (((GVAR(ENABLE_REVIVE) == 1 && isPlayer _unit) || (GVAR(ENABLE_REVIVE) == 2)) && !_force && (alive (vehicle _unit))) exitwith { // enter revive state _unit setvariable ["ACE_inReviveState", true, true]; @@ -36,11 +36,11 @@ if (((GVAR(ENABLE_REVIVE_F) == 1 && isPlayer _unit) || (GVAR(ENABLE_REVIVE_F) == [_unit] call FUNC(setUnconsciousState); // setting the revive default values - if (isnil QGVAR(REVIVE_TIMER_F)) then { - GVAR(REVIVE_TIMER_F) = 10; + if (isnil QGVAR(REVIVE_TIMER)) then { + GVAR(REVIVE_TIMER) = 10; }; - if (isnil QGVAR(REVIVE_NUMBER_MAX_F)) then { - GVAR(REVIVE_NUMBER_MAX_F) = -1; + if (isnil QGVAR(REVIVE_NUMBER_MAX)) then { + GVAR(REVIVE_NUMBER_MAX) = -1; }; [{ @@ -58,7 +58,7 @@ if (((GVAR(ENABLE_REVIVE_F) == 1 && isPlayer _unit) || (GVAR(ENABLE_REVIVE_F) == }; _counter = _unit getvariable ["ACE_reviveCounterValue", 0]; - if (_counter >= GVAR(REVIVE_TIMER_F)) exitwith{ + if (_counter >= GVAR(REVIVE_TIMER)) exitwith{ if (isPlayer _unit) then { titleText ["You died..","PLAIN DOWN"]; }; diff --git a/addons/medical/functions/fnc_setUnconsciousState.sqf b/addons/medical/functions/fnc_setUnconsciousState.sqf index 3f53e629e9..7fbd3c7f8a 100644 --- a/addons/medical/functions/fnc_setUnconsciousState.sqf +++ b/addons/medical/functions/fnc_setUnconsciousState.sqf @@ -41,17 +41,17 @@ _originalPos = unitPos _unit; // Handle the on screen effects if (isPlayer _unit) then { - [] call EFUNC(common,closeAllDialogs_f); + [] call EFUNC(common,closeAllDialogs); [true] call FUNC(effectBlackOut); ["unconscious", true] call EFUNC(common,setDisableUserInputStatus); - [false] call EFUNC(common,setVolume_f); + [false] call EFUNC(common,setVolume); } else { _unit setUnitPos "DOWN"; - [_unit, true] call EFUNC(common,disableAI_F); + [_unit, true] call EFUNC(common,disableAI); }; // So the AI does not get stuck, we are moving the unit to a temp group on its own. -[_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide_f); +[_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); _captiveSwitch = [_unit, true] call EFUNC(common,setCaptiveSwitch); [_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation); @@ -110,15 +110,15 @@ _minWaitingTime = (round(random(10)+5)); _unit setUnconscious false; // Swhich the unit back to its original group - [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide_f); + [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); // Reset any visual and audio effects for players, or enable everything again for AI. if (isPlayer _unit) then { [false] call FUNC(effectBlackOut); - [true] call EFUNC(common,setVolume_f); + [true] call EFUNC(common,setVolume); ["unconscious", false] call EFUNC(common,setDisableUserInputStatus); } else { - [_unit, false] call EFUNC(common,disableAI_F); + [_unit, false] call EFUNC(common,disableAI); _unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP) }; From c3cd9d281d0c9b3480670f68afa5348c75201875 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 14 Feb 2015 20:31:44 +0100 Subject: [PATCH 069/166] Removed isHC function. #139 --- addons/common/XEH_preInit.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 7a70ae7bb3..3710963c63 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -111,7 +111,6 @@ PREP(isAutoWind); PREP(isAwake); PREP(isEngineer); PREP(isEOD); -PREP(isHC); PREP(isInBuilding); PREP(isModLoaded); PREP(isPlayer); From 1a2a9dd584fb4ed055c381b4a38e85b50a9066cf Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 14 Feb 2015 15:51:08 -0600 Subject: [PATCH 070/166] Remove support for Anthropomorphism --- addons/nametags/XEH_postInit.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index fef1e4e4d3..0837ce3e88 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -36,7 +36,7 @@ addMissionEventHandler ["Draw3D", { //If set to "Only On Keypress" settings, fade just like main tags if (GVAR(showCursorTagForVehicles)) then { _target = cursorTarget; - if ((!(_target isKindOf "Man")) && {!(_target in allUnitsUAV)}) then { + if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then { _target = effectiveCommander _target; if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { _distance = _player distance _target; @@ -52,7 +52,7 @@ addMissionEventHandler ["Draw3D", { if (GVAR(showPlayerNames) in [2,4]) then { //"Only Cursor" mode, only show nametags for humans _target = cursorTarget; - if ((!isNull _target) && {_target isKindOf "Man"} && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + if ((!isNull _target) && {_target isKindOf "CAManBase"} && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { _distance = _player distance _target; _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); if ((GVAR(showPlayerNames) == 4)) then { //only on keypress @@ -62,7 +62,7 @@ addMissionEventHandler ["Draw3D", { }; } else { _pos = positionCameraToWorld [0, 0, 0]; - _targets = _pos nearObjects ["Man", GVAR(PlayerNamesViewDistance) + 5]; + _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5]; if (!surfaceIsWater _pos) then { _pos = ATLtoASL _pos; From df23b44df55e19f7f1b5bed04ce7ea37df89c9f4 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 23:13:43 +0100 Subject: [PATCH 071/166] oops --- addons/fcs/functions/fnc_firedEH.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/fcs/functions/fnc_firedEH.sqf b/addons/fcs/functions/fnc_firedEH.sqf index 237b68fc87..f17693d33e 100644 --- a/addons/fcs/functions/fnc_firedEH.sqf +++ b/addons/fcs/functions/fnc_firedEH.sqf @@ -26,7 +26,7 @@ _gunner = [_vehicle, _weapon] call EFUNC(common,getGunner); _turret = [_gunner] call EFUNC(common,getTurretIndex); // Exit if the unit isn't a player -if !([_unit] call EFUNC(common,isPlayer)) exitWith {}; +if !([_gunner] call EFUNC(common,isPlayer)) exitWith {}; private ["_FCSMagazines", "_FCSElevation", "_offset"]; From 827ef91fced046842bb2d3b8bc2e9717bd3e66a9 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 15 Feb 2015 10:03:58 +0100 Subject: [PATCH 072/166] Ported CSE Ambiance sound module --- .../functions/fn_moduleAmbianceSoundLoop.sqf | 98 -------------- addons/missionModules/$PBOPREFIX$ | 1 + addons/missionModules/CfgEventHandlers.hpp | 6 + addons/missionModules/CfgFactionClasses.hpp | 6 + addons/missionModules/CfgVehicles.hpp | 68 ++++++++++ addons/missionModules/XEH_preInit.sqf | 7 + addons/missionModules/config.cpp | 17 +++ addons/missionModules/data/moduleSound.paa | Bin 0 -> 5625 bytes .../functions/fnc_moduleAmbianceSound.sqf | 123 ++++++++++++++++++ .../functions/script_component.hpp | 1 + addons/missionModules/script_component.hpp | 12 ++ 11 files changed, 241 insertions(+), 98 deletions(-) delete mode 100644 TO_MERGE/cse/sys_misc/functions/fn_moduleAmbianceSoundLoop.sqf create mode 100644 addons/missionModules/$PBOPREFIX$ create mode 100644 addons/missionModules/CfgEventHandlers.hpp create mode 100644 addons/missionModules/CfgFactionClasses.hpp create mode 100644 addons/missionModules/CfgVehicles.hpp create mode 100644 addons/missionModules/XEH_preInit.sqf create mode 100644 addons/missionModules/config.cpp create mode 100644 addons/missionModules/data/moduleSound.paa create mode 100644 addons/missionModules/functions/fnc_moduleAmbianceSound.sqf create mode 100644 addons/missionModules/functions/script_component.hpp create mode 100644 addons/missionModules/script_component.hpp diff --git a/TO_MERGE/cse/sys_misc/functions/fn_moduleAmbianceSoundLoop.sqf b/TO_MERGE/cse/sys_misc/functions/fn_moduleAmbianceSoundLoop.sqf deleted file mode 100644 index 4b4d93d453..0000000000 --- a/TO_MERGE/cse/sys_misc/functions/fn_moduleAmbianceSoundLoop.sqf +++ /dev/null @@ -1,98 +0,0 @@ -/** - * fn_moduleAmbianceSoundLoop.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -private ["_logic", "_units", "_activated","_ambianceSounds", "_soundFiles", "_minimalDistance","_maximalDistance", "_minimalDistance", "_maxDelayBetweenSounds", "_allUnits", "_newPos", "_targetUnit", "_soundToPlay", "_soundPath", "_unparsedSounds", "_list", "_splittedList", "_nilCheckPassedList"]; -_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; -_units = [_this,1,[],[[]]] call BIS_fnc_param; -_activated = [_this,2,true,[true]] call BIS_fnc_param; - -if (_activated && isServer) then { - _ambianceSounds = []; - _unparsedSounds = _logic getvariable ["soundFiles", ""]; - _minimalDistance = (_logic getvariable ["minimalDistance", 400]) max 1; - _maximalDistance = (_logic getvariable ["maximalDistance", 10]) max _minimalDistance; - _minDelayBetweensounds = (_logic getvariable ["minimalDelay", 10]) max 1; - _maxDelayBetweenSounds = (_logic getvariable ["maximalDelay", 170]) max _minDelayBetweensounds; - _volume = (_logic getvariable ["soundVolume", 30]) max 1; - _followPlayers = _logic getvariable ["followPlayers", false]; - - _splittedList = [_unparsedSounds, ","] call BIS_fnc_splitString; - - _nilCheckPassedList = ""; - { - _x = [_x] call cse_fnc_string_removeWhiteSpace; - _splittedList set [_foreachIndex, _x]; - }foreach _splittedList; - - _soundPath = [(str missionConfigFile), 0, -15] call BIS_fnc_trimString; - { - if (isclass (missionConfigFile >> "CfgSounds" >> _x)) then { - _ambianceSounds pushback (_soundPath + (getArray(missionConfigFile >> "CfgSounds" >> _x >> "sound") select 0)); - } else { - if (isclass (configFile >> "CfgSounds" >> _x)) then { - _ambianceSounds pushback ((getArray(configFile >> "CfgSounds" >> _x >> "sound") select 0)); - }; - }; - }foreach _splittedList; - - if (count _ambianceSounds == 0) exitwith { - [format["No Ambiance sounds available"]] call cse_fnc_debug; - }; - { - if !([".", _x, true] call BIS_fnc_inString) then { - [format["Ambiance soundfile does not contain a file extension %1", _x]] call cse_fnc_debug; - _ambianceSounds set [_foreachIndex, _x + ".wss"]; - }; - }foreach _ambianceSounds; - [format["Ambiance sounds %1", _ambianceSounds]] call cse_fnc_debug; - - while {alive _logic} do { - _allUnits = switch (true) do { - case isMultiplayer: {playableUnits}; - case isDedicated: {[_logic]}; - default {[player]}; - }; - - if (count _allUnits > 0) then { - _targetUnit = _allUnits select (round(random((count _allUnits)-1))); - - _newPos = (getPos _targetUnit); - if (!_followPlayers) then { - _newPos = getPos _logic; - }; - - if (random(1) >= 0.5) then { - if (random(1) >= 0.5) then { - _newPos set [0, (_newPos select 0) + (_minimalDistance + random(_maximalDistance))]; - } else { - _newPos set [0, (_newPos select 0) - (_minimalDistance + random(_maximalDistance))]; - }; - } else { - if (random(1) >= 0.5) then { - _newPos set [1, (_newPos select 1) + (_minimalDistance + random(_maximalDistance))]; - } else { - _newPos set [1, (_newPos select 1) - (_minimalDistance + random(_maximalDistance))]; - }; - }; - - if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { - - _soundToPlay = _ambianceSounds select (round(random((count _ambianceSounds)-1))); - playSound3D [_soundToPlay, _targetUnit, false, _newPos, _volume, 1, 1000]; - - [format["Played a sound %1", _soundToPlay]] call cse_fnc_debug; - - sleep (_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds; - }; - }; - }; -}; - -true; \ No newline at end of file diff --git a/addons/missionModules/$PBOPREFIX$ b/addons/missionModules/$PBOPREFIX$ new file mode 100644 index 0000000000..ea1be0daee --- /dev/null +++ b/addons/missionModules/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\missionModules \ No newline at end of file diff --git a/addons/missionModules/CfgEventHandlers.hpp b/addons/missionModules/CfgEventHandlers.hpp new file mode 100644 index 0000000000..f0a9f14d91 --- /dev/null +++ b/addons/missionModules/CfgEventHandlers.hpp @@ -0,0 +1,6 @@ + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; diff --git a/addons/missionModules/CfgFactionClasses.hpp b/addons/missionModules/CfgFactionClasses.hpp new file mode 100644 index 0000000000..792f4d31e3 --- /dev/null +++ b/addons/missionModules/CfgFactionClasses.hpp @@ -0,0 +1,6 @@ +class CfgFactionClasses { + class NO_CATEGORY; + class ACE_missionModules: NO_CATEGORY { + displayName = "ACE Mission Modules"; + }; +}; \ No newline at end of file diff --git a/addons/missionModules/CfgVehicles.hpp b/addons/missionModules/CfgVehicles.hpp new file mode 100644 index 0000000000..570883ee5f --- /dev/null +++ b/addons/missionModules/CfgVehicles.hpp @@ -0,0 +1,68 @@ +class CfgVehicles { + class Logic; + class Module_F: Logic { + class ArgumentsBaseUnits { + }; + }; + + // TODO make a curator variant for this + class cse_moduleAmbianceSound: Module_F { + scope = 2; + displayName = "Ambiance Sounds [ACE]"; + icon = QUOTE(PATHTOF(data\moduleSound.paa)); + category = "ACE_missionModules"; + function = QUOTE(FUNC(moduleAmbianceSound); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + author = "Glowbal"; + class Arguments { + class soundFiles { + displayName = "Sounds"; + description = "Classnames of the ambiance sounds played. Seperated by ','. "; + typeName = "STRING"; + defaultValue = ""; + }; + class minimalDistance { + displayName = "Minimal Distance"; + description = "Minimal Distance"; + typeName = "NUMBER"; + defaultValue = 400; + }; + class maximalDistance { + displayName = "Maximal Distance"; + description = "Maximal Distance"; + typeName = "NUMBER"; + defaultValue = 900; + }; + class minimalDelay { + displayName = "Minimal Delay"; + description = "Minimal Delay between sounds played"; + typeName = "NUMBER"; + defaultValue = 10; + }; + class maximalDelay { + displayName = "Maximal Delay"; + description = "Maximal Delay between sounds played"; + typeName = "NUMBER"; + defaultValue = 170; + }; + class followPlayers { + displayName = "Follow Players"; + description = "Follow players. If set to false, loop will play sounds only nearby logic position."; + typeName = "BOOL"; + defaultValue = 0; + }; + class soundVolume { + displayName = "Volume"; + description = "The volume of the sounds played"; + typeName = "NUMBER"; + defaultValue = 0; + }; + }; + class ModuleDescription { + description = "Ambiance sounds loop (synced across MP)"; + sync[] = {}; + }; + }; +}; diff --git a/addons/missionModules/XEH_preInit.sqf b/addons/missionModules/XEH_preInit.sqf new file mode 100644 index 0000000000..cadbbabdd1 --- /dev/null +++ b/addons/missionModules/XEH_preInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(moduleAmbianceSound); + +ADDON = true; diff --git a/addons/missionModules/config.cpp b/addons/missionModules/config.cpp new file mode 100644 index 0000000000..0867b486c6 --- /dev/null +++ b/addons/missionModules/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"cse_moduleAmbianceSound"}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"Glowbal"}; + authorUrl = ""; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgFactionClasses.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/missionModules/data/moduleSound.paa b/addons/missionModules/data/moduleSound.paa new file mode 100644 index 0000000000000000000000000000000000000000..bfe3b8032717dcc98269b4b42a620cffe550ffc2 GIT binary patch literal 5625 zcmd5=e{2)i9e)QtpfrHPa-m>_7$qGojBP2JHAXidD=lKvOSnciRHiZp3io($CfVu3Ih4Y{*BB>0gjI}tEY4lCyKj^3 zi|MspB)_I9Qgx5++xQ+GAF#}rEAi6)SgR2uT;uV0M$+GvaQ(#H9}xS?WmyKjWzk^2 zNzcQW;MZidnf$!>++Lhj?%eeIpGtziBC+buc2ZUhGN$7o{p|Y_&10xliB==phYGcr8`S2cb3wu zSJO0FbEhH0o>*@a^2330*Os!%?HPIs=*>Ht3JmIghu|*BN=Fax<2*v*2zg37n~I_l zvuOp1~efUHq1t$YIb<=rbwS zTrcQpUhjzXYHsxVyH5nfdE>YxM~e3~1{1=bAg7M@d>{Fz$PcEznj%j-Sr-`;E@UQk zQ%W=8le|+&`CYHlo@`?-%h+-aPK=XB!7Q0@uvl zk~H~J)3;+sOn<@gdX~1F2=F@pO`4Y=pKA{{ih0US7~4l2ZHeSrF3!i~kXHre!}Y@c zP~XdDtCPF%p;?fZ%~k(hpV7__KYu$I&W)uH29ukQ!Cc^o8gi!2->3UUe9E%THmf0Q zTsUN8<7HeGl+Vt~a$AbuYUH0o|BNJeHbGk-Z{+Ere3Dmnv_1+KqTMjB=U(a$b{;-6 zzc4iZ3Di4N{_5i{f3GXhO~_`GW%kmP#F*J;J)-sFmSP?uO!IU;(7&&hr;0QC@2ovz z3-%y>l5ihkZ6=ksK>1eVIAM@i^LD}cUF(EDfV@(07E3F~Wc@c6Pf23lh`?V>iWc4M z`dp0j&)*$#tfK$P|G#y0L*l&qaS?wMfyF&b{MX`O{fI8!$wXwry{egRWm$pFp z{y>`MA)mBh5Aqkkb=l&hj--Fhjd&oPi5~=z^p(|AlqMfu%Gp?i68y-kT`Dz1+<3b z<$c9;CtdTx;i6ck|MGfA>_>9#Q+h5Q7_jV*@=E>2Esi71(4W)NRDZ#3xHI;cHA?@; z<(G?d&v#ynUfUZd{#1V?*3m-&#@%$Iy`|^e#>Hkc9?+hA!G5{)M~i2jYll6|dd$$D zR)0X8Be1{8Upe@-w3`5=Q9-=?2KtXFp9)OTGQSFkA2Lj=c}(p3w}oZ4G=ctW9oi4< zr*2R=xTFyP!>q?9KaP56@|$%on7G*D6aK=`UyoLwyIp@@cmGg)E1Kr+;jL-cv!*;u z)@FA=&{SZHDJ_#uoFU1F>~(_jCm+&BtmntyvDT}g$DiA1>Bl@;UiY3!nfQUa_gvq* zwb%dKekXIHkY=R<$fjcYGlSh9iZ&KyjMBcs8aBK9SId5$Z9^J1hwG!^7Z8h7Chc~y zzRAF|A*~;Z!VEp4O~Z+c&YynMaN;8TU{bH0yK>v3G(%zjHqY*)0JwO9CW)BVG zJ*YDB^0;y9tW`GfULspIGVAAGN0_?S3436ZaxYoN8IUw|Rqu_G7u7KTl-MPM?0gOc`ug7=QW2VESaxEQ|DzF~Gcf`Ss=k z!5@80$+70ue>^-^&<8!+w(EE;@MgU@FXFFWrn38tNE@g!N=@f3^qiN9Y5(x27AJTU z=ZAa#5twV0X_O^x28Z$A&pS=)$^KtzKk;MPDzj+fwB>Q#-`x>urFlHnvF~!UO>diN z1yv&Jpc(olz3l-5or{nk44&+4GA;!F4$kl&=$B9LESij$36p&hUd;VmNUJ6YMgF6JLbOVk`ZbHcCR84R!G;@r-_u zAOuge55r}#NM0sQs>9M`hMq}%DBkSUY)Wi(n$)N*vDA>Kx9MZQ8d)rk1;xlSy{&nF z{&N3bnupD7Ptbb2a4^?R|X+6c1 zGkO0 + * 1: Units + * 2: Activated + * + * Return Value: + * Nothing + * + * Example: + * N/A + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_logic", "_units", "_activated","_ambianceSounds", "_soundFiles", "_minimalDistance","_maximalDistance", "_minimalDistance", "_maxDelayBetweenSounds", "_allUnits", "_newPos", "_targetUnit", "_soundToPlay", "_soundPath", "_unparsedSounds", "_list", "_splittedList", "_nilCheckPassedList"]; +_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; +_units = [_this,1,[],[[]]] call BIS_fnc_param; +_activated = [_this,2,true,[true]] call BIS_fnc_param; + +// We only play this on the locality of the logic, since the sounds are broadcasted across the network +if (_activated && local _logic) then { + _ambianceSounds = []; + _unparsedSounds = _logic getvariable ["soundFiles", ""]; + _minimalDistance = (_logic getvariable ["minimalDistance", 400]) max 1; + _maximalDistance = (_logic getvariable ["maximalDistance", 10]) max _minimalDistance; + _minDelayBetweensounds = (_logic getvariable ["minimalDelay", 10]) max 1; + _maxDelayBetweenSounds = (_logic getvariable ["maximalDelay", 170]) max _minDelayBetweensounds; + _volume = (_logic getvariable ["soundVolume", 30]) max 1; + _followPlayers = _logic getvariable ["followPlayers", false]; + + _splittedList = [_unparsedSounds, ","] call BIS_fnc_splitString; + + _nilCheckPassedList = ""; + { + _x = [_x] call EFUNC(common,removeWhiteSpace); + _splittedList set [_foreachIndex, _x]; + }foreach _splittedList; + + _soundPath = [(str missionConfigFile), 0, -15] call BIS_fnc_trimString; + { + if (isclass (missionConfigFile >> "CfgSounds" >> _x)) then { + _ambianceSounds pushback (_soundPath + (getArray(missionConfigFile >> "CfgSounds" >> _x >> "sound") select 0)); + } else { + if (isclass (configFile >> "CfgSounds" >> _x)) then { + _ambianceSounds pushback ((getArray(configFile >> "CfgSounds" >> _x >> "sound") select 0)); + }; + }; + }foreach _splittedList; + + if (count _ambianceSounds == 0) exitwith {}; + { + if !([".", _x, true] call BIS_fnc_inString) then { + _ambianceSounds set [_foreachIndex, _x + ".wss"]; + }; + }foreach _ambianceSounds; + + [{ + private ["_args", "_logic", "_ambianceSounds", "_minimalDistance", "_maximalDistance", "_minDelayBetweensounds", "_maxDelayBetweenSounds", "_volume", "_followPlayers","_lastTimePlayed", "_newPos"] + _args = _this select 0; + _logic = _args select 0; + _lastTimePlayed = _args select 8; + + if (!alive _logic) exitwith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + + if (_lastTimePlayed - time >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { + _ambianceSounds = _args select 1; + _minimalDistance = _args select 2; + _maximalDistance = _args select 3; + _minDelayBetweensounds = _args select 4; + _maxDelayBetweenSounds = _args select 5; + _volume = _args select 6; + _followPlayers = _args select 7; + + // Find all players in session. + _allUnits = if (isMultiplayer) then {playableUnits} else {[ACE_player]}; + + // Check if there are enough players to even start playing this sound. + if (count _allUnits > 0) then { + + // Select a target unit at random. + _targetUnit = _allUnits select (round(random((count _allUnits)-1))); + + // find the position from which we are going to play this sound from. + _newPos = (getPos _targetUnit); + if (!_followPlayers) then { + _newPos = getPos _logic; + }; + + // Randomize this position. + if (random(1) >= 0.5) then { + if (random(1) >= 0.5) then { + _newPos set [0, (_newPos select 0) + (_minimalDistance + random(_maximalDistance))]; + } else { + _newPos set [0, (_newPos select 0) - (_minimalDistance + random(_maximalDistance))]; + }; + } else { + if (random(1) >= 0.5) then { + _newPos set [1, (_newPos select 1) + (_minimalDistance + random(_maximalDistance))]; + } else { + _newPos set [1, (_newPos select 1) - (_minimalDistance + random(_maximalDistance))]; + }; + }; + + // If no unit is to close to this position, we will play the sound. + if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { + + playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), _targetUnit, false, _newPos, _volume, 1, 1000]; + _args set [8, time]; + }; + }; + }; + }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, time] ] call CBA_fnc_addPerFrameHandler; +}; + +true; diff --git a/addons/missionModules/functions/script_component.hpp b/addons/missionModules/functions/script_component.hpp new file mode 100644 index 0000000000..e49740a89e --- /dev/null +++ b/addons/missionModules/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\missionModules\script_component.hpp" \ No newline at end of file diff --git a/addons/missionModules/script_component.hpp b/addons/missionModules/script_component.hpp new file mode 100644 index 0000000000..a567966c7b --- /dev/null +++ b/addons/missionModules/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT missionModules +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_MISSIONMODULES + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MISSIONMODULES + #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSIONMODULES +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file From 6540158ce1e93a425957e01f1011c0e0b6f9dc1e Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 15 Feb 2015 10:05:48 +0100 Subject: [PATCH 073/166] Removed left over CSE prefix --- addons/missionModules/CfgVehicles.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/missionModules/CfgVehicles.hpp b/addons/missionModules/CfgVehicles.hpp index 570883ee5f..afdb58006b 100644 --- a/addons/missionModules/CfgVehicles.hpp +++ b/addons/missionModules/CfgVehicles.hpp @@ -6,7 +6,7 @@ class CfgVehicles { }; // TODO make a curator variant for this - class cse_moduleAmbianceSound: Module_F { + class ACE_moduleAmbianceSound: Module_F { scope = 2; displayName = "Ambiance Sounds [ACE]"; icon = QUOTE(PATHTOF(data\moduleSound.paa)); From ac54e8dfd797e94c2629628e04396743f8c21025 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 15 Feb 2015 12:44:34 +0100 Subject: [PATCH 074/166] Added UAV exchange battery sound --- addons/logistics_uavbattery/CfgSounds.hpp | 7 +++++++ addons/logistics_uavbattery/config.cpp | 1 + .../functions/fnc_refuelUAV.sqf | 1 + .../sounds/exchange_battery.ogg | Bin 0 -> 34349 bytes 4 files changed, 9 insertions(+) create mode 100644 addons/logistics_uavbattery/CfgSounds.hpp create mode 100644 addons/logistics_uavbattery/sounds/exchange_battery.ogg diff --git a/addons/logistics_uavbattery/CfgSounds.hpp b/addons/logistics_uavbattery/CfgSounds.hpp new file mode 100644 index 0000000000..530c5b86a9 --- /dev/null +++ b/addons/logistics_uavbattery/CfgSounds.hpp @@ -0,0 +1,7 @@ +class CfgSounds { + class ACE_replaceUAVBattery { + name = "ACE_replaceUAVBattery"; + sound[]={QUOTE(PATHTOF(sounds\exchange_battery.ogg)),1,1}; + titles[]={}; + }; +}; diff --git a/addons/logistics_uavbattery/config.cpp b/addons/logistics_uavbattery/config.cpp index 046a2665d0..32d8c49978 100644 --- a/addons/logistics_uavbattery/config.cpp +++ b/addons/logistics_uavbattery/config.cpp @@ -15,3 +15,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" +#include "CfgSounds.hpp" diff --git a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf index 9384044f00..5a248bf812 100644 --- a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf +++ b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf @@ -21,6 +21,7 @@ if (!(_this call FUNC(canRefuelUAV))) exitWith {}; _onFinish = { EXPLODE_2_PVT((_this select 0),_caller,_target); _caller removeItem "ACE_UAVBattery"; + playSound3D [QUOTE(PATHTO_R(sounds\exchange_battery.ogg)), objNull, false, getPosASL _caller, 1, 1, 10]; ["VehicleSetFuel", [_target], [_target, 1]] call EFUNC(common,targetEvent); //setFuel is local }; diff --git a/addons/logistics_uavbattery/sounds/exchange_battery.ogg b/addons/logistics_uavbattery/sounds/exchange_battery.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5a40ddb47a7aa5db7a2ba779baa37072286fc37c GIT binary patch literal 34349 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≈eyu+XoU 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 literal 0 HcmV?d00001 From baf9396459c38d021801b7e6aa0cf0ad7ea6802e Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 15 Feb 2015 15:31:09 +0100 Subject: [PATCH 075/166] cleanup attach --- addons/attach/CfgEventHandlers.hpp | 5 +- addons/attach/CfgMagazines.hpp | 4 +- addons/attach/CfgVehicles.hpp | 28 +++++----- addons/attach/CfgWeapons.hpp | 9 ++-- addons/attach/config.cpp | 11 ++-- addons/attach/functions/fnc_attach.sqf | 32 ++++++------ addons/attach/functions/fnc_canAttach.sqf | 8 +-- addons/attach/functions/fnc_canDetach.sqf | 13 ++--- addons/attach/functions/fnc_detach.sqf | 54 ++++++++++---------- addons/attach/functions/fnc_openAttachUI.sqf | 18 +++---- addons/attach/functions/fnc_placeApprove.sqf | 8 +-- addons/attach/stringtable.xml | 2 +- 12 files changed, 100 insertions(+), 92 deletions(-) diff --git a/addons/attach/CfgEventHandlers.hpp b/addons/attach/CfgEventHandlers.hpp index 4c2b8b16ca..f0a9f14d91 100644 --- a/addons/attach/CfgEventHandlers.hpp +++ b/addons/attach/CfgEventHandlers.hpp @@ -1,5 +1,6 @@ + class Extended_PreInit_EventHandlers { class ADDON { - init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; -}; \ No newline at end of file +}; diff --git a/addons/attach/CfgMagazines.hpp b/addons/attach/CfgMagazines.hpp index 282d36b964..d63b8db36b 100644 --- a/addons/attach/CfgMagazines.hpp +++ b/addons/attach/CfgMagazines.hpp @@ -1,10 +1,12 @@ + class CfgMagazines { class CA_Magazine; class B_IR_Grenade: CA_Magazine { ACE_Attachable = 1; }; + class SmokeShell; class Chemlight_green: SmokeShell { ACE_Attachable = 1; }; -}; \ No newline at end of file +}; diff --git a/addons/attach/CfgVehicles.hpp b/addons/attach/CfgVehicles.hpp index bc1f52988a..1b16d59acc 100644 --- a/addons/attach/CfgVehicles.hpp +++ b/addons/attach/CfgVehicles.hpp @@ -1,7 +1,3 @@ -#define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ - name = #ITEM; \ - count = COUNT; \ - }; #define MACRO_ATTACHTOVEHICLE \ class ACE_Actions { \ @@ -32,16 +28,20 @@ class CfgVehicles { class Car: LandVehicle { MACRO_ATTACHTOVEHICLE }; + class Tank: LandVehicle { MACRO_ATTACHTOVEHICLE }; + class Air; class Helicopter: Air { MACRO_ATTACHTOVEHICLE }; + class Plane: Air { MACRO_ATTACHTOVEHICLE }; + class Ship; class Ship_F: Ship { MACRO_ATTACHTOVEHICLE @@ -96,6 +96,7 @@ class CfgVehicles { onlyInNvg = 1; useFlare = 0; }; + side = 7;//-1=NO_SIDE yellow box,3=CIV grey box,4=NEUTRAL yellow box,6=FRIENDLY green box,7=LOGIC no radar signature accuracy = 1000; cost = 0; @@ -111,37 +112,36 @@ class CfgVehicles { }; class NATO_Box_Base; - class EAST_Box_Base; - class IND_Box_Base; - class FIA_Box_Base_F; - class Box_NATO_Support_F: NATO_Box_Base { class TransportItems { - MACRO_ADDITEM(ACE_IR_Strobe_Item,12) + MACRO_ADDITEM(ACE_IR_Strobe_Item,12); }; }; + class EAST_Box_Base; class Box_East_Support_F: EAST_Box_Base { class TransportItems { - MACRO_ADDITEM(ACE_IR_Strobe_Item,12) + MACRO_ADDITEM(ACE_IR_Strobe_Item,12); }; }; + class IND_Box_Base; class Box_IND_Support_F: IND_Box_Base { class TransportItems { - MACRO_ADDITEM(ACE_IR_Strobe_Item,12) + MACRO_ADDITEM(ACE_IR_Strobe_Item,12); }; }; + class FIA_Box_Base_F; class Box_FIA_Support_F: FIA_Box_Base_F { class TransportItems { - MACRO_ADDITEM(ACE_IR_Strobe_Item,12) + MACRO_ADDITEM(ACE_IR_Strobe_Item,12); }; }; class ACE_Box_Misc: Box_NATO_Support_F { class TransportItems { - MACRO_ADDITEM(ACE_IR_Strobe_Item,12) + MACRO_ADDITEM(ACE_IR_Strobe_Item,12); }; }; -}; \ No newline at end of file +}; diff --git a/addons/attach/CfgWeapons.hpp b/addons/attach/CfgWeapons.hpp index 8174f67b38..4ad34832c5 100644 --- a/addons/attach/CfgWeapons.hpp +++ b/addons/attach/CfgWeapons.hpp @@ -1,16 +1,19 @@ + class CfgWeapons { class ACE_ItemCore; class InventoryItem_Base_F; class ACE_IR_Strobe_Item: ACE_ItemCore { + ACE_attachable = 1; + author = "$STR_ACE_Common_ACETeam"; + scope = 2; displayName = "$STR_ACE_IrStrobe_Name"; descriptionShort = "$STR_ACE_IrStrobe_Description"; model = "\A3\weapons_F\ammo\mag_univ.p3d"; picture = PATHTOF(UI\irstrobe_item.paa); - scope = 2; - ACE_attachable = 1; + class ItemInfo: InventoryItem_Base_F { mass = 1; }; }; -}; \ No newline at end of file +}; diff --git a/addons/attach/config.cpp b/addons/attach/config.cpp index 9accc9f253..007084d8df 100644 --- a/addons/attach/config.cpp +++ b/addons/attach/config.cpp @@ -5,17 +5,14 @@ class CfgPatches { units[] = {}; weapons[] = {"ACE_IR_Strobe_Item"}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common", "ace_interaction"}; - author[] = {"KoffeinFlummi", "eRazeri", "CAA-Picard"}; + requiredAddons[] = {"ace_common","ace_interaction"}; + author[] = {"KoffeinFlummi","eRazeri","CAA-Picard"}; authorUrl = "https://github.com/KoffeinFlummi/"; VERSION_CONFIG; }; }; #include "CfgEventHandlers.hpp" - -#include "CfgVehicles.hpp" - -#include "CfgWeapons.hpp" - #include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/attach/functions/fnc_attach.sqf b/addons/attach/functions/fnc_attach.sqf index 9fd0cf7952..3aa06bacc2 100644 --- a/addons/attach/functions/fnc_attach.sqf +++ b/addons/attach/functions/fnc_attach.sqf @@ -20,31 +20,33 @@ PARAMS_3(_unit,_attachToVehicle,_itemName); //Sanity Check (_unit has item in inventory, not over attach limit) -if (!([_unit,_attachToVehicle,_itemName] call FUNC(canAttach))) exitWith {ERROR("Tried to attach, but check failed");}; +if !([_unit, _attachToVehicle, _itemName] call FUNC(canAttach)) exitWith {ERROR("Tried to attach, but check failed");}; + +private ["_itemVehClass", "_onAtachText", "_selfAttachPosition"]; -_selfAttachPosition = [_unit, [-0.05,0,0.12], "rightshoulder"]; _itemVehClass = ""; _onAtachText = ""; +_selfAttachPosition = [_unit, [-0.05, 0, 0.12], "rightshoulder"]; -switch true do { -case (_itemName == "ACE_IR_Strobe_Item"): { +switch (true) do { + case (_itemName == "ACE_IR_Strobe_Item"): { _itemVehClass = "ACE_IR_Strobe_Effect"; _onAtachText = localize "STR_ACE_Attach_IrStrobe_Attached"; - _selfAttachPosition = [_unit,[0,-0.11,0.16],"pilot"]; //makes it attach to the head a bit better, shoulder is not good for visibility - eRazeri + //_selfAttachPosition = [_unit, [0, -0.11, 0.16], "pilot"]; //makes it attach to the head a bit better, shoulder is not good for visibility - eRazeri }; -case (_itemName == "B_IR_Grenade"): { + case (_itemName == "B_IR_Grenade"): { _itemVehClass = "B_IRStrobe"; _onAtachText = localize "STR_ACE_Attach_IrGrenade_Attached"; }; -case (_itemName == "O_IR_Grenade"): { + case (_itemName == "O_IR_Grenade"): { _itemVehClass = "O_IRStrobe"; _onAtachText = localize "STR_ACE_Attach_IrGrenade_Attached"; }; -case (_itemName == "I_IR_Grenade"): { + case (_itemName == "I_IR_Grenade"): { _itemVehClass = "I_IRStrobe"; _onAtachText = localize "STR_ACE_Attach_IrGrenade_Attached"; }; -case (_itemName == "Chemlight_blue" or {_itemName == "Chemlight_green"} or {_itemName == "Chemlight_red"} or {_itemName == "Chemlight_yellow"}): { + case (toLower _itemName in ["chemlight_blue", "chemlight_green", "chemlight_red", "chemlight_yellow"]): { _itemVehClass = _itemName; _onAtachText = localize "STR_ACE_Attach_Chemlight_Attached"; }; @@ -57,8 +59,8 @@ if (_unit == _attachToVehicle) then { //Self Attachment _attachedItem = _itemVehClass createVehicle [0,0,0]; _attachedItem attachTo _selfAttachPosition; [_onAtachText] call EFUNC(common,displayTextStructured); - _attachToVehicle setVariable ["ACE_AttachedObjects", [_attachedItem], true]; - _attachToVehicle setVariable ["ACE_AttachedItemNames", [_itemName], true]; + _attachToVehicle setVariable [QGVAR(Objects), [_attachedItem], true]; + _attachToVehicle setVariable [QGVAR(ItemNames), [_itemName], true]; } else { GVAR(setupObject) = _itemVehClass createVehicleLocal [0,0,-10000]; GVAR(setupObject) enableSimulationGlobal false; @@ -72,17 +74,17 @@ if (_unit == _attachToVehicle) then { //Self Attachment private "_player"; _player = ACE_player; //Stop if player switch or player gets to far from vehicle - if ((GVAR(placer) != _player) || {(_player distance GVAR(SetupAttachVehicle)) > 7}) exitWith { + if (GVAR(placer) != _player || {_player distance GVAR(SetupAttachVehicle) > 7}) exitWith { call FUNC(placeCancel); }; GVAR(pfeh_running) = true; _pos = (ASLtoATL eyePos _player) vectorAdd (positionCameraToWorld [0,0,1] vectorDiff positionCameraToWorld [0,0,0]); GVAR(setupObject) setPosATL _pos; - }] call BIS_fnc_addStackedEventHandler; + }] call BIS_fnc_addStackedEventHandler; // @todo replace with CBA PFH //had to delay the mouseHint, not sure why [{[localize "STR_ACE_Attach_PlaceAction", localize "STR_ACE_Attach_CancelAction"] call EFUNC(interaction,showMouseHint)}, [], 0, 0] call EFUNC(common,waitAndExecute); - _unit setVariable [QGVAR(placeActionEH), [_unit, "DefaultAction", {GVAR(pfeh_running) AND !isNull (GVAR(setupObject))}, {call FUNC(placeApprove);}] call EFUNC(common,AddActionEventHandler)]; - _unit setVariable [QGVAR(cancelActionEH), [_unit, "MenuBack", {GVAR(pfeh_running) AND !isNull (GVAR(setupObject))}, {call FUNC(placeCancel);}] call EFUNC(common,AddActionEventHandler)]; + _unit setVariable [QGVAR(placeActionEH), [_unit, "DefaultAction", {GVAR(pfeh_running) && {!isNull (GVAR(setupObject))}}, {call FUNC(placeApprove);}] call EFUNC(common,AddActionEventHandler)]; + _unit setVariable [QGVAR(cancelActionEH), [_unit, "MenuBack", {GVAR(pfeh_running) && {!isNull (GVAR(setupObject))}}, {call FUNC(placeCancel);}] call EFUNC(common,AddActionEventHandler)]; }; diff --git a/addons/attach/functions/fnc_canAttach.sqf b/addons/attach/functions/fnc_canAttach.sqf index ac646ef700..1c33f7b112 100644 --- a/addons/attach/functions/fnc_canAttach.sqf +++ b/addons/attach/functions/fnc_canAttach.sqf @@ -19,7 +19,9 @@ PARAMS_3(_unit,_attachToVehicle,_item); -_attachLimit = if (_unit == _attachToVehicle) then {1} else {10}; -_attachedObjects = _attachToVehicle getVariable ["ACE_AttachedObjects", []]; +private ["_attachLimit", "_attachedObjects"]; -canStand _unit && {alive _attachToVehicle} && {(count _attachedObjects) < _attachLimit} && {_item in ((magazines _unit) + (items _unit) + [""])} +_attachLimit = [10, 1] select (_unit == _attachToVehicle); +_attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; + +canStand _unit && {alive _attachToVehicle} && {count _attachedObjects < _attachLimit} && {_item in (itemsWithMagazines _unit + [""])} diff --git a/addons/attach/functions/fnc_canDetach.sqf b/addons/attach/functions/fnc_canDetach.sqf index d099d2035e..ad2f68776c 100644 --- a/addons/attach/functions/fnc_canDetach.sqf +++ b/addons/attach/functions/fnc_canDetach.sqf @@ -16,24 +16,25 @@ */ #include "script_component.hpp" -private ["_attachedObjects", "_inRange", "_unitPos", "_objectPos"]; - PARAMS_2(_unit,_attachToVehicle); -_attachedObjects = _attachToVehicle getVariable ["ACE_AttachedObjects", []]; +private ["_attachedObjects", "_inRange"]; + +_attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; _inRange = false; if (_unit == _attachToVehicle) then { - _inRange = (count _attachedObjects) > 0; + _inRange = count _attachedObjects > 0; } else { //Scan if unit is within range (using 2d distance) + private ["_unitPos", "_objectPos"]; _unitPos = getPos _unit; _unitPos set [2,0]; { _objectPos = getPos _x; _objectPos set [2, 0]; - if ((_objectPos distance _unitPos) < 4) exitWith {_inRange = true}; + if (_objectPos distance _unitPos < 4) exitWith {_inRange = true}; } forEach _attachedObjects; }; -(canStand _unit) && _inRange && {alive _attachToVehicle} +canStand _unit && {_inRange} && {alive _attachToVehicle} diff --git a/addons/attach/functions/fnc_detach.sqf b/addons/attach/functions/fnc_detach.sqf index b18cec09bd..8fb9e3cc9c 100644 --- a/addons/attach/functions/fnc_detach.sqf +++ b/addons/attach/functions/fnc_detach.sqf @@ -16,12 +16,14 @@ */ #include "script_component.hpp" -private ["_itemName", "_count", "_attachedItem", "_fnc_detachDelay"]; - PARAMS_2(_unit,_attachToVehicle); -_attachedObjectsArray = _attachToVehicle getVariable ["ACE_AttachedObjects", []]; -_attachedItemsArray = _attachToVehicle getVariable ["ACE_AttachedItemNames", []]; +private ["_attachedObjects", "_attachedItems"]; + +_attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; +_attachedItems = _attachToVehicle getVariable [QGVAR(ItemNames), []]; + +private ["_attachedObject", "_attachedIndex", "_itemName", "_minDistance", "_unitPos", "_objectPos"]; _attachedObject = objNull; _attachedIndex = -1; @@ -34,53 +36,51 @@ _unitPos set [2,0]; { _objectPos = getPos _x; _objectPos set [2, 0]; - if ((_objectPos distance _unitPos) < _minDistance) then { - _minDistance = (_objectPos distance _unitPos); + if (_objectPos distance _unitPos < _minDistance) then { + _minDistance = _objectPos distance _unitPos; _attachedObject = _x; - _itemName = _attachedItemsArray select _forEachIndex; + _itemName = _attachedItems select _forEachIndex; _attachedIndex = _forEachIndex; }; -} forEach _attachedObjectsArray; +} forEach _attachedObjects; // Check if unit has an attached item -if ((isNull _attachedObject) || {_itemName == ""}) exitWith {ERROR("Could not find attached object")}; +if (isNull _attachedObject || {_itemName == ""}) exitWith {ERROR("Could not find attached object")}; -// Add item to inventory -_count = (count items _unit) + (count magazines _unit); -_unit addItem _itemName; -if ((count items _unit) + (count magazines _unit) <= _count) exitWith { +// Exit if can't add the item +if !(_unit canAdd _itemName) exitWith { [localize "STR_ACE_Attach_Inventory_Full"] call EFUNC(common,displayTextStructured); }; -if (_itemName == "B_IR_Grenade" or _itemName == "O_IR_Grenade" or _itemName == "I_IR_Grenade") then { +// Add item to inventory +_unit addItem _itemName; + +if (toLower _itemName in ["b_ir_grenade", "o_ir_grenade", "i_ir_grenade"]) then { // Hack for dealing with X_IR_Grenade effect not dissapearing on deleteVehicle detach _attachedObject; - _attachedObject setPos [getPos _unit select 0, getPos _unit select 1, ((getPos _unit select 2) - 1000)]; + _attachedObject setPos ((getPos _unit) vectorAdd [0, 0, -1000]); // Delete attached item after 0.5 seconds - _fnc_detachDelay = { - deleteVehicle (_this select 0); - }; - [_fnc_detachDelay, [_attachedObject], 0.5, 0] call EFUNC(common,waitAndExecute); + [{deleteVehicle (_this select 0)}, [_attachedObject], 0.5, 0] call EFUNC(common,waitAndExecute); } else { // Delete attached item deleteVehicle _attachedObject; }; // Reset unit variables -_attachedObjectsArray deleteAt _attachedIndex; -_attachedItemsArray deleteAt _attachedIndex; -_attachToVehicle setVariable ["ACE_AttachedObjects", _attachedObjectsArray, true]; -_attachToVehicle setVariable ["ACE_AttachedItemNames", _attachedItemsArray, true]; +_attachedObjects deleteAt _attachedIndex; +_attachedItems deleteAt _attachedIndex; +_attachToVehicle setVariable [QGVAR(Objects), _attachedObjects, true]; +_attachToVehicle setVariable [QGVAR(ItemNames), _attachedItems, true]; // Display message -switch true do { -case (_itemName == "ACE_IR_Strobe_Item") : { +switch (true) do { + case (_itemName == "ACE_IR_Strobe_Item") : { [localize "STR_ACE_Attach_IrStrobe_Detached"] call EFUNC(common,displayTextStructured); }; -case (_itemName == "B_IR_Grenade" or _itemName == "O_IR_Grenade" or _itemName == "I_IR_Grenade") : { + case (toLower _itemName in ["b_ir_grenade", "o_ir_grenade", "i_ir_grenade"]) : { [localize "STR_ACE_Attach_IrGrenade_Detached"] call EFUNC(common,displayTextStructured); }; -case (_itemName == "Chemlight_blue" or {_itemName == "Chemlight_green"} or {_itemName == "Chemlight_red"} or {_itemName == "Chemlight_yellow"}) : { + case (toLower _itemName in ["chemlight_blue", "chemlight_green", "chemlight_red", "chemlight_yellow"]) : { [localize "STR_ACE_Attach_Chemlight_Detached"] call EFUNC(common,displayTextStructured); }; }; diff --git a/addons/attach/functions/fnc_openAttachUI.sqf b/addons/attach/functions/fnc_openAttachUI.sqf index 6521e43fbe..5533956bb6 100644 --- a/addons/attach/functions/fnc_openAttachUI.sqf +++ b/addons/attach/functions/fnc_openAttachUI.sqf @@ -55,13 +55,13 @@ _attachables = items _unit; } forEach _attachables; [ -_actions, -{ - [ACE_player, GVAR(attachTarget), _this] call FUNC(attach); - call EFUNC(interaction,hideMenu); -}, -{ - call EFUNC(interaction,hideMenu); - if !(profileNamespace getVariable [QEGVAR(interaction,AutoCloseMenu), false]) then {"Default" call EFUNC(interaction,openMenuSelf)}; -} + _actions, + { + [ACE_player, GVAR(attachTarget), _this] call FUNC(attach); + call EFUNC(interaction,hideMenu); + }, + { + call EFUNC(interaction,hideMenu); + if !(profileNamespace getVariable [QEGVAR(interaction,AutoCloseMenu), false]) then {"Default" call EFUNC(interaction,openMenuSelf)}; + } ] call EFUNC(interaction,openSelectMenu); diff --git a/addons/attach/functions/fnc_placeApprove.sqf b/addons/attach/functions/fnc_placeApprove.sqf index ceb48de9b5..c6277e2961 100644 --- a/addons/attach/functions/fnc_placeApprove.sqf +++ b/addons/attach/functions/fnc_placeApprove.sqf @@ -100,11 +100,11 @@ _attachedObject attachTo [_attachToVehicle, _endPosTestOffset]; _placer removeItem _itemClassname; //Add Object to ACE_AttachedObjects and ACE_AttachedItemNames -_currentObjects = _attachToVehicle getVariable ["ACE_AttachedObjects", []]; +_currentObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; _currentObjects pushBack _attachedObject; -_attachToVehicle setVariable ["ACE_AttachedObjects", _currentObjects, true]; -_currentItemNames = _attachToVehicle getVariable ["ACE_AttachedItemNames", []]; +_attachToVehicle setVariable [QGVAR(Objects), _currentObjects, true]; +_currentItemNames = _attachToVehicle getVariable [QGVAR(ItemNames), []]; _currentItemNames pushBack _itemClassname; -_attachToVehicle setVariable ["ACE_AttachedItemNames", _currentItemNames, true]; +_attachToVehicle setVariable [QGVAR(ItemNames), _currentItemNames, true]; [_placementText] call EFUNC(common,displayTextStructured); diff --git a/addons/attach/stringtable.xml b/addons/attach/stringtable.xml index 21577c55d3..13c468184b 100644 --- a/addons/attach/stringtable.xml +++ b/addons/attach/stringtable.xml @@ -176,4 +176,4 @@ Error en Acoplar - \ No newline at end of file + From 4f5ab1f8e5f67f13b2f8f180734e5b91f5eda1cb Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 15 Feb 2015 15:34:19 +0100 Subject: [PATCH 076/166] removed common as required addon for attach --- addons/attach/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/attach/config.cpp b/addons/attach/config.cpp index 007084d8df..dd7e1add3b 100644 --- a/addons/attach/config.cpp +++ b/addons/attach/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {"ACE_IR_Strobe_Item"}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common","ace_interaction"}; + requiredAddons[] = {"ace_interaction"}; author[] = {"KoffeinFlummi","eRazeri","CAA-Picard"}; authorUrl = "https://github.com/KoffeinFlummi/"; VERSION_CONFIG; From c094c10e467d2d3c132178c612793203bfe828f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Sun, 15 Feb 2015 11:42:20 -0300 Subject: [PATCH 077/166] visible ir strobes --- addons/attach/CfgVehicles.hpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/addons/attach/CfgVehicles.hpp b/addons/attach/CfgVehicles.hpp index bc1f52988a..e7b5cb3bb4 100644 --- a/addons/attach/CfgVehicles.hpp +++ b/addons/attach/CfgVehicles.hpp @@ -83,15 +83,17 @@ class CfgVehicles { simulation = "nvmarker"; class NVGMarker { - diffuse[] = {0,0,0}; - ambient[] = {0,0,0}; - brightness = 0.004; + diffuse[] = {0.006, 0.006, 0.006, 1}; + ambient[] = {0.005, 0.005, 0.005, 1}; + brightness = 0.2; name = "pozicni blik"; - drawLight = 1; - drawLightSize = 0.005; + drawLightSize = 0.2; drawLightCenterSize = 0.003; activeLight = 0; blinking=1; + blinkingStartsOn=1; + blinkingPattern[] = {2,2}; + blinkingPatternGuarantee = false; dayLight = 0; onlyInNvg = 1; useFlare = 0; From 44aaf3955b2f59fe18c346f784f4b614552af88b Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 15 Feb 2015 15:48:40 +0100 Subject: [PATCH 078/166] some backblast cleanup --- addons/backblast/CfgEventHandlers.hpp | 8 +++--- addons/backblast/CfgWeapons.hpp | 35 +++++++++++++++------------ addons/backblast/config.cpp | 3 +-- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/addons/backblast/CfgEventHandlers.hpp b/addons/backblast/CfgEventHandlers.hpp index a336a5dd41..aaa0189b6d 100644 --- a/addons/backblast/CfgEventHandlers.hpp +++ b/addons/backblast/CfgEventHandlers.hpp @@ -7,11 +7,11 @@ class Extended_PreInit_EventHandlers { class Extended_FiredNear_EventHandlers { class CAManBase { - class GVAR(LauncherBackblast) { - FiredNear = QUOTE( if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 3 >> 'ACE_Backblast_Damage') > 0}) then {_this call FUNC(launcherBackblast)} ); + class ADDON { + firedNear = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 3 >> 'ACE_Backblast_Damage') > 0}) then {_this call DFUNC(launcherBackblast)}); }; - class GVAR(TankDangerZone) { - FiredNear = QUOTE( if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 3 >> 'ACE_DangerZone_Damage') > 0}) then {_this call FUNC(tankDangerZone)} ); + class ADDON { + firedNear = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 3 >> 'ACE_DangerZone_Damage') > 0}) then {_this call DFUNC(tankDangerZone)}); }; }; }; diff --git a/addons/backblast/CfgWeapons.hpp b/addons/backblast/CfgWeapons.hpp index fcb4bde0c5..f4f7c07153 100644 --- a/addons/backblast/CfgWeapons.hpp +++ b/addons/backblast/CfgWeapons.hpp @@ -1,33 +1,37 @@ + class CfgWeapons { class LauncherCore; class Launcher: LauncherCore { - ACE_Backblast_Angle = 60; - ACE_Backblast_Range = 10; - ACE_Backblast_Damage = 0.7; + GVAR(angle) = 60; + GVAR(range) = 10; + GVAR(damage) = 0.7; }; + class Launcher_Base_F: Launcher {}; class launch_Titan_base: Launcher_Base_F { - ACE_Backblast_Angle = 40; - ACE_Backblast_Range = 8; - ACE_Backblast_Damage = 0.5; + GVAR(angle) = 40; + GVAR(range) = 8; + GVAR(damage) = 0.5; }; + class launch_Titan_short_base: launch_Titan_base { - ACE_Backblast_Angle = 40; - ACE_Backblast_Range = 8; - ACE_Backblast_Damage = 0.5; + GVAR(angle) = 40; + GVAR(range) = 8; + GVAR(damage) = 0.5; }; class launch_NLAW_F: Launcher_Base_F { - ACE_Backblast_Angle = 40; - ACE_Backblast_Range = 5; - ACE_Backblast_Damage = 0.6; + GVAR(angle) = 40; + GVAR(range) = 5; + GVAR(damage) = 0.6; }; + class launch_RPG32_F: Launcher_Base_F { - ACE_Backblast_Angle = 60; - ACE_Backblast_Range = 15; - ACE_Backblast_Damage = 0.7; + GVAR(angle) = 60; + GVAR(range) = 15; + GVAR(damage) = 0.7; }; class CannonCore; @@ -36,6 +40,7 @@ class CfgWeapons { ACE_DangerZone_Range = 50; ACE_DangerZone_Damage = 0.85; }; + class mortar_155mm_AMOS: CannonCore { ACE_DangerZone_Angle = 90; ACE_DangerZone_Range = 60; diff --git a/addons/backblast/config.cpp b/addons/backblast/config.cpp index 88de936cf9..d4aaf8131b 100644 --- a/addons/backblast/config.cpp +++ b/addons/backblast/config.cpp @@ -6,12 +6,11 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; - author[] = {"commy2", "KoffeinFlummi"}; + author[] = {"commy2","KoffeinFlummi"}; authorUrl = "https://github.com/commy2/"; VERSION_CONFIG; }; }; #include "CfgEventHandlers.hpp" - #include "CfgWeapons.hpp" From f3a94f03ed94059840c8c67287ca2ece5c17d38e Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 15 Feb 2015 17:14:09 +0100 Subject: [PATCH 079/166] clean up backblast --- .../functions/fnc_backblastDamage.sqf | 39 ++++++++++--------- .../functions/fnc_fireLauncherBackblast.sqf | 24 +++++++----- .../functions/fnc_fireOverpressureZone.sqf | 23 ++++++----- .../backblast/functions/fnc_getDistance.sqf | 6 +-- .../functions/fnc_overpressureDamage.sqf | 37 ++++++++++-------- 5 files changed, 74 insertions(+), 55 deletions(-) diff --git a/addons/backblast/functions/fnc_backblastDamage.sqf b/addons/backblast/functions/fnc_backblastDamage.sqf index 21d2e81736..651dc58830 100644 --- a/addons/backblast/functions/fnc_backblastDamage.sqf +++ b/addons/backblast/functions/fnc_backblastDamage.sqf @@ -1,5 +1,5 @@ /* - * Author: Commy2 and CAA-Picard + * Author: commy2 and CAA-Picard * * Calculate and apply backblast damage to potentially affected local units * @@ -16,52 +16,55 @@ EXPLODE_4_PVT(_this,_firer,_posASL,_direction,_weapon); -private ["_backblastAngle","_backblastRange","_backblastDamage"]; -_backblastAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Angle") / 2; -_backblastRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Range"); -_backblastDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Damage"); +private ["_backblastAngle", "_backblastRange", "_backblastDamage"]; + +_backblastAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; +_backblastRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); +_backblastDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); + TRACE_4("Parameters:",_backblastAngle,_backblastRange,_backblastDamage,_weapon); +private "_pos"; _pos = _posASL; if (!surfaceIsWater _pos) then { _pos = ASLtoATL _pos; }; -_affected = _pos nearEntities ["CAManBase", _backblastRange]; { - _unit = _x; - if (local _unit && _unit != _firer && vehicle _unit == _unit) then { + if (local _x && {_x != _firer} && {vehicle _x == _x}) then { + private ["_targetPositionASL", "_relativePosition", "_axisDistance", "_distance", "_angle", "_line", "_line2"]; - _targetPositionASL = eyePos _unit; + _targetPositionASL = eyePos _x; _relativePosition = _targetPositionASL vectorDiff _posASL; _axisDistance = _relativePosition vectorDotProduct _direction; _distance = vectorMagnitude _relativePosition; _angle = acos (_axisDistance / _distance); - _line = [_posASL, _targetPositionASL, _firer, _unit]; + _line = [_posASL, _targetPositionASL, _firer, _x]; _line2 = [_posASL, _targetPositionASL]; - TRACE_4("Affected:",_unit,_axisDistance,_distance,_angle); + TRACE_4("Affected:",_x,_axisDistance,_distance,_angle); + if (_angle < _backblastAngle && {_distance < _backblastRange} && {!lineIntersects _line} && {!terrainIntersectASL _line2}) then { + private ["_alpha", "_beta", "_damage"]; + _alpha = sqrt (1 - _distance / _backblastRange); _beta = sqrt (1 - _angle / _backblastAngle); _damage = 2 * _alpha * _beta * _backblastDamage; // If the target is the ACE_player - if (_unit == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; + if (_x == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; // TODO: Sort this interaction with medical if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { - [_unit, "HitBody", ([_unit, "", ((_unit getHitPointDamage "HitBody") + _damage), objNull, objNull] call EFUNC(medical,handleDamage))] call EFUNC(medical,setHitPointDamage); - _unit spawn { + [_x, "HitBody", ([_x, "", (_x getHitPointDamage "HitBody") + _damage, objNull, objNull] call EFUNC(medical,handleDamage))] call EFUNC(medical,setHitPointDamage); + _x spawn { sleep 0.5; [_this, "", 0, objNull, objNull] call EFUNC(medical,handleDamage); }; } else { - _unit setDamage (damage _unit + _damage); + _x setDamage (damage _x + _damage); }; }; }; -} forEach _affected; - - +} forEach (_pos nearEntities ["CAManBase", _backblastRange]); diff --git a/addons/backblast/functions/fnc_fireLauncherBackblast.sqf b/addons/backblast/functions/fnc_fireLauncherBackblast.sqf index 5970e7b9c2..a35af9f19d 100644 --- a/addons/backblast/functions/fnc_fireLauncherBackblast.sqf +++ b/addons/backblast/functions/fnc_fireLauncherBackblast.sqf @@ -23,27 +23,32 @@ EXPLODE_7_PVT(_this,_firer,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); // Prevent AI from causing backblast damage if !([_firer] call EFUNC(common,isPlayer)) exitWith {}; -private ["_position","_direction","_distance","_alpha","_beta","_damage","_affected"]; +private ["_position", "_direction"]; + _position = getPosASL _projectile; _direction = [0, 0, 0] vectorDiff (vectorDir _projectile); -private ["_backblastAngle","_backblastRange","_backblastDamage"]; -_backblastAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Angle") / 2; -_backblastRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Range"); -_backblastDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_Backblast_Damage"); +private ["_backblastAngle", "_backblastRange", "_backblastDamage"]; +_backblastAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; +_backblastRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); +_backblastDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); // Damage to others +private "_affected"; _affected = getPos _projectile nearEntities ["CAManBase", _backblastRange]; -// Let each client handle their own affected units -["backblast", _affected, [_firer,_position,_direction,_weapon]] call EFUNC(common,targetEvent); +// Let each client handle their own affected units +["backblast", _affected, [_firer, _position, _direction, _weapon]] call EFUNC(common,targetEvent); // Damage to the firer +private "_distance"; _distance = [_position, _direction, _backblastRange] call FUNC(getDistance); -TRACE_1("Distance", _distance); + +TRACE_1("Distance",_distance); if (_distance < _backblastRange) then { + private ["_alpha", "_beta", "_damage"]; _alpha = sqrt (1 - _distance / _backblastRange); _beta = sqrt 0.5; @@ -66,6 +71,7 @@ if (_distance < _backblastRange) then { [1,1,0,1] ] call EFUNC(common,addLineToDebugDraw); + private "_ref"; _ref = _direction call EFUNC(common,createOrthonormalReference); [ _position, _position vectorAdd (_direction vectorMultiply _backblastRange) vectorAdd ((_ref select 1) vectorMultiply _backblastRange * tan _backblastAngle), @@ -88,4 +94,4 @@ if (_distance < _backblastRange) then { _position vectorAdd (_direction vectorMultiply (_distance min _backblastRange)), [1,0,0,1] ] call EFUNC(common,addLineToDebugDraw); -#endif \ No newline at end of file +#endif diff --git a/addons/backblast/functions/fnc_fireOverpressureZone.sqf b/addons/backblast/functions/fnc_fireOverpressureZone.sqf index c638f4ad82..0ded8f974b 100644 --- a/addons/backblast/functions/fnc_fireOverpressureZone.sqf +++ b/addons/backblast/functions/fnc_fireOverpressureZone.sqf @@ -14,28 +14,32 @@ * * Return value: * None - *///#define DEBUG_MODE_FULL + */ +//#define DEBUG_MODE_FULL #include "script_component.hpp" EXPLODE_7_PVT(_this,_firer,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); // Prevent AI from causing backblast damage -if !([gunner _firer] call EFUNC(common,isPlayer)) exitWith {}; +if !([gunner _firer] call EFUNC(common,isPlayer)) exitWith {}; //@todo non-maingun turrets? + +private ["_position", "_direction"]; -private ["_position","_direction","_distance","_alpha","_beta","_damage","_affected"]; _position = getPosASL _projectile; _direction = vectorDir _projectile; -private ["_dangerZoneAngle","_dangerZoneRange","_dangerZoneDamage"]; -_dangerZoneAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Angle") / 2; -_dangerZoneRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Range"); -_dangerZoneDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Damage"); +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)); // 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]] call EFUNC(common,targetEvent); // Draw debug lines #ifdef DEBUG_MODE_FULL @@ -44,6 +48,7 @@ _affected = getPos _projectile nearEntities ["CAManBase", _dangerZoneRange]; [1,0,0,1] ] call EFUNC(common,addLineToDebugDraw); + private "_ref"; _ref = _direction call EFUNC(common,createOrthonormalReference); [ _position, _position vectorAdd (_direction vectorMultiply _dangerZoneRange) vectorAdd ((_ref select 1) vectorMultiply _dangerZoneRange * tan _dangerZoneAngle), @@ -62,4 +67,4 @@ _affected = getPos _projectile nearEntities ["CAManBase", _dangerZoneRange]; [1,1,0,1] ] call EFUNC(common,addLineToDebugDraw); -#endif \ No newline at end of file +#endif diff --git a/addons/backblast/functions/fnc_getDistance.sqf b/addons/backblast/functions/fnc_getDistance.sqf index b6f61548c6..6ffa60f7af 100644 --- a/addons/backblast/functions/fnc_getDistance.sqf +++ b/addons/backblast/functions/fnc_getDistance.sqf @@ -1,5 +1,5 @@ /* - * Author: Commy2 and CAA-Picard + * Author: commy2 and CAA-Picard * * Calculate the distance to the first intersection of a line * @@ -13,10 +13,10 @@ */ #include "script_component.hpp" -private ["_distance", "_interval", "_line", "_line"]; - EXPLODE_3_PVT(_this,_posASL,_direction,_maxDistance); +private ["_distance", "_interval", "_line", "_intersections"]; + _distance = _maxDistance; _interval = _distance; _line = [_posASL, []]; diff --git a/addons/backblast/functions/fnc_overpressureDamage.sqf b/addons/backblast/functions/fnc_overpressureDamage.sqf index 5dd7447ce8..995c5db9e4 100644 --- a/addons/backblast/functions/fnc_overpressureDamage.sqf +++ b/addons/backblast/functions/fnc_overpressureDamage.sqf @@ -1,5 +1,5 @@ /* - * Author: Commy2 and CAA-Picard + * Author: commy2 and CAA-Picard * * Calculate and apply overpressure damage to potentially affected local units * @@ -16,50 +16,55 @@ EXPLODE_4_PVT(_this,_firer,_posASL,_direction,_weapon); -private ["_dangerZoneAngle","_dangerZoneRange","_dangerZoneDamage"]; -_dangerZoneAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Angle") / 2; -_dangerZoneRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Range"); -_dangerZoneDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> "ACE_DangerZone_Damage"); +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)); + TRACE_4("Parameters:",_dangerZoneAngle,_dangerZoneRange,_dangerZoneDamage,_weapon); +private "_pos"; _pos = _posASL; if (!surfaceIsWater _pos) then { _pos = ASLtoATL _pos; }; -_affected = _pos nearEntities ["CAManBase", _dangerZoneRange]; { - _unit = _x; - if (local _unit && _unit != _firer && vehicle _unit == _unit) then { + if (local _x && {_x != _firer} && {vehicle _x == _x}) then { + private ["_targetPositionASL", "_relativePosition", "_axisDistance", "_distance", "_angle", "_line", "_line2"]; - _targetPositionASL = eyePos _unit; + _targetPositionASL = eyePos _x; _relativePosition = _targetPositionASL vectorDiff _posASL; _axisDistance = _relativePosition vectorDotProduct _direction; _distance = vectorMagnitude _relativePosition; _angle = acos (_axisDistance / _distance); - _line = [_posASL, _targetPositionASL, _firer, _unit]; + _line = [_posASL, _targetPositionASL, _firer, _x]; _line2 = [_posASL, _targetPositionASL]; - TRACE_4("Affected:",_unit,_axisDistance,_distance,_angle); + TRACE_4("Affected:",_x,_axisDistance,_distance,_angle); + if (_angle < _dangerZoneAngle && {_distance < _dangerZoneRange} && {!lineIntersects _line} && {!terrainIntersectASL _line2}) then { + private ["_alpha", "_beta", "_damage"]; + _alpha = sqrt (1 - _distance / _dangerZoneRange); _beta = sqrt (1 - _angle / _dangerZoneAngle); _damage = 2 * _alpha * _beta * _dangerZoneDamage; // If the target is the ACE_player - if (_unit == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; + if (_x == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; // @todo: Sort this interaction with medical if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { - [_unit, "HitBody", ([_unit, "", ((_unit getHitPointDamage "HitBody") + _damage), objNull, objNull] call EFUNC(medical,handleDamage))] call EFUNC(medical,setHitPointDamage); - _unit spawn { + [_x, "HitBody", ([_x, "", ((_x getHitPointDamage "HitBody") + _damage), objNull, objNull] call EFUNC(medical,handleDamage))] call EFUNC(medical,setHitPointDamage); + _x spawn { sleep 0.5; [_this, "", 0, objNull, objNull] call EFUNC(medical,handleDamage); }; } else { - _unit setDamage (damage _unit + _damage); + _x setDamage (damage _x + _damage); }; }; }; -} forEach _affected; +} forEach (_pos nearEntities ["CAManBase", _dangerZoneRange]); From 3f98d1485ea0f6545e6a48ce67216b15d64e4fa3 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 15 Feb 2015 17:17:20 +0100 Subject: [PATCH 080/166] author name --- addons/backblast/functions/fnc_fireLauncherBackblast.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/backblast/functions/fnc_fireLauncherBackblast.sqf b/addons/backblast/functions/fnc_fireLauncherBackblast.sqf index a35af9f19d..515135d56f 100644 --- a/addons/backblast/functions/fnc_fireLauncherBackblast.sqf +++ b/addons/backblast/functions/fnc_fireLauncherBackblast.sqf @@ -1,5 +1,5 @@ /* - * Author: Commy2 and CAA-Picard + * Author: commy2 and CAA-Picard * * Handle fire of local launchers * From f3aa0e58aa84eade721047a4fdd24c6defce4be3 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 15 Feb 2015 17:55:20 +0100 Subject: [PATCH 081/166] clean up backblast --- addons/backblast/CfgWeapons.hpp | 12 ++-- addons/backblast/XEH_postInit.sqf | 1 - addons/backblast/XEH_preInit.sqf | 1 - .../functions/fnc_fireOverpressureZone.sqf | 2 +- .../functions/fnc_overpressureDamage.sqf | 70 ------------------- 5 files changed, 7 insertions(+), 79 deletions(-) delete mode 100644 addons/backblast/functions/fnc_overpressureDamage.sqf diff --git a/addons/backblast/CfgWeapons.hpp b/addons/backblast/CfgWeapons.hpp index f4f7c07153..5880795ee2 100644 --- a/addons/backblast/CfgWeapons.hpp +++ b/addons/backblast/CfgWeapons.hpp @@ -36,14 +36,14 @@ class CfgWeapons { class CannonCore; class cannon_120mm: CannonCore { - ACE_DangerZone_Angle = 90; - ACE_DangerZone_Range = 50; - ACE_DangerZone_Damage = 0.85; + GVAR(angle) = 90; + GVAR(range) = 50; + GVAR(damage) = 0.85; }; class mortar_155mm_AMOS: CannonCore { - ACE_DangerZone_Angle = 90; - ACE_DangerZone_Range = 60; - ACE_DangerZone_Damage = 1; + GVAR(angle) = 90; + GVAR(range) = 60; + GVAR(damage) = 1; }; }; diff --git a/addons/backblast/XEH_postInit.sqf b/addons/backblast/XEH_postInit.sqf index 72ca42a012..6f9a6f4cf8 100644 --- a/addons/backblast/XEH_postInit.sqf +++ b/addons/backblast/XEH_postInit.sqf @@ -1,4 +1,3 @@ #include "script_component.hpp" ["backblast", FUNC(backblastDamage)] call EFUNC(common,addEventHandler); -["overpressure", FUNC(overpressureDamage)] call EFUNC(common,addEventHandler); diff --git a/addons/backblast/XEH_preInit.sqf b/addons/backblast/XEH_preInit.sqf index 11193c3bf4..dde5f3affe 100644 --- a/addons/backblast/XEH_preInit.sqf +++ b/addons/backblast/XEH_preInit.sqf @@ -6,6 +6,5 @@ PREP(backblastDamage); PREP(fireLauncherBackblast); PREP(fireOverpressureZone); PREP(getDistance); -PREP(overpressureDamage); ADDON = true; diff --git a/addons/backblast/functions/fnc_fireOverpressureZone.sqf b/addons/backblast/functions/fnc_fireOverpressureZone.sqf index 0ded8f974b..178b519fc0 100644 --- a/addons/backblast/functions/fnc_fireOverpressureZone.sqf +++ b/addons/backblast/functions/fnc_fireOverpressureZone.sqf @@ -39,7 +39,7 @@ 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); +["backblast", _affected, [_firer, _position, _direction, _weapon]] call EFUNC(common,targetEvent); // Draw debug lines #ifdef DEBUG_MODE_FULL diff --git a/addons/backblast/functions/fnc_overpressureDamage.sqf b/addons/backblast/functions/fnc_overpressureDamage.sqf deleted file mode 100644 index 995c5db9e4..0000000000 --- a/addons/backblast/functions/fnc_overpressureDamage.sqf +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Author: commy2 and CAA-Picard - * - * Calculate and apply overpressure 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) - * - * Return value: - * None - */ -#include "script_component.hpp" - -EXPLODE_4_PVT(_this,_firer,_posASL,_direction,_weapon); - -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)); - -TRACE_4("Parameters:",_dangerZoneAngle,_dangerZoneRange,_dangerZoneDamage,_weapon); - -private "_pos"; -_pos = _posASL; -if (!surfaceIsWater _pos) then { - _pos = ASLtoATL _pos; -}; - -{ - if (local _x && {_x != _firer} && {vehicle _x == _x}) then { - private ["_targetPositionASL", "_relativePosition", "_axisDistance", "_distance", "_angle", "_line", "_line2"]; - - _targetPositionASL = eyePos _x; - _relativePosition = _targetPositionASL vectorDiff _posASL; - _axisDistance = _relativePosition vectorDotProduct _direction; - _distance = vectorMagnitude _relativePosition; - _angle = acos (_axisDistance / _distance); - - _line = [_posASL, _targetPositionASL, _firer, _x]; - _line2 = [_posASL, _targetPositionASL]; - TRACE_4("Affected:",_x,_axisDistance,_distance,_angle); - - if (_angle < _dangerZoneAngle && {_distance < _dangerZoneRange} && {!lineIntersects _line} && {!terrainIntersectASL _line2}) then { - private ["_alpha", "_beta", "_damage"]; - - _alpha = sqrt (1 - _distance / _dangerZoneRange); - _beta = sqrt (1 - _angle / _dangerZoneAngle); - - _damage = 2 * _alpha * _beta * _dangerZoneDamage; - - // If the target is the ACE_player - if (_x == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; - - // @todo: Sort this interaction with medical - if (isClass (configFile >> "CfgPatches" >> "ACE_Medical")) then { - [_x, "HitBody", ([_x, "", ((_x getHitPointDamage "HitBody") + _damage), objNull, objNull] call EFUNC(medical,handleDamage))] call EFUNC(medical,setHitPointDamage); - _x spawn { - sleep 0.5; - [_this, "", 0, objNull, objNull] call EFUNC(medical,handleDamage); - }; - } else { - _x setDamage (damage _x + _damage); - }; - }; - }; -} forEach (_pos nearEntities ["CAManBase", _dangerZoneRange]); From 2252f82de7a8279d5dca76f4c871a2ccd0617d8d Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 15 Feb 2015 18:11:50 +0100 Subject: [PATCH 082/166] rename backblast to overpressure --- addons/backblast/$PBOPREFIX$ | 1 - addons/backblast/XEH_postInit.sqf | 3 --- .../backblast/functions/script_component.hpp | 1 - addons/backblast/script_component.hpp | 12 ----------- addons/overpressure/$PBOPREFIX$ | 1 + .../CfgEventHandlers.hpp | 0 .../CfgWeapons.hpp | 0 addons/{backblast => overpressure}/README.md | 0 addons/overpressure/XEH_postInit.sqf | 3 +++ .../XEH_preInit.sqf | 2 +- addons/{backblast => overpressure}/config.cpp | 0 .../functions/fnc_fireLauncherBackblast.sqf | 2 +- .../functions/fnc_fireOverpressureZone.sqf | 6 +++--- .../functions/fnc_getDistance.sqf | 0 .../functions/fnc_overpressureDamage.sqf} | 20 +++++++++---------- .../functions/script_component.hpp | 1 + addons/overpressure/script_component.hpp | 12 +++++++++++ 17 files changed, 32 insertions(+), 32 deletions(-) delete mode 100644 addons/backblast/$PBOPREFIX$ delete mode 100644 addons/backblast/XEH_postInit.sqf delete mode 100644 addons/backblast/functions/script_component.hpp delete mode 100644 addons/backblast/script_component.hpp create mode 100644 addons/overpressure/$PBOPREFIX$ rename addons/{backblast => overpressure}/CfgEventHandlers.hpp (100%) rename addons/{backblast => overpressure}/CfgWeapons.hpp (100%) rename addons/{backblast => overpressure}/README.md (100%) create mode 100644 addons/overpressure/XEH_postInit.sqf rename addons/{backblast => overpressure}/XEH_preInit.sqf (84%) rename addons/{backblast => overpressure}/config.cpp (100%) rename addons/{backblast => overpressure}/functions/fnc_fireLauncherBackblast.sqf (97%) rename addons/{backblast => overpressure}/functions/fnc_fireOverpressureZone.sqf (92%) rename addons/{backblast => overpressure}/functions/fnc_getDistance.sqf (100%) rename addons/{backblast/functions/fnc_backblastDamage.sqf => overpressure/functions/fnc_overpressureDamage.sqf} (69%) create mode 100644 addons/overpressure/functions/script_component.hpp create mode 100644 addons/overpressure/script_component.hpp diff --git a/addons/backblast/$PBOPREFIX$ b/addons/backblast/$PBOPREFIX$ deleted file mode 100644 index c5ed230994..0000000000 --- a/addons/backblast/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\backblast \ No newline at end of file diff --git a/addons/backblast/XEH_postInit.sqf b/addons/backblast/XEH_postInit.sqf deleted file mode 100644 index 6f9a6f4cf8..0000000000 --- a/addons/backblast/XEH_postInit.sqf +++ /dev/null @@ -1,3 +0,0 @@ -#include "script_component.hpp" - -["backblast", FUNC(backblastDamage)] call EFUNC(common,addEventHandler); diff --git a/addons/backblast/functions/script_component.hpp b/addons/backblast/functions/script_component.hpp deleted file mode 100644 index 817131570f..0000000000 --- a/addons/backblast/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\backblast\script_component.hpp" \ No newline at end of file diff --git a/addons/backblast/script_component.hpp b/addons/backblast/script_component.hpp deleted file mode 100644 index 9f2a71f2d5..0000000000 --- a/addons/backblast/script_component.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#define COMPONENT backblast -#include "\z\ace\Addons\main\script_mod.hpp" - -#ifdef DEBUG_ENABLED_BACKBLAST - #define DEBUG_MODE_FULL -#endif - -#ifdef DEBUG_SETTINGS_BACKBLAST - #define DEBUG_SETTINGS DEBUG_SETTINGS_BACKBLAST -#endif - -#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/overpressure/$PBOPREFIX$ b/addons/overpressure/$PBOPREFIX$ new file mode 100644 index 0000000000..fc5a82e0f7 --- /dev/null +++ b/addons/overpressure/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\overpressure \ No newline at end of file diff --git a/addons/backblast/CfgEventHandlers.hpp b/addons/overpressure/CfgEventHandlers.hpp similarity index 100% rename from addons/backblast/CfgEventHandlers.hpp rename to addons/overpressure/CfgEventHandlers.hpp diff --git a/addons/backblast/CfgWeapons.hpp b/addons/overpressure/CfgWeapons.hpp similarity index 100% rename from addons/backblast/CfgWeapons.hpp rename to addons/overpressure/CfgWeapons.hpp diff --git a/addons/backblast/README.md b/addons/overpressure/README.md similarity index 100% rename from addons/backblast/README.md rename to addons/overpressure/README.md diff --git a/addons/overpressure/XEH_postInit.sqf b/addons/overpressure/XEH_postInit.sqf new file mode 100644 index 0000000000..33c2e679c9 --- /dev/null +++ b/addons/overpressure/XEH_postInit.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +["overpressure", FUNC(overpressureDamage)] call EFUNC(common,addEventHandler); diff --git a/addons/backblast/XEH_preInit.sqf b/addons/overpressure/XEH_preInit.sqf similarity index 84% rename from addons/backblast/XEH_preInit.sqf rename to addons/overpressure/XEH_preInit.sqf index dde5f3affe..5eefc5eae4 100644 --- a/addons/backblast/XEH_preInit.sqf +++ b/addons/overpressure/XEH_preInit.sqf @@ -2,9 +2,9 @@ ADDON = false; -PREP(backblastDamage); PREP(fireLauncherBackblast); PREP(fireOverpressureZone); PREP(getDistance); +PREP(overpressureDamage); ADDON = true; diff --git a/addons/backblast/config.cpp b/addons/overpressure/config.cpp similarity index 100% rename from addons/backblast/config.cpp rename to addons/overpressure/config.cpp diff --git a/addons/backblast/functions/fnc_fireLauncherBackblast.sqf b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf similarity index 97% rename from addons/backblast/functions/fnc_fireLauncherBackblast.sqf rename to addons/overpressure/functions/fnc_fireLauncherBackblast.sqf index 515135d56f..f42ffd23ed 100644 --- a/addons/backblast/functions/fnc_fireLauncherBackblast.sqf +++ b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf @@ -39,7 +39,7 @@ private "_affected"; _affected = getPos _projectile nearEntities ["CAManBase", _backblastRange]; // Let each client handle their own affected units -["backblast", _affected, [_firer, _position, _direction, _weapon]] call EFUNC(common,targetEvent); +["overpressure", _affected, [_firer, _position, _direction, _weapon]] call EFUNC(common,targetEvent); // Damage to the firer private "_distance"; diff --git a/addons/backblast/functions/fnc_fireOverpressureZone.sqf b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf similarity index 92% rename from addons/backblast/functions/fnc_fireOverpressureZone.sqf rename to addons/overpressure/functions/fnc_fireOverpressureZone.sqf index 178b519fc0..cc4918275d 100644 --- a/addons/backblast/functions/fnc_fireOverpressureZone.sqf +++ b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf @@ -1,5 +1,5 @@ /* - * Author: Commy2 and CAA-Picard + * Author: commy2 and CAA-Picard * * Handle fire of local vehicle weapons creating overpressure zones * @@ -20,7 +20,7 @@ EXPLODE_7_PVT(_this,_firer,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -// Prevent AI from causing backblast damage +// Prevent AI from causing overpressure damage if !([gunner _firer] call EFUNC(common,isPlayer)) exitWith {}; //@todo non-maingun turrets? private ["_position", "_direction"]; @@ -39,7 +39,7 @@ private "_affected"; _affected = getPos _projectile nearEntities ["CAManBase", _dangerZoneRange]; // Let each client handle their own affected units -["backblast", _affected, [_firer, _position, _direction, _weapon]] call EFUNC(common,targetEvent); +["overpressure", _affected, [_firer, _position, _direction, _weapon]] call EFUNC(common,targetEvent); // Draw debug lines #ifdef DEBUG_MODE_FULL diff --git a/addons/backblast/functions/fnc_getDistance.sqf b/addons/overpressure/functions/fnc_getDistance.sqf similarity index 100% rename from addons/backblast/functions/fnc_getDistance.sqf rename to addons/overpressure/functions/fnc_getDistance.sqf diff --git a/addons/backblast/functions/fnc_backblastDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf similarity index 69% rename from addons/backblast/functions/fnc_backblastDamage.sqf rename to addons/overpressure/functions/fnc_overpressureDamage.sqf index 651dc58830..c19fed1c04 100644 --- a/addons/backblast/functions/fnc_backblastDamage.sqf +++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf @@ -16,13 +16,13 @@ EXPLODE_4_PVT(_this,_firer,_posASL,_direction,_weapon); -private ["_backblastAngle", "_backblastRange", "_backblastDamage"]; +private ["_overpressureAngle", "_overpressureRange", "_overpressureDamage"]; -_backblastAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; -_backblastRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); -_backblastDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); +_overpressureAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; +_overpressureRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); +_overpressureDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); -TRACE_4("Parameters:",_backblastAngle,_backblastRange,_backblastDamage,_weapon); +TRACE_4("Parameters:",_overpressureAngle,_overpressureRange,_overpressureDamage,_weapon); private "_pos"; _pos = _posASL; @@ -44,13 +44,13 @@ if (!surfaceIsWater _pos) then { _line2 = [_posASL, _targetPositionASL]; TRACE_4("Affected:",_x,_axisDistance,_distance,_angle); - if (_angle < _backblastAngle && {_distance < _backblastRange} && {!lineIntersects _line} && {!terrainIntersectASL _line2}) then { + if (_angle < _overpressureAngle && {_distance < _overpressureRange} && {!lineIntersects _line} && {!terrainIntersectASL _line2}) then { private ["_alpha", "_beta", "_damage"]; - _alpha = sqrt (1 - _distance / _backblastRange); - _beta = sqrt (1 - _angle / _backblastAngle); + _alpha = sqrt (1 - _distance / _overpressureRange); + _beta = sqrt (1 - _angle / _overpressureAngle); - _damage = 2 * _alpha * _beta * _backblastDamage; + _damage = 2 * _alpha * _beta * _overpressureDamage; // If the target is the ACE_player if (_x == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; @@ -67,4 +67,4 @@ if (!surfaceIsWater _pos) then { }; }; }; -} forEach (_pos nearEntities ["CAManBase", _backblastRange]); +} forEach (_pos nearEntities ["CAManBase", _overpressureRange]); diff --git a/addons/overpressure/functions/script_component.hpp b/addons/overpressure/functions/script_component.hpp new file mode 100644 index 0000000000..d66ac7aec3 --- /dev/null +++ b/addons/overpressure/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\overpressure\script_component.hpp" \ No newline at end of file diff --git a/addons/overpressure/script_component.hpp b/addons/overpressure/script_component.hpp new file mode 100644 index 0000000000..8dac72cbbf --- /dev/null +++ b/addons/overpressure/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT overpressure +#include "\z\ace\Addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_OVERPRESSURE + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_ENABLED_OVERPRESSURE + #define DEBUG_SETTINGS DEBUG_ENABLED_OVERPRESSURE +#endif + +#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file From 618ac2f8f65279625678ec26e6d625c0202caff2 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 15 Feb 2015 18:44:10 +0100 Subject: [PATCH 083/166] change overpressure readme.md --- addons/overpressure/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/overpressure/README.md b/addons/overpressure/README.md index 857776693a..3d3f242e40 100644 --- a/addons/overpressure/README.md +++ b/addons/overpressure/README.md @@ -1,4 +1,4 @@ -ace_backblast +ace_overpressure ============= Adds backblast to AT launchers and overpressure zones to tank cannons. From e8933d69c8cd582e0628689a5c67f7cc48d98842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Sun, 15 Feb 2015 15:42:54 -0300 Subject: [PATCH 084/166] overpressure: renamed more config entries; avoid handheld launchers producing overpressure in addition to backblast. --- addons/overpressure/CfgEventHandlers.hpp | 27 +++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/addons/overpressure/CfgEventHandlers.hpp b/addons/overpressure/CfgEventHandlers.hpp index 6258484c7c..9494a61149 100644 --- a/addons/overpressure/CfgEventHandlers.hpp +++ b/addons/overpressure/CfgEventHandlers.hpp @@ -14,12 +14,33 @@ 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 >> 'ACE_Backblast_Damage') > 0}) then {_this call DFUNC(fireLauncherBackblast)}); + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> 'ACE_Overpressure_Damage') > 0}) then {_this call DFUNC(fireLauncherBackblast)}); }; }; - class AllVehicles { + + class Tank { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> 'ACE_DangerZone_Damage') > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> 'ACE_Overpressure_Damage') > 0}) then {_this call DFUNC(fireOverpressureZone)}); + }; + }; + class Car { + class ADDON { + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> 'ACE_Overpressure_Damage') > 0}) then {_this call DFUNC(fireOverpressureZone)}); + }; + }; + class Helicopter { + class ADDON { + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> 'ACE_Overpressure_Damage') > 0}) then {_this call DFUNC(fireOverpressureZone)}); + }; + }; + class Plane { + class ADDON { + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> 'ACE_Overpressure_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 >> 'ACE_Overpressure_Damage') > 0}) then {_this call DFUNC(fireOverpressureZone)}); }; }; }; From be427388813b6c4d1d1414ff3e40fdf167c46055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Sun, 15 Feb 2015 15:56:37 -0300 Subject: [PATCH 085/166] macros --- addons/overpressure/CfgEventHandlers.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/overpressure/CfgEventHandlers.hpp b/addons/overpressure/CfgEventHandlers.hpp index 9494a61149..3503333139 100644 --- a/addons/overpressure/CfgEventHandlers.hpp +++ b/addons/overpressure/CfgEventHandlers.hpp @@ -14,33 +14,33 @@ 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 >> 'ACE_Overpressure_Damage') > 0}) then {_this call DFUNC(fireLauncherBackblast)}); + firedBIS = QUOTE(if (local (_this select 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 >> 'ACE_Overpressure_Damage') > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 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 >> 'ACE_Overpressure_Damage') > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 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 >> 'ACE_Overpressure_Damage') > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 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 >> 'ACE_Overpressure_Damage') > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 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 >> 'ACE_Overpressure_Damage') > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); }; }; }; From 25645c2ae994de3f2b8140850f7da7e2f3677a68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Sun, 15 Feb 2015 16:25:09 -0300 Subject: [PATCH 086/166] mm --- addons/overpressure/CfgEventHandlers.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/overpressure/CfgEventHandlers.hpp b/addons/overpressure/CfgEventHandlers.hpp index 3503333139..40c3b32a57 100644 --- a/addons/overpressure/CfgEventHandlers.hpp +++ b/addons/overpressure/CfgEventHandlers.hpp @@ -14,7 +14,7 @@ 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 >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireLauncherBackblast)}); }; }; From dec34b4b30613e662a5d3d96e09b051076a35835 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 15 Feb 2015 14:55:17 -0600 Subject: [PATCH 087/166] Surrender Fixes Remove XEH GetIn and use vehicleChanged Event Handle Zeus (showHUD) Attempt to handle failed animation change --- addons/captives/CfgEventHandlers.hpp | 10 ----- addons/captives/XEH_postInit.sqf | 3 ++ addons/captives/XEH_preInit.sqf | 3 +- addons/captives/functions/fnc_handleGetIn.sqf | 24 ------------ .../functions/fnc_handleKnockedOut.sqf | 25 ++++++++++++- .../functions/fnc_handlePlayerChanged.sqf | 8 +++- .../functions/fnc_handleVehicleChanged.sqf | 30 +++++++++++++++ .../fnc_handleZeusDisplayChanged.sqf | 31 ++++++++++++++++ .../captives/functions/fnc_setHandcuffed.sqf | 3 ++ addons/captives/functions/fnc_surrender.sqf | 37 ++++++++++--------- 10 files changed, 120 insertions(+), 54 deletions(-) delete mode 100644 addons/captives/functions/fnc_handleGetIn.sqf create mode 100644 addons/captives/functions/fnc_handleVehicleChanged.sqf create mode 100644 addons/captives/functions/fnc_handleZeusDisplayChanged.sqf diff --git a/addons/captives/CfgEventHandlers.hpp b/addons/captives/CfgEventHandlers.hpp index 722750f915..8829d0f275 100644 --- a/addons/captives/CfgEventHandlers.hpp +++ b/addons/captives/CfgEventHandlers.hpp @@ -10,15 +10,6 @@ class Extended_PostInit_EventHandlers { }; }; -//release escorted captive when entering a vehicle -class Extended_GetIn_EventHandlers { - class All { - class GVAR(AutoDetachCaptive) { - getIn = QUOTE(_this call FUNC(handleGetIn)); - }; - }; -}; - //reset captive animation after leaving vehicle class Extended_GetOut_EventHandlers { class All { @@ -45,4 +36,3 @@ class Extended_InitPost_EventHandlers { }; }; }; - diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index 9d1a242d4d..9c124630ee 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -21,6 +21,9 @@ if (isServer) then { }]; }; +["playerVehicleChanged", {_this call FUNC(handleVehicleChanged)}] call EFUNC(common,addEventHandler); +["zeusDisplayChanged", {_this call FUNC(handleZeusDisplayChanged)}] call EFUNC(common,addEventHandler); + //TODO: Medical Integration Events??? // [_unit, "knockedOut", { diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 75ee77e9bc..f6ec44225f 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -16,12 +16,13 @@ PREP(doFriskPerson); PREP(doLoadCaptive); PREP(doRemoveHandcuffs); PREP(doUnloadCaptive); -PREP(handleGetIn); PREP(handleGetOut); PREP(handleKilled); PREP(handleKnockedOut); PREP(handlePlayerChanged); PREP(handleUnitInitPost); +PREP(handleVehicleChanged); +PREP(handleZeusDisplayChanged); PREP(handleWokeUp); PREP(moduleSurrender); PREP(setHandcuffed); diff --git a/addons/captives/functions/fnc_handleGetIn.sqf b/addons/captives/functions/fnc_handleGetIn.sqf deleted file mode 100644 index 54133e2362..0000000000 --- a/addons/captives/functions/fnc_handleGetIn.sqf +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Author: commy2 - * Handles when a unit gets in to a vehicle. Release escorted captive when entering a vehicle - * - * Arguments: - * 0: _vehicle - * 2: dunno - * 1: _unit - * - * Return Value: - * The return value - * - * Example: - * [car2, x, player] call ACE_captives_fnc_handleGetIn - * - * Public: No - */ -#include "script_component.hpp" - -PARAMS_3(_vehicle,_dontcare,_unit); - -if ((local _unit) && (_unit getVariable [QGVAR(isEscorting), false])) then { - _unit setVariable [QGVAR(isEscorting), false, true]; -}; diff --git a/addons/captives/functions/fnc_handleKnockedOut.sqf b/addons/captives/functions/fnc_handleKnockedOut.sqf index 3257d544ca..aba01b194f 100644 --- a/addons/captives/functions/fnc_handleKnockedOut.sqf +++ b/addons/captives/functions/fnc_handleKnockedOut.sqf @@ -1,2 +1,25 @@ -// by commy2 +/* + * Author: PabstMirror + * Handles when a unit gets knocked out. Ends surrendering. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Nothing + * + * Example: + * [bob, true] call ACE_captives_fnc_handleKnockedOut + * + * Public: No + */ +#include "script_component.hpp" + +//ToDo: Waiting on medical integration + +PARAMS_1(_unit); + +if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop + [_unit, _false] call FUNC(surrender); +}; diff --git a/addons/captives/functions/fnc_handlePlayerChanged.sqf b/addons/captives/functions/fnc_handlePlayerChanged.sqf index 13e284ef80..21fd1e1ec3 100644 --- a/addons/captives/functions/fnc_handlePlayerChanged.sqf +++ b/addons/captives/functions/fnc_handlePlayerChanged.sqf @@ -18,10 +18,16 @@ PARAMS_2(_newUnit,_oldUnit); +//set showHUD based on new unit status: if ((_newUnit getVariable [QGVAR(isHandcuffed), false]) || {_newUnit getVariable [QGVAR(isSurrendering), false]}) then { TRACE_1("Player Change (showHUD false)",_newUnit); - showHUD false; + showHUD false; } else { TRACE_1("Player Change (showHUD true)",_newUnit); showHUD true; }; + +//If old player was escorting, stop +if (_oldUnit getVariable [QGVAR(isEscorting), false]) then { + _oldUnit setVariable [QGVAR(isEscorting), false, true]; +}; diff --git a/addons/captives/functions/fnc_handleVehicleChanged.sqf b/addons/captives/functions/fnc_handleVehicleChanged.sqf new file mode 100644 index 0000000000..74f966ecc3 --- /dev/null +++ b/addons/captives/functions/fnc_handleVehicleChanged.sqf @@ -0,0 +1,30 @@ +/* + * Author: commy2 + * Handles when a player's vehicle changes (supports scripted vehicle changes) + * + * Arguments: + * 0: unit + * 1: newVehicle + * + * Return Value: + * Nothing + * + * Example: + * [player, car] call ACE_captives_fnc_handleVehicleChanged + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_vehicle); + +//When moved into a vehicle (action or scripted) +if ((vehicle _unit) != _unit) then { + if (_unit getVariable [QGVAR(isEscorting), false]) then { + _unit setVariable [QGVAR(isEscorting), false, true]; + }; + + if (_unit getVariable [QGVAR(isSurrendering), false]) then { + [_unit, false] call FUNC(surrender); + }; +}; diff --git a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf new file mode 100644 index 0000000000..e328d410fa --- /dev/null +++ b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf @@ -0,0 +1,31 @@ +/* + * Author: PabstMirror + * Handles handles ZeusDisplayChanged event + * Need to reset showHUD after closing zeus + * + * Arguments: + * 0: Unit + * 1: Display is now open + * + * Return Value: + * Nothing + * + * Example: + * [bob1, false] call ACE_captives_fnc_handleZeusDisplayChanged + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_zeusIsOpen); + +//set showHUD based on unit status: +if (!_zeusIsOpen) then { + if ((_unit getVariable [QGVAR(isHandcuffed), false]) || {_unit getVariable [QGVAR(isSurrendering), false]}) then { + TRACE_1("Player Change (showHUD false)",_newUnit); + showHUD false; + } else { + TRACE_1("Player Change (showHUD true)",_newUnit); + showHUD true; + }; +}; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 912b00662f..06906167e9 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -30,6 +30,9 @@ if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) then { if (_state) then { _unit setVariable [QGVAR(isHandcuffed), true, true]; + if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop + [_unit, _false] call FUNC(surrender); + }; [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); _unit setVariable [QGVAR(CargoIndex), ((vehicle _unit) getCargoIndex _unit), true]; diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index 1f0e232926..25d5e6a008 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -30,12 +30,7 @@ if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) then { if (_state) then { _unit setVariable [QGVAR(isSurrendering), true, true]; - [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); - - if (_unit == ACE_player) then { - showHUD false; - }; - + // fix anim on mission start (should work on dedicated servers) [{ PARAMS_1(_unit); @@ -45,19 +40,27 @@ if (_state) then { }; }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); - //PFEH - (TODO: move to event system?) + //Start up a pfeh to make sure the unit actualy goes into the animation + //Only change variables and captivity when they reach that state + //fixes vaulting to break animation [{ - EXPLODE_1_PVT((_this select 0),_unit); - if (_unit getVariable [QGVAR(isSurrendering), false]) then { - //If unit dies, gets knocked out, or is handcuffed then end surrender - if ((!alive _unit) || {_unit getVariable ["ACE_isUnconscious", false]} || {_unit getVariable [QGVAR(isHandcuffed), false]}) then { - [_unit, false] call FUNC(surrender); - [(_this select 1)] call CBA_fnc_removePerFrameHandler; - }; - } else { - [(_this select 1)] call cba_fnc_removePerFrameHandler; + PARAMS_2(_args,_pfID); + EXPLODE_2_PVT(_args,_unit,_maxTime); + + if (time > _maxTime) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + _unit setVariable [QGVAR(isSurrendering), false, true]; + ERROR("Surrender animation failed"); }; - }, 0.0, [_unit]] call CBA_fnc_addPerFrameHandler; + if ((animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon") exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + + if (_unit == ACE_player) then { + showHUD false; + }; + [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); + }; + }, 0, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler; } else { _unit setVariable [QGVAR(isSurrendering), false, true]; [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); From 3c65c422b1ab81db92640ee90a2c52f63fc67b02 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 15 Feb 2015 16:42:00 -0600 Subject: [PATCH 088/166] More Surrender Fixes Increase "drop hands" animation speed (now just 1/2 of normal) Use "AnimChanged" EH to watch for animation breaks while surrendering Only "crack" the hands up animation if we are in the right animation state --- addons/captives/CfgMoves.hpp | 2 +- .../captives/functions/fnc_canSurrender.sqf | 11 +++- addons/captives/functions/fnc_surrender.sqf | 62 +++++++++++-------- 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp index 6e67f3615b..d60fab5a33 100644 --- a/addons/captives/CfgMoves.hpp +++ b/addons/captives/CfgMoves.hpp @@ -72,7 +72,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { InterpolateTo[] = {"Unconscious",0.01}; }; class ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { - speed = 0.333; //for gameplay reasons, slow this down + speed = 0.5; //for gameplay reasons, slow this down actions = "CivilStandActions"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon"; ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1}; diff --git a/addons/captives/functions/fnc_canSurrender.sqf b/addons/captives/functions/fnc_canSurrender.sqf index 238087c62b..4c16e8ccd0 100644 --- a/addons/captives/functions/fnc_canSurrender.sqf +++ b/addons/captives/functions/fnc_canSurrender.sqf @@ -18,5 +18,12 @@ PARAMS_2(_unit,_newSurrenderState); -//TODO: any other conditions?? -(!((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _newSurrenderState)) +private "_returnValue"; + +_returnValue = if (_newSurrenderState) then { + !(_unit getVariable [QGVAR(isSurrendering), false]); //Not currently surrendering +} else { + (_unit getVariable [QGVAR(isSurrendering), false]); //isSurrendering and on the hands up animation - // && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}; +}; + +_returnValue diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index 25d5e6a008..f2103d2c1c 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -30,7 +30,12 @@ if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) then { if (_state) then { _unit setVariable [QGVAR(isSurrendering), true, true]; - + [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); + + if (_unit == ACE_player) then { + showHUD false; + }; + // fix anim on mission start (should work on dedicated servers) [{ PARAMS_1(_unit); @@ -38,37 +43,42 @@ if (_state) then { [_unit] call EFUNC(common,fixLoweredRifleAnimation); [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); }; - }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); - //Start up a pfeh to make sure the unit actualy goes into the animation - //Only change variables and captivity when they reach that state - //fixes vaulting to break animation - [{ - PARAMS_2(_args,_pfID); - EXPLODE_2_PVT(_args,_unit,_maxTime); - - if (time > _maxTime) exitWith { - [_pfID] call CBA_fnc_removePerFrameHandler; - _unit setVariable [QGVAR(isSurrendering), false, true]; - ERROR("Surrender animation failed"); - }; - if ((animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon") exitWith { - [_pfID] call CBA_fnc_removePerFrameHandler; - - if (_unit == ACE_player) then { - showHUD false; + //Adds an animation changed eh + //Should handle changes in animation + _animChangedEHID = _unit addEventHandler ["AnimChanged", { + PARAMS_2(_unit,_newAnimation); + if (_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") then { + ERROR("Surrender animation failed"); + systemChat "You Stop Surrendering"; + [_unit, false] call FUNC(surrender); }; - [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); - }; - }, 0, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler; + }]; + _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; + + }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); } else { _unit setVariable [QGVAR(isSurrendering), false, true]; [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); - if ((vehicle _unit) == _unit) then { - //Break out of hands up animation loop (doAnimation handles Unconscious prioity) - [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); - }; + _animChangedEHID = _unit getVariable [QGVAR(surrenderAnimEHID), -1]; + _unit removeEventHandler ["AnimChanged", _animChangedEHID]; + + //spin up a PFEH, to watching animationState for the next 10 seconds to make sure we don't enter + [{ + PARAMS_2(_args,_pfID); + EXPLODE_2_PVT(_args,_unit,_maxTime); + //If maxtime or they re-surrendered, exit loop + if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]}) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + }; + //Only break animation if they are actualy the "hands up" animation (because we are using switchmove) + if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + //Break out of hands up animation loop (doAnimation handles Unconscious prioity) + [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + }; + }, 0.05, [_unit, (time + 15)]] call CBA_fnc_addPerFrameHandler; if (_unit == ACE_player) then { //only re-enable HUD if not handcuffed From a0c2a00777052312583df4bac9e7c6954bf6d006 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 15 Feb 2015 16:45:13 -0600 Subject: [PATCH 089/166] Cleanup --- addons/captives/functions/fnc_canSurrender.sqf | 2 +- addons/captives/functions/fnc_handleKnockedOut.sqf | 2 +- addons/captives/functions/fnc_surrender.sqf | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/captives/functions/fnc_canSurrender.sqf b/addons/captives/functions/fnc_canSurrender.sqf index 4c16e8ccd0..3ee687cfc1 100644 --- a/addons/captives/functions/fnc_canSurrender.sqf +++ b/addons/captives/functions/fnc_canSurrender.sqf @@ -23,7 +23,7 @@ private "_returnValue"; _returnValue = if (_newSurrenderState) then { !(_unit getVariable [QGVAR(isSurrendering), false]); //Not currently surrendering } else { - (_unit getVariable [QGVAR(isSurrendering), false]); //isSurrendering and on the hands up animation - // && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}; + (_unit getVariable [QGVAR(isSurrendering), false]); //is Surrendering }; _returnValue diff --git a/addons/captives/functions/fnc_handleKnockedOut.sqf b/addons/captives/functions/fnc_handleKnockedOut.sqf index aba01b194f..fadf63e971 100644 --- a/addons/captives/functions/fnc_handleKnockedOut.sqf +++ b/addons/captives/functions/fnc_handleKnockedOut.sqf @@ -1,5 +1,5 @@ /* - * Author: PabstMirror + * Author: commy2, PabstMirror * Handles when a unit gets knocked out. Ends surrendering. * * Arguments: diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index f2103d2c1c..adffc4d2aa 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -50,7 +50,6 @@ if (_state) then { PARAMS_2(_unit,_newAnimation); if (_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") then { ERROR("Surrender animation failed"); - systemChat "You Stop Surrendering"; [_unit, false] call FUNC(surrender); }; }]; From e0d1d08913061204d303135bdc4a7dcf6200eb7a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 15 Feb 2015 18:19:01 -0600 Subject: [PATCH 090/166] Change AnimChange EH --- .../fnc_handleZeusDisplayChanged.sqf | 4 +- .../captives/functions/fnc_setHandcuffed.sqf | 2 +- addons/captives/functions/fnc_surrender.sqf | 51 +++++++++++-------- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf index e328d410fa..2299fa7031 100644 --- a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf +++ b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf @@ -22,10 +22,10 @@ PARAMS_2(_unit,_zeusIsOpen); //set showHUD based on unit status: if (!_zeusIsOpen) then { if ((_unit getVariable [QGVAR(isHandcuffed), false]) || {_unit getVariable [QGVAR(isSurrendering), false]}) then { - TRACE_1("Player Change (showHUD false)",_newUnit); + TRACE_1("Player Change (showHUD false)",_unit); showHUD false; } else { - TRACE_1("Player Change (showHUD true)",_newUnit); + TRACE_1("Player Change (showHUD true)",_unit); showHUD true; }; }; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 06906167e9..0d404f6c6e 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -31,7 +31,7 @@ if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) then { if (_state) then { _unit setVariable [QGVAR(isHandcuffed), true, true]; if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop - [_unit, _false] call FUNC(surrender); + [_unit, false] call FUNC(surrender); }; [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); _unit setVariable [QGVAR(CargoIndex), ((vehicle _unit) getCargoIndex _unit), true]; diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index adffc4d2aa..e1e4c19c11 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: Unit - * 1: State + * 1: True to surrender, false to un-surrender * * Return Value: * Nothing @@ -45,12 +45,16 @@ if (_state) then { }; //Adds an animation changed eh - //Should handle changes in animation + //If we get a change in animation before we've "locked" in the hands up animationState, then stop surrendering _animChangedEHID = _unit addEventHandler ["AnimChanged", { PARAMS_2(_unit,_newAnimation); + if (_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") then { - ERROR("Surrender animation failed"); - [_unit, false] call FUNC(surrender); + if ((animationState _unit != "ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon") && (animationState _unit != "ACE_AmovPercMstpSsurWnonDnon")) then { + ERROR("Surrender animation failed"); + systemChat "Debug: Surrender animation failed"; + [_unit, false] call FUNC(surrender); + }; }; }]; _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; @@ -62,22 +66,7 @@ if (_state) then { _animChangedEHID = _unit getVariable [QGVAR(surrenderAnimEHID), -1]; _unit removeEventHandler ["AnimChanged", _animChangedEHID]; - - //spin up a PFEH, to watching animationState for the next 10 seconds to make sure we don't enter - [{ - PARAMS_2(_args,_pfID); - EXPLODE_2_PVT(_args,_unit,_maxTime); - //If maxtime or they re-surrendered, exit loop - if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]}) exitWith { - [_pfID] call CBA_fnc_removePerFrameHandler; - }; - //Only break animation if they are actualy the "hands up" animation (because we are using switchmove) - if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) exitWith { - [_pfID] call CBA_fnc_removePerFrameHandler; - //Break out of hands up animation loop (doAnimation handles Unconscious prioity) - [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); - }; - }, 0.05, [_unit, (time + 15)]] call CBA_fnc_addPerFrameHandler; + _unit setVariable [QGVAR(surrenderAnimEHID), -1]; if (_unit == ACE_player) then { //only re-enable HUD if not handcuffed @@ -85,4 +74,26 @@ if (_state) then { showHUD true; }; }; + + //if we are in "hands up" animationState, crack it now + if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) then { + [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + } else { + //spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter + //Handles long animation chains + [{ + PARAMS_2(_args,_pfID); + EXPLODE_2_PVT(_args,_unit,_maxTime); + //If maxtime or they re-surrendered, exit loop + if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]}) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + }; + //Only break animation if they are actualy the "hands up" animation (because we are using switchmove) + if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + //Break out of hands up animation loop (doAnimation handles Unconscious prioity) + [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + }; + }, 0.05, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler; + }; }; From da19a89be867d51cffbf000092ffd025cf25e061 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Mon, 16 Feb 2015 15:56:36 +0100 Subject: [PATCH 091/166] Replaced _targetUnit for ObjNull Replaced _targetUnit for objNull. --- addons/missionModules/functions/fnc_moduleAmbianceSound.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/missionModules/functions/fnc_moduleAmbianceSound.sqf b/addons/missionModules/functions/fnc_moduleAmbianceSound.sqf index f35f14b30c..95153be8d1 100644 --- a/addons/missionModules/functions/fnc_moduleAmbianceSound.sqf +++ b/addons/missionModules/functions/fnc_moduleAmbianceSound.sqf @@ -112,7 +112,7 @@ if (_activated && local _logic) then { // If no unit is to close to this position, we will play the sound. if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { - playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), _targetUnit, false, _newPos, _volume, 1, 1000]; + playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), ObjNull, false, _newPos, _volume, 1, 1000]; _args set [8, time]; }; }; From 1f737dc91495f5ef801e6712a4b83dd202847cec Mon Sep 17 00:00:00 2001 From: KoffeinFlummi Date: Mon, 16 Feb 2015 19:08:27 +0100 Subject: [PATCH 092/166] Add editorconfig --- .editorconfig | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..f6f23b8d1b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + From eee4b256cd3f5285640283517b70873ab28bebfa Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 16 Feb 2015 18:03:09 -0600 Subject: [PATCH 093/166] More Changes and add EH --- addons/captives/CfgVehicles.hpp | 6 +- addons/captives/XEH_postInit.sqf | 10 +-- addons/captives/XEH_preInit.sqf | 2 +- .../functions/fnc_handleKnockedOut.sqf | 2 +- .../functions/fnc_handleUnitInitPost.sqf | 2 +- .../functions/fnc_handleVehicleChanged.sqf | 2 +- .../functions/fnc_moduleSurrender.sqf | 11 +++- .../captives/functions/fnc_setHandcuffed.sqf | 34 +++++++--- ...c_surrender.sqf => fnc_setSurrendered.sqf} | 64 ++++++++++--------- 9 files changed, 79 insertions(+), 54 deletions(-) rename addons/captives/functions/{fnc_surrender.sqf => fnc_setSurrendered.sqf} (56%) diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index d292402bcf..75b1a85803 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -81,8 +81,8 @@ class CfgVehicles { }; class ACE_StartSurrenderingSelf { displayName = "$STR_ACE_Captives_StartSurrendering"; - condition = QUOTE([ARR_2(_player, true)] call FUNC(canSurrender)); - statement = QUOTE([ARR_2(_player, true)] call FUNC(surrender)); + condition = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered)); + statement = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered)); exceptions[] = {}; showDisabled = 0; priority = 0; @@ -90,7 +90,7 @@ class CfgVehicles { class ACE_StopSurrenderingSelf { displayName = "$STR_ACE_Captives_StopSurrendering"; condition = QUOTE([ARR_2(_player, false)] call FUNC(canSurrender)); - statement = QUOTE([ARR_2(_player, false)] call FUNC(surrender)); + statement = QUOTE([ARR_2(_player, false)] call FUNC(setSurrender)); exceptions[] = {QGVAR(isNotSurrendering)}; showDisabled = 0; priority = 0; diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index 9c124630ee..da92307815 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -1,9 +1,5 @@ #include "script_component.hpp" -["playerChanged", {_this call FUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler); -["MoveInCaptive", {_this call FUNC(vehicleCaptiveMoveIn)}] call EFUNC(common,addEventHandler); -["MoveOutCaptive", {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); -["SetHandcuffed", {_this call FUNC(setHandcuffed)}] call EFUNC(common,addEventHandler); //Handles when someone starts escorting and then disconnects, leaving the captive attached //This is normaly handled by the PFEH in doEscortCaptive, but that won't be running if they DC @@ -23,6 +19,12 @@ if (isServer) then { ["playerVehicleChanged", {_this call FUNC(handleVehicleChanged)}] call EFUNC(common,addEventHandler); ["zeusDisplayChanged", {_this call FUNC(handleZeusDisplayChanged)}] call EFUNC(common,addEventHandler); +["playerChanged", {_this call FUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler); +["MoveInCaptive", {_this call FUNC(vehicleCaptiveMoveIn)}] call EFUNC(common,addEventHandler); +["MoveOutCaptive", {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); + +["SetHandcuffed", {_this call FUNC(setHandcuffed)}] call EFUNC(common,addEventHandler); +["SetSurrendered", {_this call FUNC(setSurrendered)}] call EFUNC(common,addEventHandler); //TODO: Medical Integration Events??? diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index f6ec44225f..728f5fff69 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -26,7 +26,7 @@ PREP(handleZeusDisplayChanged); PREP(handleWokeUp); PREP(moduleSurrender); PREP(setHandcuffed); -PREP(surrender); +PREP(setSurrendered); PREP(vehicleCaptiveMoveIn); PREP(vehicleCaptiveMoveOut); diff --git a/addons/captives/functions/fnc_handleKnockedOut.sqf b/addons/captives/functions/fnc_handleKnockedOut.sqf index fadf63e971..1cd969807d 100644 --- a/addons/captives/functions/fnc_handleKnockedOut.sqf +++ b/addons/captives/functions/fnc_handleKnockedOut.sqf @@ -21,5 +21,5 @@ PARAMS_1(_unit); if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop - [_unit, _false] call FUNC(surrender); + [_unit, false] call FUNC(setSurrendered); }; diff --git a/addons/captives/functions/fnc_handleUnitInitPost.sqf b/addons/captives/functions/fnc_handleUnitInitPost.sqf index 1a5a8f2ecd..a8b601300a 100644 --- a/addons/captives/functions/fnc_handleUnitInitPost.sqf +++ b/addons/captives/functions/fnc_handleUnitInitPost.sqf @@ -29,6 +29,6 @@ if (local _unit) then { if (_unit getVariable [QGVAR(isSurrendering), false]) then { _unit setVariable [QGVAR(isSurrendering), false]; - [_unit, true] call FUNC(surrender); + [_unit, true] call FUNC(setSurrendered); }; }; diff --git a/addons/captives/functions/fnc_handleVehicleChanged.sqf b/addons/captives/functions/fnc_handleVehicleChanged.sqf index 74f966ecc3..a5cd7004a4 100644 --- a/addons/captives/functions/fnc_handleVehicleChanged.sqf +++ b/addons/captives/functions/fnc_handleVehicleChanged.sqf @@ -25,6 +25,6 @@ if ((vehicle _unit) != _unit) then { }; if (_unit getVariable [QGVAR(isSurrendering), false]) then { - [_unit, false] call FUNC(surrender); + [_unit, false] call FUNC(setSurrender); }; }; diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index 5cbf43aacc..d2e3fc9f5e 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -28,7 +28,14 @@ if (local _logic) then { _mouseOverObject = _bisMouseOver select 1; if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then { systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)]; - [_mouseOverObject, true] call FUNC(surrender); + [_mouseOverObject, true] call FUNC(setSurrendered); + + if (!(_mouseOverObject getVariable [GVAR(), false])) then { + ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent); + } else { + ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent); + }; + } else { systemChat format ["Only use on dismounted inf"]; }; @@ -38,7 +45,7 @@ if (local _logic) then { } else {//an editor module { systemChat format ["Debug - module surrendering %1", (name _x)]; - [_x, true] call FUNC(surrender); + [_x, true] call FUNC(setSurrendered); } forEach _units; }; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 0d404f6c6e..cec1a007e7 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -18,22 +18,23 @@ PARAMS_2(_unit,_state); -// We only want this function to work on local machines -if (!local _unit) exitwith { - [_this, QUOTE(FUNC(setHandcuffed)), _unit] call EFUNC(common,execRemoteFnc); - TRACE_2("running setHandcuffed on remote unit",_unit,_state); -}; -if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) then { - LOG("setHandcuffed: current state same as new"); +if (!local _unit) exitwith { + ERROR("running setHandcuffed on remote unit"); +}; +if ((_unit getVariable [QGVAR(isHandcuffed), false]) isEqualTo _state) exitWith { + ERROR("setHandcuffed: current state same as new"); }; if (_state) then { _unit setVariable [QGVAR(isHandcuffed), true, true]; - if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop - [_unit, false] call FUNC(surrender); - }; [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); + + if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop + [_unit, false] call FUNC(setSurrendered); + }; + + //Set unit cargoIndex (will be -1 if dismounted) _unit setVariable [QGVAR(CargoIndex), ((vehicle _unit) getCargoIndex _unit), true]; if (_unit == ACE_player) then { @@ -46,6 +47,19 @@ if (_state) then { if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then { [_unit] call EFUNC(common,fixLoweredRifleAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); + + //Adds an animation changed eh + //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) + _animChangedEHID = _unit addEventHandler ["AnimChanged", { + PARAMS_2(_unit,_newAnimation); + if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && (_newAnimation != "Unconscious")) then { + ERROR("Handcuff animation interrupted"); + systemChat format ["debug %2: new %1", _newAnimation, time]; + [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); + }; + }]; + _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; + }; }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); } else { diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_setSurrendered.sqf similarity index 56% rename from addons/captives/functions/fnc_surrender.sqf rename to addons/captives/functions/fnc_setSurrendered.sqf index e1e4c19c11..e49c6e9453 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_setSurrendered.sqf @@ -10,7 +10,7 @@ * Nothing * * Example: - * [Pierre, true] call ACE_captives_fnc_surrender; + * [Pierre, true] call ACE_captives_fnc_setSurrendered; * * Public: No */ @@ -18,52 +18,52 @@ PARAMS_2(_unit,_state); -// We only want this function to work on local machines + if (!local _unit) exitwith { - [_this, QUOTE(FUNC(surrender)), _unit] call EFUNC(common,execRemoteFnc); - TRACE_2("running surrender on remote unit",_unit,_state); + ERROR("running surrender on remote unit"); }; -if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) then { - LOG("Surrender: current state same as new"); +if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) exitWith { + ERROR("Surrender: current state same as new"); }; if (_state) then { + if ((vehicle _unit) != _unit) exitWith {ERROR("Cannot surrender while mounted");}; + if (_unit getVariable [QGVAR(isHandcuffed), false]) exitWith {ERROR("Cannot surrender while handcuffed");}; + _unit setVariable [QGVAR(isSurrendering), true, true]; + [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); if (_unit == ACE_player) then { showHUD false; }; + [_unit] call EFUNC(common,fixLoweredRifleAnimation); + [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); + // fix anim on mission start (should work on dedicated servers) [{ PARAMS_1(_unit); - if (_unit getVariable [QGVAR(isSurrendering), false] && {vehicle _unit == _unit}) then { - [_unit] call EFUNC(common,fixLoweredRifleAnimation); - [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); - }; - - //Adds an animation changed eh - //If we get a change in animation before we've "locked" in the hands up animationState, then stop surrendering - _animChangedEHID = _unit addEventHandler ["AnimChanged", { - PARAMS_2(_unit,_newAnimation); - - if (_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") then { - if ((animationState _unit != "ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon") && (animationState _unit != "ACE_AmovPercMstpSsurWnonDnon")) then { - ERROR("Surrender animation failed"); - systemChat "Debug: Surrender animation failed"; - [_unit, false] call FUNC(surrender); + if (_unit getVariable [QGVAR(isSurrendering), false] && {(vehicle _unit) == _unit}) then { + //Adds an animation changed eh + //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) + _animChangedEHID = _unit addEventHandler ["AnimChanged", { + PARAMS_2(_unit,_newAnimation); + if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && (_newAnimation != "Unconscious")) then { + ERROR("Surrender animation interrupted"); + systemChat format ["debug %2: new %1", _newAnimation, time]; + [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); }; - }; - }]; - _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; - + }]; + _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; + }; }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); } else { _unit setVariable [QGVAR(isSurrendering), false, true]; [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); + //remove AnimChanged EH _animChangedEHID = _unit getVariable [QGVAR(surrenderAnimEHID), -1]; _unit removeEventHandler ["AnimChanged", _animChangedEHID]; _unit setVariable [QGVAR(surrenderAnimEHID), -1]; @@ -75,25 +75,27 @@ if (_state) then { }; }; + if (_unit getVariable ["ACE_isUnconscious", false]) exitWith {}; //don't touch animations if unconscious + //if we are in "hands up" animationState, crack it now if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) then { [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); } else { - //spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter + //spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter "hands up" //Handles long animation chains [{ PARAMS_2(_args,_pfID); EXPLODE_2_PVT(_args,_unit,_maxTime); - //If maxtime or they re-surrendered, exit loop - if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]}) exitWith { + //If waited long enough or they re-surrendered or they are unconscious, exit loop + if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]} || {_unit getVariable ["ACE_isUnconscious", false]}) exitWith { [_pfID] call CBA_fnc_removePerFrameHandler; }; - //Only break animation if they are actualy the "hands up" animation (because we are using switchmove) + //Only break animation if they are actualy the "hands up" animation (because we are using switchmove there won't be an transition) if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) exitWith { [_pfID] call CBA_fnc_removePerFrameHandler; - //Break out of hands up animation loop (doAnimation handles Unconscious prioity) + //Break out of hands up animation loop [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); }; - }, 0.05, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler; + }, 0, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler; }; }; From dc82e50d72cafb9744e692f2576ef937d33bd85a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 16 Feb 2015 18:30:35 -0600 Subject: [PATCH 094/166] fix --- addons/captives/CfgVehicles.hpp | 2 +- addons/captives/XEH_postInit.sqf | 1 + addons/captives/XEH_preInit.sqf | 2 +- addons/captives/functions/fnc_moduleSurrender.sqf | 6 +++--- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 75b1a85803..47bd557efc 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -81,7 +81,7 @@ class CfgVehicles { }; class ACE_StartSurrenderingSelf { displayName = "$STR_ACE_Captives_StartSurrendering"; - condition = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered)); + condition = QUOTE([ARR_2(_player, true)] call FUNC(canSurrender)); statement = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered)); exceptions[] = {}; showDisabled = 0; diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index da92307815..ac86d71915 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -3,6 +3,7 @@ //Handles when someone starts escorting and then disconnects, leaving the captive attached //This is normaly handled by the PFEH in doEscortCaptive, but that won't be running if they DC + if (isServer) then { addMissionEventHandler ["HandleDisconnect", { PARAMS_1(_disconnectedPlayer); diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 728f5fff69..d23d8759f8 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -22,8 +22,8 @@ PREP(handleKnockedOut); PREP(handlePlayerChanged); PREP(handleUnitInitPost); PREP(handleVehicleChanged); -PREP(handleZeusDisplayChanged); PREP(handleWokeUp); +PREP(handleZeusDisplayChanged); PREP(moduleSurrender); PREP(setHandcuffed); PREP(setSurrendered); diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index d2e3fc9f5e..a33c56fc09 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -29,13 +29,13 @@ if (local _logic) then { if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then { systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)]; [_mouseOverObject, true] call FUNC(setSurrendered); - - if (!(_mouseOverObject getVariable [GVAR(), false])) then { + + if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then { ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent); } else { ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent); }; - + } else { systemChat format ["Only use on dismounted inf"]; }; From 9cdf06383dc8f5f6dda5b9c846d785eb65dac650 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 16 Feb 2015 19:20:55 -0600 Subject: [PATCH 095/166] Back to getIn --- addons/captives/CfgEventHandlers.hpp | 11 ++++++++--- addons/captives/CfgVehicles.hpp | 2 +- addons/captives/XEH_preInit.sqf | 2 +- ...dleVehicleChanged.sqf => fnc_handleGetIn.sqf} | 16 ++++++++-------- .../captives/functions/fnc_moduleSurrender.sqf | 3 +-- 5 files changed, 19 insertions(+), 15 deletions(-) rename addons/captives/functions/{fnc_handleVehicleChanged.sqf => fnc_handleGetIn.sqf} (55%) diff --git a/addons/captives/CfgEventHandlers.hpp b/addons/captives/CfgEventHandlers.hpp index 8829d0f275..0ce09280a7 100644 --- a/addons/captives/CfgEventHandlers.hpp +++ b/addons/captives/CfgEventHandlers.hpp @@ -9,7 +9,14 @@ class Extended_PostInit_EventHandlers { init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; - +//release escorted captive when entering a vehicle +class Extended_GetIn_EventHandlers { + class All { + class GVAR(AutoDetachCaptive) { + getIn = QUOTE(_this call FUNC(handleGetIn)); + }; + }; +}; //reset captive animation after leaving vehicle class Extended_GetOut_EventHandlers { class All { @@ -18,7 +25,6 @@ class Extended_GetOut_EventHandlers { }; }; }; - //reset captivity and escorting status when getting killed class Extended_Killed_EventHandlers { class CAManBase { @@ -27,7 +33,6 @@ class Extended_Killed_EventHandlers { }; }; }; - //mission start class Extended_InitPost_EventHandlers { class CAManBase { diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 47bd557efc..31b0ac713f 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -90,7 +90,7 @@ class CfgVehicles { class ACE_StopSurrenderingSelf { displayName = "$STR_ACE_Captives_StopSurrendering"; condition = QUOTE([ARR_2(_player, false)] call FUNC(canSurrender)); - statement = QUOTE([ARR_2(_player, false)] call FUNC(setSurrender)); + statement = QUOTE([ARR_2(_player, false)] call FUNC(setSurrendered)); exceptions[] = {QGVAR(isNotSurrendering)}; showDisabled = 0; priority = 0; diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index d23d8759f8..34c9bca910 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -16,12 +16,12 @@ PREP(doFriskPerson); PREP(doLoadCaptive); PREP(doRemoveHandcuffs); PREP(doUnloadCaptive); +PREP(handleGetIn); PREP(handleGetOut); PREP(handleKilled); PREP(handleKnockedOut); PREP(handlePlayerChanged); PREP(handleUnitInitPost); -PREP(handleVehicleChanged); PREP(handleWokeUp); PREP(handleZeusDisplayChanged); PREP(moduleSurrender); diff --git a/addons/captives/functions/fnc_handleVehicleChanged.sqf b/addons/captives/functions/fnc_handleGetIn.sqf similarity index 55% rename from addons/captives/functions/fnc_handleVehicleChanged.sqf rename to addons/captives/functions/fnc_handleGetIn.sqf index a5cd7004a4..cf7d2c7271 100644 --- a/addons/captives/functions/fnc_handleVehicleChanged.sqf +++ b/addons/captives/functions/fnc_handleGetIn.sqf @@ -1,25 +1,25 @@ /* * Author: commy2 - * Handles when a player's vehicle changes (supports scripted vehicle changes) + * Handles when a unit gets in to a vehicle. Release escorted captive when entering a vehicle * * Arguments: - * 0: unit - * 1: newVehicle + * 0: _vehicle + * 2: dunno + * 1: _unit * * Return Value: - * Nothing + * The return value * * Example: - * [player, car] call ACE_captives_fnc_handleVehicleChanged + * [car2, x, player] call ACE_captives_fnc_handleGetIn * * Public: No */ #include "script_component.hpp" -PARAMS_2(_unit,_vehicle); +PARAMS_3(_vehicle,_dontcare,_unit); -//When moved into a vehicle (action or scripted) -if ((vehicle _unit) != _unit) then { +if (local _unit) then { if (_unit getVariable [QGVAR(isEscorting), false]) then { _unit setVariable [QGVAR(isEscorting), false, true]; }; diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index a33c56fc09..9311c7a1b9 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -28,8 +28,7 @@ if (local _logic) then { _mouseOverObject = _bisMouseOver select 1; if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then { systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)]; - [_mouseOverObject, true] call FUNC(setSurrendered); - + if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then { ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent); } else { From d60081a9c311620e61926d8a7e87ac4da3a6e5cf Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 17 Feb 2015 07:49:37 +0100 Subject: [PATCH 096/166] Renamed missionModules to missionmodules. --- addons/missionModules/functions/script_component.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/missionModules/functions/script_component.hpp b/addons/missionModules/functions/script_component.hpp index e49740a89e..42d34d4801 100644 --- a/addons/missionModules/functions/script_component.hpp +++ b/addons/missionModules/functions/script_component.hpp @@ -1 +1 @@ -#include "\z\ace\addons\missionModules\script_component.hpp" \ No newline at end of file +#include "\z\ace\addons\missionmodules\script_component.hpp" \ No newline at end of file From d86e2464b3d35315e5c38b5a3e459a0b016e1ee5 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 17 Feb 2015 07:51:35 +0100 Subject: [PATCH 097/166] Removed missionModules --- addons/missionModules/$PBOPREFIX$ | 1 - addons/missionModules/CfgEventHandlers.hpp | 6 - addons/missionModules/CfgFactionClasses.hpp | 6 - addons/missionModules/CfgVehicles.hpp | 68 ---------- addons/missionModules/XEH_preInit.sqf | 7 - addons/missionModules/config.cpp | 17 --- addons/missionModules/data/moduleSound.paa | Bin 5625 -> 0 bytes .../functions/fnc_moduleAmbianceSound.sqf | 123 ------------------ .../functions/script_component.hpp | 1 - addons/missionModules/script_component.hpp | 12 -- 10 files changed, 241 deletions(-) delete mode 100644 addons/missionModules/$PBOPREFIX$ delete mode 100644 addons/missionModules/CfgEventHandlers.hpp delete mode 100644 addons/missionModules/CfgFactionClasses.hpp delete mode 100644 addons/missionModules/CfgVehicles.hpp delete mode 100644 addons/missionModules/XEH_preInit.sqf delete mode 100644 addons/missionModules/config.cpp delete mode 100644 addons/missionModules/data/moduleSound.paa delete mode 100644 addons/missionModules/functions/fnc_moduleAmbianceSound.sqf delete mode 100644 addons/missionModules/functions/script_component.hpp delete mode 100644 addons/missionModules/script_component.hpp diff --git a/addons/missionModules/$PBOPREFIX$ b/addons/missionModules/$PBOPREFIX$ deleted file mode 100644 index ea1be0daee..0000000000 --- a/addons/missionModules/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\missionModules \ No newline at end of file diff --git a/addons/missionModules/CfgEventHandlers.hpp b/addons/missionModules/CfgEventHandlers.hpp deleted file mode 100644 index f0a9f14d91..0000000000 --- a/addons/missionModules/CfgEventHandlers.hpp +++ /dev/null @@ -1,6 +0,0 @@ - -class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_preInit)); - }; -}; diff --git a/addons/missionModules/CfgFactionClasses.hpp b/addons/missionModules/CfgFactionClasses.hpp deleted file mode 100644 index 792f4d31e3..0000000000 --- a/addons/missionModules/CfgFactionClasses.hpp +++ /dev/null @@ -1,6 +0,0 @@ -class CfgFactionClasses { - class NO_CATEGORY; - class ACE_missionModules: NO_CATEGORY { - displayName = "ACE Mission Modules"; - }; -}; \ No newline at end of file diff --git a/addons/missionModules/CfgVehicles.hpp b/addons/missionModules/CfgVehicles.hpp deleted file mode 100644 index afdb58006b..0000000000 --- a/addons/missionModules/CfgVehicles.hpp +++ /dev/null @@ -1,68 +0,0 @@ -class CfgVehicles { - class Logic; - class Module_F: Logic { - class ArgumentsBaseUnits { - }; - }; - - // TODO make a curator variant for this - class ACE_moduleAmbianceSound: Module_F { - scope = 2; - displayName = "Ambiance Sounds [ACE]"; - icon = QUOTE(PATHTOF(data\moduleSound.paa)); - category = "ACE_missionModules"; - function = QUOTE(FUNC(moduleAmbianceSound); - functionPriority = 1; - isGlobal = 1; - isTriggerActivated = 0; - author = "Glowbal"; - class Arguments { - class soundFiles { - displayName = "Sounds"; - description = "Classnames of the ambiance sounds played. Seperated by ','. "; - typeName = "STRING"; - defaultValue = ""; - }; - class minimalDistance { - displayName = "Minimal Distance"; - description = "Minimal Distance"; - typeName = "NUMBER"; - defaultValue = 400; - }; - class maximalDistance { - displayName = "Maximal Distance"; - description = "Maximal Distance"; - typeName = "NUMBER"; - defaultValue = 900; - }; - class minimalDelay { - displayName = "Minimal Delay"; - description = "Minimal Delay between sounds played"; - typeName = "NUMBER"; - defaultValue = 10; - }; - class maximalDelay { - displayName = "Maximal Delay"; - description = "Maximal Delay between sounds played"; - typeName = "NUMBER"; - defaultValue = 170; - }; - class followPlayers { - displayName = "Follow Players"; - description = "Follow players. If set to false, loop will play sounds only nearby logic position."; - typeName = "BOOL"; - defaultValue = 0; - }; - class soundVolume { - displayName = "Volume"; - description = "The volume of the sounds played"; - typeName = "NUMBER"; - defaultValue = 0; - }; - }; - class ModuleDescription { - description = "Ambiance sounds loop (synced across MP)"; - sync[] = {}; - }; - }; -}; diff --git a/addons/missionModules/XEH_preInit.sqf b/addons/missionModules/XEH_preInit.sqf deleted file mode 100644 index cadbbabdd1..0000000000 --- a/addons/missionModules/XEH_preInit.sqf +++ /dev/null @@ -1,7 +0,0 @@ -#include "script_component.hpp" - -ADDON = false; - -PREP(moduleAmbianceSound); - -ADDON = true; diff --git a/addons/missionModules/config.cpp b/addons/missionModules/config.cpp deleted file mode 100644 index 0867b486c6..0000000000 --- a/addons/missionModules/config.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - units[] = {"cse_moduleAmbianceSound"}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common"}; - author[] = {"Glowbal"}; - authorUrl = ""; - VERSION_CONFIG; - }; -}; - -#include "CfgEventHandlers.hpp" -#include "CfgFactionClasses.hpp" -#include "CfgVehicles.hpp" diff --git a/addons/missionModules/data/moduleSound.paa b/addons/missionModules/data/moduleSound.paa deleted file mode 100644 index bfe3b8032717dcc98269b4b42a620cffe550ffc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5625 zcmd5=e{2)i9e)QtpfrHPa-m>_7$qGojBP2JHAXidD=lKvOSnciRHiZp3io($CfVu3Ih4Y{*BB>0gjI}tEY4lCyKj^3 zi|MspB)_I9Qgx5++xQ+GAF#}rEAi6)SgR2uT;uV0M$+GvaQ(#H9}xS?WmyKjWzk^2 zNzcQW;MZidnf$!>++Lhj?%eeIpGtziBC+buc2ZUhGN$7o{p|Y_&10xliB==phYGcr8`S2cb3wu zSJO0FbEhH0o>*@a^2330*Os!%?HPIs=*>Ht3JmIghu|*BN=Fax<2*v*2zg37n~I_l zvuOp1~efUHq1t$YIb<=rbwS zTrcQpUhjzXYHsxVyH5nfdE>YxM~e3~1{1=bAg7M@d>{Fz$PcEznj%j-Sr-`;E@UQk zQ%W=8le|+&`CYHlo@`?-%h+-aPK=XB!7Q0@uvl zk~H~J)3;+sOn<@gdX~1F2=F@pO`4Y=pKA{{ih0US7~4l2ZHeSrF3!i~kXHre!}Y@c zP~XdDtCPF%p;?fZ%~k(hpV7__KYu$I&W)uH29ukQ!Cc^o8gi!2->3UUe9E%THmf0Q zTsUN8<7HeGl+Vt~a$AbuYUH0o|BNJeHbGk-Z{+Ere3Dmnv_1+KqTMjB=U(a$b{;-6 zzc4iZ3Di4N{_5i{f3GXhO~_`GW%kmP#F*J;J)-sFmSP?uO!IU;(7&&hr;0QC@2ovz z3-%y>l5ihkZ6=ksK>1eVIAM@i^LD}cUF(EDfV@(07E3F~Wc@c6Pf23lh`?V>iWc4M z`dp0j&)*$#tfK$P|G#y0L*l&qaS?wMfyF&b{MX`O{fI8!$wXwry{egRWm$pFp z{y>`MA)mBh5Aqkkb=l&hj--Fhjd&oPi5~=z^p(|AlqMfu%Gp?i68y-kT`Dz1+<3b z<$c9;CtdTx;i6ck|MGfA>_>9#Q+h5Q7_jV*@=E>2Esi71(4W)NRDZ#3xHI;cHA?@; z<(G?d&v#ynUfUZd{#1V?*3m-&#@%$Iy`|^e#>Hkc9?+hA!G5{)M~i2jYll6|dd$$D zR)0X8Be1{8Upe@-w3`5=Q9-=?2KtXFp9)OTGQSFkA2Lj=c}(p3w}oZ4G=ctW9oi4< zr*2R=xTFyP!>q?9KaP56@|$%on7G*D6aK=`UyoLwyIp@@cmGg)E1Kr+;jL-cv!*;u z)@FA=&{SZHDJ_#uoFU1F>~(_jCm+&BtmntyvDT}g$DiA1>Bl@;UiY3!nfQUa_gvq* zwb%dKekXIHkY=R<$fjcYGlSh9iZ&KyjMBcs8aBK9SId5$Z9^J1hwG!^7Z8h7Chc~y zzRAF|A*~;Z!VEp4O~Z+c&YynMaN;8TU{bH0yK>v3G(%zjHqY*)0JwO9CW)BVG zJ*YDB^0;y9tW`GfULspIGVAAGN0_?S3436ZaxYoN8IUw|Rqu_G7u7KTl-MPM?0gOc`ug7=QW2VESaxEQ|DzF~Gcf`Ss=k z!5@80$+70ue>^-^&<8!+w(EE;@MgU@FXFFWrn38tNE@g!N=@f3^qiN9Y5(x27AJTU z=ZAa#5twV0X_O^x28Z$A&pS=)$^KtzKk;MPDzj+fwB>Q#-`x>urFlHnvF~!UO>diN z1yv&Jpc(olz3l-5or{nk44&+4GA;!F4$kl&=$B9LESij$36p&hUd;VmNUJ6YMgF6JLbOVk`ZbHcCR84R!G;@r-_u zAOuge55r}#NM0sQs>9M`hMq}%DBkSUY)Wi(n$)N*vDA>Kx9MZQ8d)rk1;xlSy{&nF z{&N3bnupD7Ptbb2a4^?R|X+6c1 zGkO0 - * 1: Units - * 2: Activated - * - * Return Value: - * Nothing - * - * Example: - * N/A - * - * Public: No - */ - -#include "script_component.hpp" - -private ["_logic", "_units", "_activated","_ambianceSounds", "_soundFiles", "_minimalDistance","_maximalDistance", "_minimalDistance", "_maxDelayBetweenSounds", "_allUnits", "_newPos", "_targetUnit", "_soundToPlay", "_soundPath", "_unparsedSounds", "_list", "_splittedList", "_nilCheckPassedList"]; -_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; -_units = [_this,1,[],[[]]] call BIS_fnc_param; -_activated = [_this,2,true,[true]] call BIS_fnc_param; - -// We only play this on the locality of the logic, since the sounds are broadcasted across the network -if (_activated && local _logic) then { - _ambianceSounds = []; - _unparsedSounds = _logic getvariable ["soundFiles", ""]; - _minimalDistance = (_logic getvariable ["minimalDistance", 400]) max 1; - _maximalDistance = (_logic getvariable ["maximalDistance", 10]) max _minimalDistance; - _minDelayBetweensounds = (_logic getvariable ["minimalDelay", 10]) max 1; - _maxDelayBetweenSounds = (_logic getvariable ["maximalDelay", 170]) max _minDelayBetweensounds; - _volume = (_logic getvariable ["soundVolume", 30]) max 1; - _followPlayers = _logic getvariable ["followPlayers", false]; - - _splittedList = [_unparsedSounds, ","] call BIS_fnc_splitString; - - _nilCheckPassedList = ""; - { - _x = [_x] call EFUNC(common,removeWhiteSpace); - _splittedList set [_foreachIndex, _x]; - }foreach _splittedList; - - _soundPath = [(str missionConfigFile), 0, -15] call BIS_fnc_trimString; - { - if (isclass (missionConfigFile >> "CfgSounds" >> _x)) then { - _ambianceSounds pushback (_soundPath + (getArray(missionConfigFile >> "CfgSounds" >> _x >> "sound") select 0)); - } else { - if (isclass (configFile >> "CfgSounds" >> _x)) then { - _ambianceSounds pushback ((getArray(configFile >> "CfgSounds" >> _x >> "sound") select 0)); - }; - }; - }foreach _splittedList; - - if (count _ambianceSounds == 0) exitwith {}; - { - if !([".", _x, true] call BIS_fnc_inString) then { - _ambianceSounds set [_foreachIndex, _x + ".wss"]; - }; - }foreach _ambianceSounds; - - [{ - private ["_args", "_logic", "_ambianceSounds", "_minimalDistance", "_maximalDistance", "_minDelayBetweensounds", "_maxDelayBetweenSounds", "_volume", "_followPlayers","_lastTimePlayed", "_newPos"] - _args = _this select 0; - _logic = _args select 0; - _lastTimePlayed = _args select 8; - - if (!alive _logic) exitwith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - if (_lastTimePlayed - time >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { - _ambianceSounds = _args select 1; - _minimalDistance = _args select 2; - _maximalDistance = _args select 3; - _minDelayBetweensounds = _args select 4; - _maxDelayBetweenSounds = _args select 5; - _volume = _args select 6; - _followPlayers = _args select 7; - - // Find all players in session. - _allUnits = if (isMultiplayer) then {playableUnits} else {[ACE_player]}; - - // Check if there are enough players to even start playing this sound. - if (count _allUnits > 0) then { - - // Select a target unit at random. - _targetUnit = _allUnits select (round(random((count _allUnits)-1))); - - // find the position from which we are going to play this sound from. - _newPos = (getPos _targetUnit); - if (!_followPlayers) then { - _newPos = getPos _logic; - }; - - // Randomize this position. - if (random(1) >= 0.5) then { - if (random(1) >= 0.5) then { - _newPos set [0, (_newPos select 0) + (_minimalDistance + random(_maximalDistance))]; - } else { - _newPos set [0, (_newPos select 0) - (_minimalDistance + random(_maximalDistance))]; - }; - } else { - if (random(1) >= 0.5) then { - _newPos set [1, (_newPos select 1) + (_minimalDistance + random(_maximalDistance))]; - } else { - _newPos set [1, (_newPos select 1) - (_minimalDistance + random(_maximalDistance))]; - }; - }; - - // If no unit is to close to this position, we will play the sound. - if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { - - playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), ObjNull, false, _newPos, _volume, 1, 1000]; - _args set [8, time]; - }; - }; - }; - }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, time] ] call CBA_fnc_addPerFrameHandler; -}; - -true; diff --git a/addons/missionModules/functions/script_component.hpp b/addons/missionModules/functions/script_component.hpp deleted file mode 100644 index 42d34d4801..0000000000 --- a/addons/missionModules/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\missionmodules\script_component.hpp" \ No newline at end of file diff --git a/addons/missionModules/script_component.hpp b/addons/missionModules/script_component.hpp deleted file mode 100644 index a567966c7b..0000000000 --- a/addons/missionModules/script_component.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#define COMPONENT missionModules -#include "\z\ace\addons\main\script_mod.hpp" - -#ifdef DEBUG_ENABLED_MISSIONMODULES - #define DEBUG_MODE_FULL -#endif - -#ifdef DEBUG_SETTINGS_MISSIONMODULES - #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSIONMODULES -#endif - -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file From bfc748fbbef1d9745c0a0d0cb35133a17b9b9c6f Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 17 Feb 2015 07:51:51 +0100 Subject: [PATCH 098/166] Added missionmodules. --- addons/missionmodules/$PBOPREFIX$ | 1 + addons/missionmodules/CfgEventHandlers.hpp | 6 + addons/missionmodules/CfgFactionClasses.hpp | 6 + addons/missionmodules/CfgVehicles.hpp | 68 ++++++++++ addons/missionmodules/XEH_preInit.sqf | 7 + addons/missionmodules/config.cpp | 17 +++ addons/missionmodules/data/moduleSound.paa | Bin 0 -> 5625 bytes .../functions/fnc_moduleAmbianceSound.sqf | 123 ++++++++++++++++++ .../functions/script_component.hpp | 1 + addons/missionmodules/script_component.hpp | 12 ++ 10 files changed, 241 insertions(+) create mode 100644 addons/missionmodules/$PBOPREFIX$ create mode 100644 addons/missionmodules/CfgEventHandlers.hpp create mode 100644 addons/missionmodules/CfgFactionClasses.hpp create mode 100644 addons/missionmodules/CfgVehicles.hpp create mode 100644 addons/missionmodules/XEH_preInit.sqf create mode 100644 addons/missionmodules/config.cpp create mode 100644 addons/missionmodules/data/moduleSound.paa create mode 100644 addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf create mode 100644 addons/missionmodules/functions/script_component.hpp create mode 100644 addons/missionmodules/script_component.hpp diff --git a/addons/missionmodules/$PBOPREFIX$ b/addons/missionmodules/$PBOPREFIX$ new file mode 100644 index 0000000000..ea1be0daee --- /dev/null +++ b/addons/missionmodules/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\missionModules \ No newline at end of file diff --git a/addons/missionmodules/CfgEventHandlers.hpp b/addons/missionmodules/CfgEventHandlers.hpp new file mode 100644 index 0000000000..f0a9f14d91 --- /dev/null +++ b/addons/missionmodules/CfgEventHandlers.hpp @@ -0,0 +1,6 @@ + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; diff --git a/addons/missionmodules/CfgFactionClasses.hpp b/addons/missionmodules/CfgFactionClasses.hpp new file mode 100644 index 0000000000..792f4d31e3 --- /dev/null +++ b/addons/missionmodules/CfgFactionClasses.hpp @@ -0,0 +1,6 @@ +class CfgFactionClasses { + class NO_CATEGORY; + class ACE_missionModules: NO_CATEGORY { + displayName = "ACE Mission Modules"; + }; +}; \ No newline at end of file diff --git a/addons/missionmodules/CfgVehicles.hpp b/addons/missionmodules/CfgVehicles.hpp new file mode 100644 index 0000000000..afdb58006b --- /dev/null +++ b/addons/missionmodules/CfgVehicles.hpp @@ -0,0 +1,68 @@ +class CfgVehicles { + class Logic; + class Module_F: Logic { + class ArgumentsBaseUnits { + }; + }; + + // TODO make a curator variant for this + class ACE_moduleAmbianceSound: Module_F { + scope = 2; + displayName = "Ambiance Sounds [ACE]"; + icon = QUOTE(PATHTOF(data\moduleSound.paa)); + category = "ACE_missionModules"; + function = QUOTE(FUNC(moduleAmbianceSound); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + author = "Glowbal"; + class Arguments { + class soundFiles { + displayName = "Sounds"; + description = "Classnames of the ambiance sounds played. Seperated by ','. "; + typeName = "STRING"; + defaultValue = ""; + }; + class minimalDistance { + displayName = "Minimal Distance"; + description = "Minimal Distance"; + typeName = "NUMBER"; + defaultValue = 400; + }; + class maximalDistance { + displayName = "Maximal Distance"; + description = "Maximal Distance"; + typeName = "NUMBER"; + defaultValue = 900; + }; + class minimalDelay { + displayName = "Minimal Delay"; + description = "Minimal Delay between sounds played"; + typeName = "NUMBER"; + defaultValue = 10; + }; + class maximalDelay { + displayName = "Maximal Delay"; + description = "Maximal Delay between sounds played"; + typeName = "NUMBER"; + defaultValue = 170; + }; + class followPlayers { + displayName = "Follow Players"; + description = "Follow players. If set to false, loop will play sounds only nearby logic position."; + typeName = "BOOL"; + defaultValue = 0; + }; + class soundVolume { + displayName = "Volume"; + description = "The volume of the sounds played"; + typeName = "NUMBER"; + defaultValue = 0; + }; + }; + class ModuleDescription { + description = "Ambiance sounds loop (synced across MP)"; + sync[] = {}; + }; + }; +}; diff --git a/addons/missionmodules/XEH_preInit.sqf b/addons/missionmodules/XEH_preInit.sqf new file mode 100644 index 0000000000..cadbbabdd1 --- /dev/null +++ b/addons/missionmodules/XEH_preInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(moduleAmbianceSound); + +ADDON = true; diff --git a/addons/missionmodules/config.cpp b/addons/missionmodules/config.cpp new file mode 100644 index 0000000000..0867b486c6 --- /dev/null +++ b/addons/missionmodules/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"cse_moduleAmbianceSound"}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"Glowbal"}; + authorUrl = ""; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgFactionClasses.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/missionmodules/data/moduleSound.paa b/addons/missionmodules/data/moduleSound.paa new file mode 100644 index 0000000000000000000000000000000000000000..bfe3b8032717dcc98269b4b42a620cffe550ffc2 GIT binary patch literal 5625 zcmd5=e{2)i9e)QtpfrHPa-m>_7$qGojBP2JHAXidD=lKvOSnciRHiZp3io($CfVu3Ih4Y{*BB>0gjI}tEY4lCyKj^3 zi|MspB)_I9Qgx5++xQ+GAF#}rEAi6)SgR2uT;uV0M$+GvaQ(#H9}xS?WmyKjWzk^2 zNzcQW;MZidnf$!>++Lhj?%eeIpGtziBC+buc2ZUhGN$7o{p|Y_&10xliB==phYGcr8`S2cb3wu zSJO0FbEhH0o>*@a^2330*Os!%?HPIs=*>Ht3JmIghu|*BN=Fax<2*v*2zg37n~I_l zvuOp1~efUHq1t$YIb<=rbwS zTrcQpUhjzXYHsxVyH5nfdE>YxM~e3~1{1=bAg7M@d>{Fz$PcEznj%j-Sr-`;E@UQk zQ%W=8le|+&`CYHlo@`?-%h+-aPK=XB!7Q0@uvl zk~H~J)3;+sOn<@gdX~1F2=F@pO`4Y=pKA{{ih0US7~4l2ZHeSrF3!i~kXHre!}Y@c zP~XdDtCPF%p;?fZ%~k(hpV7__KYu$I&W)uH29ukQ!Cc^o8gi!2->3UUe9E%THmf0Q zTsUN8<7HeGl+Vt~a$AbuYUH0o|BNJeHbGk-Z{+Ere3Dmnv_1+KqTMjB=U(a$b{;-6 zzc4iZ3Di4N{_5i{f3GXhO~_`GW%kmP#F*J;J)-sFmSP?uO!IU;(7&&hr;0QC@2ovz z3-%y>l5ihkZ6=ksK>1eVIAM@i^LD}cUF(EDfV@(07E3F~Wc@c6Pf23lh`?V>iWc4M z`dp0j&)*$#tfK$P|G#y0L*l&qaS?wMfyF&b{MX`O{fI8!$wXwry{egRWm$pFp z{y>`MA)mBh5Aqkkb=l&hj--Fhjd&oPi5~=z^p(|AlqMfu%Gp?i68y-kT`Dz1+<3b z<$c9;CtdTx;i6ck|MGfA>_>9#Q+h5Q7_jV*@=E>2Esi71(4W)NRDZ#3xHI;cHA?@; z<(G?d&v#ynUfUZd{#1V?*3m-&#@%$Iy`|^e#>Hkc9?+hA!G5{)M~i2jYll6|dd$$D zR)0X8Be1{8Upe@-w3`5=Q9-=?2KtXFp9)OTGQSFkA2Lj=c}(p3w}oZ4G=ctW9oi4< zr*2R=xTFyP!>q?9KaP56@|$%on7G*D6aK=`UyoLwyIp@@cmGg)E1Kr+;jL-cv!*;u z)@FA=&{SZHDJ_#uoFU1F>~(_jCm+&BtmntyvDT}g$DiA1>Bl@;UiY3!nfQUa_gvq* zwb%dKekXIHkY=R<$fjcYGlSh9iZ&KyjMBcs8aBK9SId5$Z9^J1hwG!^7Z8h7Chc~y zzRAF|A*~;Z!VEp4O~Z+c&YynMaN;8TU{bH0yK>v3G(%zjHqY*)0JwO9CW)BVG zJ*YDB^0;y9tW`GfULspIGVAAGN0_?S3436ZaxYoN8IUw|Rqu_G7u7KTl-MPM?0gOc`ug7=QW2VESaxEQ|DzF~Gcf`Ss=k z!5@80$+70ue>^-^&<8!+w(EE;@MgU@FXFFWrn38tNE@g!N=@f3^qiN9Y5(x27AJTU z=ZAa#5twV0X_O^x28Z$A&pS=)$^KtzKk;MPDzj+fwB>Q#-`x>urFlHnvF~!UO>diN z1yv&Jpc(olz3l-5or{nk44&+4GA;!F4$kl&=$B9LESij$36p&hUd;VmNUJ6YMgF6JLbOVk`ZbHcCR84R!G;@r-_u zAOuge55r}#NM0sQs>9M`hMq}%DBkSUY)Wi(n$)N*vDA>Kx9MZQ8d)rk1;xlSy{&nF z{&N3bnupD7Ptbb2a4^?R|X+6c1 zGkO0 + * 1: Units + * 2: Activated + * + * Return Value: + * Nothing + * + * Example: + * N/A + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_logic", "_units", "_activated","_ambianceSounds", "_soundFiles", "_minimalDistance","_maximalDistance", "_minimalDistance", "_maxDelayBetweenSounds", "_allUnits", "_newPos", "_targetUnit", "_soundToPlay", "_soundPath", "_unparsedSounds", "_list", "_splittedList", "_nilCheckPassedList"]; +_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; +_units = [_this,1,[],[[]]] call BIS_fnc_param; +_activated = [_this,2,true,[true]] call BIS_fnc_param; + +// We only play this on the locality of the logic, since the sounds are broadcasted across the network +if (_activated && local _logic) then { + _ambianceSounds = []; + _unparsedSounds = _logic getvariable ["soundFiles", ""]; + _minimalDistance = (_logic getvariable ["minimalDistance", 400]) max 1; + _maximalDistance = (_logic getvariable ["maximalDistance", 10]) max _minimalDistance; + _minDelayBetweensounds = (_logic getvariable ["minimalDelay", 10]) max 1; + _maxDelayBetweenSounds = (_logic getvariable ["maximalDelay", 170]) max _minDelayBetweensounds; + _volume = (_logic getvariable ["soundVolume", 30]) max 1; + _followPlayers = _logic getvariable ["followPlayers", false]; + + _splittedList = [_unparsedSounds, ","] call BIS_fnc_splitString; + + _nilCheckPassedList = ""; + { + _x = [_x] call EFUNC(common,removeWhiteSpace); + _splittedList set [_foreachIndex, _x]; + }foreach _splittedList; + + _soundPath = [(str missionConfigFile), 0, -15] call BIS_fnc_trimString; + { + if (isclass (missionConfigFile >> "CfgSounds" >> _x)) then { + _ambianceSounds pushback (_soundPath + (getArray(missionConfigFile >> "CfgSounds" >> _x >> "sound") select 0)); + } else { + if (isclass (configFile >> "CfgSounds" >> _x)) then { + _ambianceSounds pushback ((getArray(configFile >> "CfgSounds" >> _x >> "sound") select 0)); + }; + }; + }foreach _splittedList; + + if (count _ambianceSounds == 0) exitwith {}; + { + if !([".", _x, true] call BIS_fnc_inString) then { + _ambianceSounds set [_foreachIndex, _x + ".wss"]; + }; + }foreach _ambianceSounds; + + [{ + private ["_args", "_logic", "_ambianceSounds", "_minimalDistance", "_maximalDistance", "_minDelayBetweensounds", "_maxDelayBetweenSounds", "_volume", "_followPlayers","_lastTimePlayed", "_newPos"] + _args = _this select 0; + _logic = _args select 0; + _lastTimePlayed = _args select 8; + + if (!alive _logic) exitwith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + + if (_lastTimePlayed - time >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { + _ambianceSounds = _args select 1; + _minimalDistance = _args select 2; + _maximalDistance = _args select 3; + _minDelayBetweensounds = _args select 4; + _maxDelayBetweenSounds = _args select 5; + _volume = _args select 6; + _followPlayers = _args select 7; + + // Find all players in session. + _allUnits = if (isMultiplayer) then {playableUnits} else {[ACE_player]}; + + // Check if there are enough players to even start playing this sound. + if (count _allUnits > 0) then { + + // Select a target unit at random. + _targetUnit = _allUnits select (round(random((count _allUnits)-1))); + + // find the position from which we are going to play this sound from. + _newPos = (getPos _targetUnit); + if (!_followPlayers) then { + _newPos = getPos _logic; + }; + + // Randomize this position. + if (random(1) >= 0.5) then { + if (random(1) >= 0.5) then { + _newPos set [0, (_newPos select 0) + (_minimalDistance + random(_maximalDistance))]; + } else { + _newPos set [0, (_newPos select 0) - (_minimalDistance + random(_maximalDistance))]; + }; + } else { + if (random(1) >= 0.5) then { + _newPos set [1, (_newPos select 1) + (_minimalDistance + random(_maximalDistance))]; + } else { + _newPos set [1, (_newPos select 1) - (_minimalDistance + random(_maximalDistance))]; + }; + }; + + // If no unit is to close to this position, we will play the sound. + if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { + + playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), ObjNull, false, _newPos, _volume, 1, 1000]; + _args set [8, time]; + }; + }; + }; + }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, time] ] call CBA_fnc_addPerFrameHandler; +}; + +true; diff --git a/addons/missionmodules/functions/script_component.hpp b/addons/missionmodules/functions/script_component.hpp new file mode 100644 index 0000000000..42d34d4801 --- /dev/null +++ b/addons/missionmodules/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\missionmodules\script_component.hpp" \ No newline at end of file diff --git a/addons/missionmodules/script_component.hpp b/addons/missionmodules/script_component.hpp new file mode 100644 index 0000000000..a567966c7b --- /dev/null +++ b/addons/missionmodules/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT missionModules +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_MISSIONMODULES + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MISSIONMODULES + #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSIONMODULES +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file From 37216d51449665287dde4e9c3bdb702895887f2b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 17 Feb 2015 17:05:07 -0600 Subject: [PATCH 099/166] Remove HandCuff animEH --- addons/captives/functions/fnc_setHandcuffed.sqf | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index cec1a007e7..0deb68dc8b 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -58,13 +58,19 @@ if (_state) then { [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); }; }]; - _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; + _unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID]; }; }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); } else { _unit setVariable [QGVAR(isHandcuffed), false, true]; [_unit, QGVAR(Handcuffed), false] call EFUNC(common,setCaptivityStatus); + + //remove AnimChanged EH + _animChangedEHID = _unit getVariable [QGVAR(handcuffAnimEHID), -1]; + _unit removeEventHandler ["AnimChanged", _animChangedEHID]; + _unit setVariable [QGVAR(handcuffAnimEHID), -1]; + if ((vehicle _unit) == _unit) then { //Break out of hands up animation loop (doAnimation handles Unconscious prioity) [_unit, "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); From c3b5430bc4b15a7cf92738cc00845a2732abf01b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 17 Feb 2015 22:05:52 -0600 Subject: [PATCH 100/166] NVG KeyBinds --- addons/nightvision/XEH_postInitClient.sqf | 37 +++++++++++++++++++ addons/nightvision/config.cpp | 43 +++++------------------ 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/addons/nightvision/XEH_postInitClient.sqf b/addons/nightvision/XEH_postInitClient.sqf index b81bedc07b..7513b1df16 100644 --- a/addons/nightvision/XEH_postInitClient.sqf +++ b/addons/nightvision/XEH_postInitClient.sqf @@ -35,3 +35,40 @@ GVAR(ppEffectMuzzleFlash) ppEffectCommit 0; ["cameraViewChanged", {_this call FUNC(updatePPEffects)}] call EFUNC(common,addEventHandler); ["playerVehicleChanged", {_this call FUNC(updatePPEffects)}] call EFUNC(common,addEventHandler); ["playerTurretChanged", {_this call FUNC(updatePPEffects)}] call EFUNC(common,addEventHandler); + +// Add keybinds +["ACE3", +localize "STR_ACE_NightVision_IncreaseNVGBrightness", +{ + // Conditions: canInteract + _exceptions = [QEGVAR(captives,isNotEscorting)]; + if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; + // Conditions: specific + if ((currentVisionMode _player != 1)) exitWith {false}; + + // Statement + [ACE_player, 1] call FUNC(changeNVGBrightness); + true +}, +[201, [false, false, true]], //PageUp + ALT +false, +"keydown" +] call cba_fnc_registerKeybind; + +["ACE3", +localize "STR_ACE_NightVision_DecreaseNVGBrightness", +{ + // Conditions: canInteract + _exceptions = [QEGVAR(captives,isNotEscorting)]; + if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; + // Conditions: specific + if ((currentVisionMode _player != 1)) exitWith {false}; + + // Statement + [ACE_player, -1] call FUNC(changeNVGBrightness); + true +}, +[209, [false, false, true]], //PageDown + ALT +false, +"keydown" +] call cba_fnc_registerKeybind; diff --git a/addons/nightvision/config.cpp b/addons/nightvision/config.cpp index 32c563bfb6..4e6aa2e39a 100644 --- a/addons/nightvision/config.cpp +++ b/addons/nightvision/config.cpp @@ -1,42 +1,17 @@ #include "script_component.hpp" class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {"ACE_NVG_Gen1", "ACE_NVG_Gen2", /*"ACE_NVG_Gen3",*/ "ACE_NVG_Gen4", "ACE_NVG_Wide"}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common"}; - author[] = {"commy2", "KoffeinFlummi", "PabstMirror"}; - authorUrl = "https://github.com/commy2/"; - VERSION_CONFIG; - }; + class ADDON { + units[] = {}; + weapons[] = {"ACE_NVG_Gen1", "ACE_NVG_Gen2", /*"ACE_NVG_Gen3",*/ "ACE_NVG_Gen4", "ACE_NVG_Wide"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"commy2", "KoffeinFlummi", "PabstMirror"}; + authorUrl = "https://github.com/commy2/"; + VERSION_CONFIG; + }; }; #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" - - -// class EGVAR(common,Default_Keys) { //??? -class ACE_common_Default_Keys { - class increaseNVGBrightness { - displayName = "$STR_ACE_NightVision_IncreaseNVGBrightness"; - condition = QUOTE( currentVisionMode _player == 1 ); - statement = QUOTE( [_player, _vehicle] call FUNC(increaseNVGBrightness) ); - key = 201; - shift = 0; - control = 0; - alt = 1; - allowHolding = 1; - }; - class decreaseNVGBrightness { - displayName = "$STR_ACE_NightVision_DecreaseNVGBrightness"; - condition = QUOTE( currentVisionMode _player == 1 ); - statement = QUOTE( [_player, _vehicle] call FUNC(decreaseNVGBrightness) ); - key = 209; - shift = 0; - control = 0; - alt = 1; - allowHolding = 1; - }; -}; From c291f297029ae4dda6d2f516aba3f8248371f806 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 17 Feb 2015 22:06:37 -0600 Subject: [PATCH 101/166] Move model to folder --- addons/nightvision/CfgWeapons.hpp | 94 +++++++++--------- .../{ => models}/ace_nvg_wide_optics.p3d | Bin 2 files changed, 47 insertions(+), 47 deletions(-) rename addons/nightvision/{ => models}/ace_nvg_wide_optics.p3d (100%) diff --git a/addons/nightvision/CfgWeapons.hpp b/addons/nightvision/CfgWeapons.hpp index 99cc55db20..c40885c2c4 100644 --- a/addons/nightvision/CfgWeapons.hpp +++ b/addons/nightvision/CfgWeapons.hpp @@ -1,56 +1,56 @@ class CfgWeapons { - class Binocular; - class NVGoggles: Binocular { - displayName = "$STR_ACE_NightVision_NVG_Gen3_brown"; - ACE_NightVision_grain = 0.75; - ACE_NightVision_blur = 0.055; - ACE_NightVision_radBlur = 0.001; - }; - class NVGoggles_OPFOR: NVGoggles { - displayName = "$STR_ACE_NightVision_NVG_Gen3_black"; - }; - class NVGoggles_INDEP: NVGoggles { - displayName = "$STR_ACE_NightVision_NVG_Gen3_green"; - }; + class Binocular; + class NVGoggles: Binocular { + displayName = "$STR_ACE_NightVision_NVG_Gen3_brown"; + ACE_NightVision_grain = 0.75; + ACE_NightVision_blur = 0.055; + ACE_NightVision_radBlur = 0.001; + }; + class NVGoggles_OPFOR: NVGoggles { + displayName = "$STR_ACE_NightVision_NVG_Gen3_black"; + }; + class NVGoggles_INDEP: NVGoggles { + displayName = "$STR_ACE_NightVision_NVG_Gen3_green"; + }; - class ACE_NVG_Gen1: NVGoggles_OPFOR { - author = "$STR_ACE_Common_ACETeam"; - modelOptics = "\A3\weapons_f\reticle\optics_night"; - displayName = "$STR_ACE_NightVision_NVG_Gen1"; - ACE_NightVision_grain = 2.25; - ACE_NightVision_blur = 0.22; - ACE_NightVision_radBlur = 0.004; - }; - class ACE_NVG_Gen2: NVGoggles_INDEP { - author = "$STR_ACE_Common_ACETeam"; - modelOptics = "\A3\weapons_f\reticle\optics_night"; - displayName = "$STR_ACE_NightVision_NVG_Gen2"; - ACE_NightVision_grain = 1.5; - ACE_NightVision_blur = 0.11; - ACE_NightVision_radBlur = 0.002; - }; - /*class ACE_NVG_Gen3: NVGoggles { + class ACE_NVG_Gen1: NVGoggles_OPFOR { + author = "$STR_ACE_Common_ACETeam"; + modelOptics = "\A3\weapons_f\reticle\optics_night"; + displayName = "$STR_ACE_NightVision_NVG_Gen1"; + ACE_NightVision_grain = 2.25; + ACE_NightVision_blur = 0.22; + ACE_NightVision_radBlur = 0.004; + }; + class ACE_NVG_Gen2: NVGoggles_INDEP { + author = "$STR_ACE_Common_ACETeam"; + modelOptics = "\A3\weapons_f\reticle\optics_night"; + displayName = "$STR_ACE_NightVision_NVG_Gen2"; + ACE_NightVision_grain = 1.5; + ACE_NightVision_blur = 0.11; + ACE_NightVision_radBlur = 0.002; + }; + /*class ACE_NVG_Gen3: NVGoggles { author = "$STR_ACE_Common_ACETeam"; modelOptics = "\A3\weapons_f\reticle\optics_night"; displayName = "$STR_ACE_NightVision_NVG_Gen3"; ACE_NightVision_grain = 0.75; ACE_NightVision_blur = 0.055; ACE_NightVision_radBlur = 0.001; - };*/ - class ACE_NVG_Gen4: NVGoggles { - author = "$STR_ACE_Common_ACETeam"; - modelOptics = "\A3\weapons_f\reticle\optics_night"; - displayName = "$STR_ACE_NightVision_NVG_Gen4"; - ACE_NightVision_grain = 0.0; - ACE_NightVision_blur = 0.0; - ACE_NightVision_radBlur = 0.0; - }; - class ACE_NVG_Wide: NVGoggles { - author = "$STR_ACE_Common_ACETeam"; - modelOptics = QUOTE(PATHTOF(ACE_nvg_wide_optics)); - displayName = "$STR_ACE_NightVision_NVG_FullScreen"; - ACE_NightVision_grain = 0.75; - ACE_NightVision_blur = 0.055; - ACE_NightVision_radBlur = 0.001; - }; +};*/ + class ACE_NVG_Gen4: NVGoggles { + author = "$STR_ACE_Common_ACETeam"; + modelOptics = "\A3\weapons_f\reticle\optics_night"; + displayName = "$STR_ACE_NightVision_NVG_Gen4"; + ACE_NightVision_grain = 0.0; + ACE_NightVision_blur = 0.0; + ACE_NightVision_radBlur = 0.0; + }; + class ACE_NVG_Wide: NVGoggles { + author = "$STR_ACE_Common_ACETeam"; + modelOptics = QUOTE(PATHTOF(models\ACE_nvg_wide_optics)); + displayName = "$STR_ACE_NightVision_NVG_FullScreen"; + ACE_NightVision_grain = 0.75; + ACE_NightVision_blur = 0.055; + ACE_NightVision_radBlur = 0.001; + }; }; diff --git a/addons/nightvision/ace_nvg_wide_optics.p3d b/addons/nightvision/models/ace_nvg_wide_optics.p3d similarity index 100% rename from addons/nightvision/ace_nvg_wide_optics.p3d rename to addons/nightvision/models/ace_nvg_wide_optics.p3d From e649c8e8532082a4c39930764b7a5314cf625a4b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 17 Feb 2015 22:07:29 -0600 Subject: [PATCH 102/166] Headers and formating --- addons/nightvision/CfgEventHandlers.hpp | 20 +++---- addons/nightvision/CfgVehicles.hpp | 38 ++++++------ addons/nightvision/XEH_preInit.sqf | 3 +- addons/nightvision/functions/fnc_blending.sqf | 58 +++++++++++++------ .../functions/fnc_changeNVGBrightness.sqf | 33 +++++++++++ .../functions/fnc_decreaseNVGBrightness.sqf | 21 ------- .../functions/fnc_increaseNVGBrightness.sqf | 21 ------- .../functions/fnc_updatePPEffects.sqf | 16 ++++- 8 files changed, 117 insertions(+), 93 deletions(-) create mode 100644 addons/nightvision/functions/fnc_changeNVGBrightness.sqf delete mode 100644 addons/nightvision/functions/fnc_decreaseNVGBrightness.sqf delete mode 100644 addons/nightvision/functions/fnc_increaseNVGBrightness.sqf diff --git a/addons/nightvision/CfgEventHandlers.hpp b/addons/nightvision/CfgEventHandlers.hpp index d76482dd7f..380f190f47 100644 --- a/addons/nightvision/CfgEventHandlers.hpp +++ b/addons/nightvision/CfgEventHandlers.hpp @@ -1,19 +1,19 @@ class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_preInit) ); - }; + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit) ); + }; }; class Extended_PostInit_EventHandlers { - class ADDON { - clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient) ); - }; + class ADDON { + clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient) ); + }; }; class Extended_FiredBIS_EventHandlers { - class AllVehicles { - class ADDON { - clientFiredBIS = QUOTE( _this call FUNC(blending) ); + class AllVehicles { + class ADDON { + clientFiredBIS = QUOTE( _this call FUNC(blending) ); + }; }; - }; }; diff --git a/addons/nightvision/CfgVehicles.hpp b/addons/nightvision/CfgVehicles.hpp index 63abfb47e2..d53ce54467 100644 --- a/addons/nightvision/CfgVehicles.hpp +++ b/addons/nightvision/CfgVehicles.hpp @@ -1,22 +1,22 @@ class CfgVehicles { - class All { - ACE_NightVision_grain = 0.75; - ACE_NightVision_blur = 0.055; - }; - - #define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ - name = #ITEM; \ - count = COUNT; \ - }; - - class Box_NATO_Support_F; - class ACE_Box_Misc: Box_NATO_Support_F { - class TransportItems { - MACRO_ADDITEM(ACE_NVG_Gen1,6) - MACRO_ADDITEM(ACE_NVG_Gen2,6) - //MACRO_ADDITEM(ACE_NVG_Gen3,6) - MACRO_ADDITEM(ACE_NVG_Gen4,6) - MACRO_ADDITEM(ACE_NVG_Wide,6) + class All { + ACE_NightVision_grain = 0.75; + ACE_NightVision_blur = 0.055; + }; + +#define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ + name = #ITEM; \ + count = COUNT; \ + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_NVG_Gen1,6) + MACRO_ADDITEM(ACE_NVG_Gen2,6) + //MACRO_ADDITEM(ACE_NVG_Gen3,6) + MACRO_ADDITEM(ACE_NVG_Gen4,6) + MACRO_ADDITEM(ACE_NVG_Wide,6) + }; }; - }; }; diff --git a/addons/nightvision/XEH_preInit.sqf b/addons/nightvision/XEH_preInit.sqf index 9f59a01418..27f8ea7d48 100644 --- a/addons/nightvision/XEH_preInit.sqf +++ b/addons/nightvision/XEH_preInit.sqf @@ -3,8 +3,7 @@ ADDON = false; PREP(blending); -PREP(decreaseNVGBrightness); -PREP(increaseNVGBrightness); +PREP(changeNVGBrightness); PREP(updatePPEffects); ADDON = true; diff --git a/addons/nightvision/functions/fnc_blending.sqf b/addons/nightvision/functions/fnc_blending.sqf index df46c62b58..41c61cd687 100644 --- a/addons/nightvision/functions/fnc_blending.sqf +++ b/addons/nightvision/functions/fnc_blending.sqf @@ -1,4 +1,24 @@ -// by commy2 +/* + * Author: commy2 + * Change the blending when the player fires?? + * + * Arguments: + * 0: unit - Object the event handler is assigned to + * 1: weapon - Fired weapon + * 2: muzzle - Muzzle that was used + * 3: mode - Current mode of the fired weapon + * 4: ammo - Ammo used + * 5: magazine - magazine name which was used + * 6: projectile - Object of the projectile that was shot + * + * Return Value: + * Nothing + * + * Example: + * [clientFiredBIS-XEH] call ace_nightvision_fnc_blending + * + * Public: No + */ #include "script_component.hpp" private ["_vehicle", "_weapon", "_ammo", "_magazine", "_player"]; @@ -8,26 +28,26 @@ _weapon = _this select 1; _ammo = _this select 4; _magazine = _this select 5; -if ((_vehicle != (vehicle ACE_player)) || {(currentVisionMode _vehicle) != 1}) exitWith {}; - _player = ACE_player; +if ((_vehicle != (vehicle _player)) || {(currentVisionMode _player) != 1}) exitWith {}; + if (_player != _vehicle && {!(_weapon in (_vehicle weaponsTurret ([_player] call EFUNC(common,getTurretIndex))))}) exitWith {}; private ["_silencer", "_visibleFireCoef", "_visibleFireTimeCoef", "_visibleFire", "_visibleFireTime", "_nvgBrightnessCoef", "_fnc_isTracer", "_darkness"]; _silencer = switch (_weapon) do { - case (primaryWeapon _player) : {primaryWeaponItems _player select 0}; - case (secondaryWeapon _player) : {secondaryWeaponItems _player select 0}; - case (handgunWeapon _player) : {handgunItems _player select 0}; - default {""}; +case (primaryWeapon _player) : {primaryWeaponItems _player select 0}; +case (secondaryWeapon _player) : {secondaryWeaponItems _player select 0}; +case (handgunWeapon _player) : {handgunItems _player select 0}; + default {""}; }; _visibleFireCoef = 1; _visibleFireTimeCoef = 1; if (_silencer != "") then { - _visibleFireCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFire"); - _visibleFireTimeCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFireTime"); + _visibleFireCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFire"); + _visibleFireTimeCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFireTime"); }; _visibleFire = getNumber (configFile >> "CfgAmmo" >> _ammo >> "visibleFire"); @@ -36,24 +56,24 @@ _visibleFireTime = getNumber (configFile >> "CfgAmmo" >> _ammo >> "visibleFireTi _nvgBrightnessCoef = 1 + (_player getVariable [QGVAR(NVGBrightness), 0]) / 4; _fnc_isTracer = { - private ["_indexShot", "_lastRoundsTracer", "_tracersEvery"]; + private ["_indexShot", "_lastRoundsTracer", "_tracersEvery"]; - if (getNumber (configFile >> "CfgAmmo" >> _ammo >> "nvgOnly") > 0) exitWith {false}; + if (getNumber (configFile >> "CfgAmmo" >> _ammo >> "nvgOnly") > 0) exitWith {false}; - _indexShot = (_player ammo _weapon) + 1; + _indexShot = (_player ammo _weapon) + 1; - _lastRoundsTracer = getNumber (configFile >> "CfgMagazines" >> _magazine >> "lastRoundsTracer"); - if (_indexShot <= _lastRoundsTracer) exitWith {true}; + _lastRoundsTracer = getNumber (configFile >> "CfgMagazines" >> _magazine >> "lastRoundsTracer"); + if (_indexShot <= _lastRoundsTracer) exitWith {true}; - _tracersEvery = getNumber (configFile >> "CfgMagazines" >> _magazine >> "tracersEvery"); - if (_tracersEvery == 0) exitWith {false}; + _tracersEvery = getNumber (configFile >> "CfgMagazines" >> _magazine >> "tracersEvery"); + if (_tracersEvery == 0) exitWith {false}; - (_indexShot - _lastRoundsTracer) % _tracersEvery == 0 + (_indexShot - _lastRoundsTracer) % _tracersEvery == 0 }; if (call _fnc_isTracer) then { - _visibleFire = _visibleFire + 2; - _visibleFireTime = _visibleFireTime + 2; + _visibleFire = _visibleFire + 2; + _visibleFireTime = _visibleFireTime + 2; }; _darkness = 1 - (call EFUNC(common,ambientBrightness)); diff --git a/addons/nightvision/functions/fnc_changeNVGBrightness.sqf b/addons/nightvision/functions/fnc_changeNVGBrightness.sqf new file mode 100644 index 0000000000..e1894aba00 --- /dev/null +++ b/addons/nightvision/functions/fnc_changeNVGBrightness.sqf @@ -0,0 +1,33 @@ +/* + * Author: commy2 + * Change the brightness of the unit's NVG + * + * Arguments: + * 0: The Unit + * 1: Change in brightness (1 or -1) + * + * Return Value: + * Nothing + * + * Example: + * [player, 1] call ace_nightvision_fnc_changeNVGBrightness + * + * Public: No + */ +#include "script_component.hpp" + +private ["_brightness"]; + +PARAMS_2(_player,_changeInBrightness); + +_brightness = _player getVariable [QGVAR(NVGBrightness), 0]; + +_brightness = ((round (10 * _brightness + _changeInBrightness) / 10) min 1) max -1; + +_player setVariable [QGVAR(NVGBrightness), _brightness, false]; + +GVAR(ppEffectNVGBrightness) ppEffectAdjust [1, 1, _brightness / 4, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]]; +GVAR(ppEffectNVGBrightness) ppEffectCommit 0; + +[format [(localize "STR_ACE_NightVision_NVGBrightness"), (_brightness * 100)]] call EFUNC(common,displayTextStructured); +playSound "ACE_Sound_Click"; diff --git a/addons/nightvision/functions/fnc_decreaseNVGBrightness.sqf b/addons/nightvision/functions/fnc_decreaseNVGBrightness.sqf deleted file mode 100644 index 0fb2de9d33..0000000000 --- a/addons/nightvision/functions/fnc_decreaseNVGBrightness.sqf +++ /dev/null @@ -1,21 +0,0 @@ -// by commy2 -#include "script_component.hpp" - -private ["_player", "_vehicle", "_brightness"]; - -_player = _this select 0; -_vehicle = _this select 1; - -_brightness = _player getVariable [QGVAR(NVGBrightness), 0]; - -if (_brightness > -1) then { - _brightness = round (10 * _brightness - 1) / 10; - - _player setVariable [QGVAR(NVGBrightness), _brightness, false]; - - GVAR(ppEffectNVGBrightness) ppEffectAdjust [1, 1, _brightness / 4, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]]; - GVAR(ppEffectNVGBrightness) ppEffectCommit 0; - - [format [localize "STR_ACE_NightVision_NVGBrightness", format ["%1%", _brightness * 100]]] call EFUNC(common,displayTextStructured); - playSound "ACE_Sound_Click"; -}; diff --git a/addons/nightvision/functions/fnc_increaseNVGBrightness.sqf b/addons/nightvision/functions/fnc_increaseNVGBrightness.sqf deleted file mode 100644 index e2143d5a5e..0000000000 --- a/addons/nightvision/functions/fnc_increaseNVGBrightness.sqf +++ /dev/null @@ -1,21 +0,0 @@ -// by commy2 -#include "script_component.hpp" - -private ["_player", "_vehicle", "_brightness"]; - -_player = _this select 0; -_vehicle = _this select 1; - -_brightness = _player getVariable [QGVAR(NVGBrightness), 0]; - -if (_brightness < 1) then { - _brightness = round (10 * _brightness + 1) / 10; - - _player setVariable [QGVAR(NVGBrightness), _brightness, false]; - - GVAR(ppEffectNVGBrightness) ppEffectAdjust [1, 1, _brightness / 4, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]]; - GVAR(ppEffectNVGBrightness) ppEffectCommit 0; - - [format [localize "STR_ACE_NightVision_NVGBrightness", format ["%1%", _brightness * 100]]] call EFUNC(common,displayTextStructured); - playSound "ACE_Sound_Click"; -}; diff --git a/addons/nightvision/functions/fnc_updatePPEffects.sqf b/addons/nightvision/functions/fnc_updatePPEffects.sqf index 1fdfbb9778..3edfe28e74 100644 --- a/addons/nightvision/functions/fnc_updatePPEffects.sqf +++ b/addons/nightvision/functions/fnc_updatePPEffects.sqf @@ -1,4 +1,18 @@ -//by commy2, PabstMirror and CAA-Picard +/* + * Author: commy2, PabstMirror and CAA-Picard + * Update the ppEffects everytime something changes + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * [someEvent] call ace_nightvision_fnc_updatePPEffects + * + * Public: No + */ #include "script_component.hpp" private ["_currentVehicle", "_grainSetting", "_blurSetting", "_radBlurSetting", "_config"]; From c6c200a6849e5004a387d031bf9d5d7b2de3e5f1 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 17 Feb 2015 22:24:37 -0600 Subject: [PATCH 103/166] comments --- addons/nightvision/functions/fnc_blending.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/nightvision/functions/fnc_blending.sqf b/addons/nightvision/functions/fnc_blending.sqf index 41c61cd687..96e7f404a5 100644 --- a/addons/nightvision/functions/fnc_blending.sqf +++ b/addons/nightvision/functions/fnc_blending.sqf @@ -29,9 +29,9 @@ _ammo = _this select 4; _magazine = _this select 5; _player = ACE_player; - +//If our vehicle didn't shoot, or we're not in NVG mode, exit if ((_vehicle != (vehicle _player)) || {(currentVisionMode _player) != 1}) exitWith {}; - +//If we are mounted, and it wasn't our weapon system that fired, exit if (_player != _vehicle && {!(_weapon in (_vehicle weaponsTurret ([_player] call EFUNC(common,getTurretIndex))))}) exitWith {}; private ["_silencer", "_visibleFireCoef", "_visibleFireTimeCoef", "_visibleFire", "_visibleFireTime", "_nvgBrightnessCoef", "_fnc_isTracer", "_darkness"]; From b86869d7a1c7e90b5b06b55eec50472d130b9657 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 17 Feb 2015 22:37:04 -0600 Subject: [PATCH 104/166] UAV-Recharge Headers --- .../functions/fnc_canRefuelUAV.sqf | 30 ++++++++++--------- .../functions/fnc_refuelUAV.sqf | 30 ++++++++++--------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/addons/logistics_uavbattery/functions/fnc_canRefuelUAV.sqf b/addons/logistics_uavbattery/functions/fnc_canRefuelUAV.sqf index 4256ddabf9..aaaac3077d 100644 --- a/addons/logistics_uavbattery/functions/fnc_canRefuelUAV.sqf +++ b/addons/logistics_uavbattery/functions/fnc_canRefuelUAV.sqf @@ -1,17 +1,19 @@ -/* fnc_refuel.sqf -* -* Author: marc_book (modified by PabstMirror) -* -* Tests if unit can refuel the target UAV -* -* Argument: -* 0: OBJECT - Player unit -* 1: OBJECT - UAV to test -* -* Return value: -* BOOL -*/ - +/* + * Author: marc_book + * Tests if unit can refuel the target UAV + * + * Arguments: + * 0: Player + * 1: UAV + * + * Return Value: + * Can the player rechange the UAV + * + * Example: + * [player, theUAV] call ace_logistics_uavbattery_fnc_canRefuelUAV + * + * Public: No + */ #include "script_component.hpp" PARAMS_2(_caller,_target); diff --git a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf index 5a248bf812..a23969aa9f 100644 --- a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf +++ b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf @@ -1,17 +1,19 @@ -/* fnc_refuel.sqf -* -* Author: marc_book (modified by PabstMirror) -* -* Starts refueling/recharging the 'Dartar' UAVs -* -* Argument: -* 0: OBJECT - Player unit -* 1: OBJECT - UAV -* -* Return value: -* NOTHING -*/ - +/* + * Author: marc_book + * Starts refueling/recharging the 'Dartar' UAVs + * + * Arguments: + * 0: Player + * 1: UAV + * + * Return Value: + * Nothing + * + * Example: + * [player, theUAV] call ace_logistics_uavbattery_fnc_refuelUAV + * + * Public: No + */ #include "script_component.hpp" PARAMS_2(_caller,_target); From 043987fc9339a70431b459d379f58e05c6459f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Wed, 18 Feb 2015 18:58:06 -0300 Subject: [PATCH 105/166] basic self actions --- addons/interact_menu/CfgEventHandlers.hpp | 2 +- addons/interact_menu/XEH_clientInit.sqf | 18 +++- addons/interact_menu/XEH_preInit.sqf | 4 + .../functions/fnc_compileMenuSelfAction.sqf | 99 +++++++++++++++++++ .../functions/fnc_keyDownSelfAction.sqf | 11 +++ .../functions/fnc_keyUpSelfAction.sqf | 15 +++ addons/interact_menu/functions/fnc_render.sqf | 43 ++++---- addons/interaction/XEH_clientInit.sqf | 72 -------------- 8 files changed, 172 insertions(+), 92 deletions(-) create mode 100644 addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf create mode 100644 addons/interact_menu/functions/fnc_keyDownSelfAction.sqf create mode 100644 addons/interact_menu/functions/fnc_keyUpSelfAction.sqf diff --git a/addons/interact_menu/CfgEventHandlers.hpp b/addons/interact_menu/CfgEventHandlers.hpp index ae9c93b32e..1301f022d3 100644 --- a/addons/interact_menu/CfgEventHandlers.hpp +++ b/addons/interact_menu/CfgEventHandlers.hpp @@ -13,7 +13,7 @@ class Extended_PostInit_EventHandlers { class Extended_InitPost_EventHandlers { class All { class GVAR(compileMenu) { - init = QUOTE(_this call FUNC(compileMenu)); + init = QUOTE(_this call FUNC(compileMenu);_this call FUNC(compileMenuSelfAction)); }; }; }; \ No newline at end of file diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index a02bf4d558..a2ce5ef8a6 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -15,13 +15,27 @@ _fnc = { ["ACE3", "Interact Key", {_this call FUNC(keyDown)}, -[15, [false, false, false]], +[219, [false, false, false]], false, "keydown"] call cba_fnc_registerKeybind; ["ACE3", "Interact Key", {_this call FUNC(keyUp)}, -[15, [false, false, false]], +[219, [false, false, false]], +false, +"keyUp"] call cba_fnc_registerKeybind; + +["ACE3", +"Self Actions Key", +{_this call FUNC(keyDownSelfAction)}, +[219, [false, true, false]], +false, +"keydown"] call cba_fnc_registerKeybind; + +["ACE3", +"Self Actions Key", +{_this call FUNC(keyUpSelfAction)}, +[219, [false, true, false]], false, "keyUp"] call cba_fnc_registerKeybind; \ No newline at end of file diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index 42795d6c75..da01026425 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -10,14 +10,18 @@ PREP(probe); PREP(rotateVectLineGetMap); PREP(rotateVectLine); PREP(keyDown); +PREP(keyDownSelfAction); PREP(keyUp); +PREP(keyUpSelfAction); PREP(compileMenu); +PREP(compileMenuSelfAction); PREP(addAction); PREP(removeAction); GVAR(toRender) = []; GVAR(keyDown) = false; +GVAR(keyDownSelfAction) = false; GVAR(keyDownTime) = 0; GVAR(lastTime) = diag_tickTime; diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf new file mode 100644 index 0000000000..0c057d7296 --- /dev/null +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -0,0 +1,99 @@ +//fnc_compileMenuSelfAction.sqf +#include "script_component.hpp"; +// diag_log text format["COMPILE ACTIONS: %1", _this]; + +_object = _this select 0; +_objectType = typeOf _object; + + +/* +displayName = "$STR_ACE_Hearing_Earbuds_On"; +condition = QUOTE( !([_player] call FUNC(hasEarPlugsIn)) && {'ACE_EarBuds' in items _player} ); +statement = QUOTE( [_player] call FUNC(putInEarPlugs) ); +showDisabled = 0; +priority = 2.5; +icon = PATHTOF(UI\ACE_earplugs_x_ca.paa); +hotkey = "E"; +enableInside = 1; +*/ + +/* +[ + [ + "Launch", + "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", + [0,0,0], + { (_this select 0) setVelocity [0,0,10]; }, + { true }, + 1, + [] + ] +] +*/ + +_actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions"; + + +_recurseFnc = { + private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_condition", "_showDisabled", + "_enableInside", "_children", "_entry", "_actionsCfg"]; + _actions = []; + _actionsCfg = _this select 0; + for "_i" from 0 to (count _actionsCfg)-1 do { + _entryCfg = _actionsCfg select _i; + if(isClass _entryCfg) then { + _displayName = getText (_entryCfg >> "displayName"); + _icon = getText (_entryCfg >> "icon"); + _statement = compile (getText (_entryCfg >> "statement")); + + _condition = getText (_entryCfg >> "condition"); + if (_condition == "") then {_condition = "true"}; + + // Add canInteract (including exceptions) and canInteractWith to condition + _condition = _condition + format [QUOTE( && {%1 call EGVAR(common,canInteract)} && {[ARR_2(ACE_player, _target)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")]; + + _showDisabled = getNumber (_entryCfg >> "showDisabled"); + _enableInside = getNumber (_entryCfg >> "enableInside"); + + _condition = compile _condition; + // diag_log text format["_condition: %1", _condition]; + _children = []; + if(isArray (_entryCfg >> "subMenu")) then { + _subMenuDef = getArray (_entryCfg >> "subMenu"); + _childMenuName = _subMenuDef select 0; + _childMenuCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions" >> _childMenuName; + _children = [_childMenuCfg] call _recurseFnc; + }; + _entry = [ + _displayName, + _icon, + [0,0,0], + _statement, + _condition, + 3, //distace + _children, + GVAR(uidCounter) + ]; + GVAR(uidCounter) = GVAR(uidCounter) + 1; + _actions pushBack _entry; + }; + }; + _actions +}; + +_actions = [_actionsCfg] call _recurseFnc; + +_actions = [[ + "Self Actions", + "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", + "Spine3", + { true }, + { true }, + 5, + _actions, + GVAR(uidCounter) +] +]; +GVAR(uidCounter) = GVAR(uidCounter) + 1; + +_object setVariable [QUOTE(GVAR(selfActionData)), _actions]; diff --git a/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf b/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf new file mode 100644 index 0000000000..b44fed6457 --- /dev/null +++ b/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf @@ -0,0 +1,11 @@ +//fnc_keyDownSelfAction.sqf +#include "script_component.hpp" + +if(!GVAR(keyDownSelfAction)) then { + GVAR(keyDownSelfAction) = true; + GVAR(keyDown) = false; + GVAR(keyDownTime) = diag_tickTime; + + GVAR(selfMenuOffset) = [sin getDir ACE_player, cos getDir ACE_player, 0] vectorMultiply 2; +}; +true diff --git a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf new file mode 100644 index 0000000000..0029e3bd05 --- /dev/null +++ b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf @@ -0,0 +1,15 @@ +//fnc_keyUp.sqf +#include "script_component.hpp" + +GVAR(keyDownSelfAction) = false; +if(GVAR(actionSelected)) then { + this = GVAR(selectedTarget); + _player = ACE_Player; + _target = GVAR(selectedTarget); + [GVAR(selectedTarget), player] call GVAR(selectedAction); +}; +GVAR(expanded) = false; +GVAR(lastPath) = []; +GVAR(menuDepthPath) = []; +GVAR(vecLineMap) = []; +true diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 29033e3407..ba444c1a7a 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -6,7 +6,7 @@ _foundTarget = false; _cursorPos1 = positionCameraToWorld [0, 0, 0]; _cursorPos2 = positionCameraToWorld [0, 0, 2]; GVAR(currentOptions) = []; -if((count GVAR(toRender)) > 0 && GVAR(keyDown)) then { +if((count GVAR(toRender)) > 0 && (GVAR(keyDown) || GVAR(keyDownSelfAction))) then { if((count GVAR(vecLineMap)) == 0 || ((count GVAR(menuDepthPath)) > 0 && (getPosASL player) distance GVAR(lastPos) > 0.01)) then { GVAR(lastPos) = getPosASL player; _cursorVec = [_cursorPos2, _cursorPos1] call BIS_fnc_vectorFromXtoY; @@ -15,23 +15,32 @@ if((count GVAR(toRender)) > 0 && GVAR(keyDown)) then { _p = (_cursorVec call CBA_fnc_vect2polar); _v = [(_p select 0), (_p select 1), (_p select 2)+90] call CBA_fnc_polar2vect; _cp = [_cursorVec, _v] call BIS_fnc_crossProduct; - + GVAR(vecLineMap) = [_cp, _p1, _p2] call FUNC(rotateVectLineGetMap); }; - { - if(!(_forEachIndex in GVAR(filter))) then { - GVAR(renderDepth) = 0; - _renderTargets = _x; - { - [_renderTargets select 0, _x, 0] call FUNC(renderMenu); - } forEach (_renderTargets select 1); - }; - } forEach GVAR(toRender); + if (GVAR(keyDown)) then { + // Render all nearby interaction menus + { + if(!(_forEachIndex in GVAR(filter))) then { + GVAR(renderDepth) = 0; + _renderTargets = _x; + { + [_renderTargets select 0, _x, 0] call FUNC(renderMenu); + } forEach (_renderTargets select 1); + }; + } forEach GVAR(toRender); + } else { + // Render only the self action menu + _actions = (ACE_player getVariable QGVAR(selfActionData)) select 0; + _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset); + [ACE_player, _actions, 0, _pos] call FUNC(renderMenu); + }; + // player sideChat format["c: %1", count GVAR(toRender)]; }; -if(GVAR(keyDown)) then { - +if(GVAR(keyDown) || GVAR(keyDownSelfAction)) then { + _cursorScreenPos = worldToScreen _cursorPos2; _closestDistance = 1000000; _closestSelection = -1; @@ -46,11 +55,11 @@ if(GVAR(keyDown)) then { }; }; } forEach GVAR(currentOptions); - + if(_closestSelection != -1) then { - + _closest = GVAR(currentOptions) select _closestSelection; - + _pos = _closest select 1; _cTime = diag_tickTime; _delta = _cTime - GVAR(lastTime); @@ -75,7 +84,7 @@ if(GVAR(keyDown)) then { }; } forEach GVAR(lastPath); }; - + if(_misMatch) then { GVAR(lastPath) = _hoverPath; GVAR(startHoverTime) = diag_tickTime; diff --git a/addons/interaction/XEH_clientInit.sqf b/addons/interaction/XEH_clientInit.sqf index 047e528ad6..85232d1fcd 100644 --- a/addons/interaction/XEH_clientInit.sqf +++ b/addons/interaction/XEH_clientInit.sqf @@ -16,78 +16,6 @@ GVAR(isOpeningDoor) = false; // Add keybinds -["ACE3", - localize "STR_ACE_Interaction_InteractionMenu", - { - // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), "ACE_Interaction_isNotSwimming"]; - if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; - // Conditions: specific - if !(isNull (findDisplay 1713999)) exitWith {false}; - - // Statement - call FUNC(onButtonDown); - true - }, - [219, [false, false, false]], - false, - "keydown" -] call cba_fnc_registerKeybind; - -["ACE3", - localize "STR_ACE_Interaction_InteractionMenu", - { - // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), "ACE_Interaction_isNotSwimming"]; - if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; - // Conditions: specific - if !(!isNull (findDisplay 1713999) && {QGVAR(AutoCloseMenu)}) exitWith {false}; - - // Statement - if (GVAR(MenuType) mod 2 == 0) then {call FUNC(onButtonUp)}; - true - }, - [219, [false, false, false]], - false, - "keyup" -] call cba_fnc_registerKeybind; - -["ACE3", - localize "STR_ACE_Interaction_InteractionMenuSelf", - { - // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), QEGVAR(captives,isNotSurrendering), "ACE_Interaction_isNotSwimming", "ACE_Common_notOnMap"]; - if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; - // Conditions: specific - if !(isNull (findDisplay 1713999)) exitWith {false}; - - // Statement - call FUNC(onButtonDownSelf); - true - }, - [219, [false, true, false]], - false, - "keydown" -] call cba_fnc_registerKeybind; - -["ACE3", - localize "STR_ACE_Interaction_InteractionMenuSelf", - { - // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), QEGVAR(captives,isNotSurrendering), "ACE_Interaction_isNotSwimming"]; - if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; - // Conditions: specific - if !(!isNull (findDisplay 1713999) && {QGVAR(AutoCloseMenu)}) exitWith {false}; - - // Statement - if (GVAR(MenuType) mod 2 == 1) then {call FUNC(onButtonUp)}; - true - }, - [219, [false, true, false]], - false, - "keyup" -] call cba_fnc_registerKeybind; - ["ACE3", localize "STR_ACE_Interaction_OpenDoor", { From 244d7a5572735c086184dab89e338fda3b1cd31c Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 19 Feb 2015 03:02:58 -0600 Subject: [PATCH 106/166] Fix opacity fading on other render levels --- addons/interact_menu/functions/fnc_renderIcon.sqf | 5 +---- addons/interact_menu/functions/fnc_renderMenu.sqf | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 39b4b120b9..30821ffdac 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -18,12 +18,9 @@ if(count _sPos > 0) then { if(_icon == "") then { _icon = DEFAULT_ICON; }; - _text = "" + _text; + _text = format ["%3", _icon, _color, _text]; _ctrl ctrlSetStructuredText (parseText _text); _ctrl ctrlSetPosition [(_sPos select 0)-(0.011*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.025*SafeZoneW]; - _ctrl ctrlSetForegroundColor _color; - _opacity = _color select 3; - _control ctrlSetTextColor _color; // _ctrl ctrlSetBackgroundColor [1,0,0,1]; _ctrl ctrlCommit 0; }; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 0337d4e8c9..3635241426 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -25,13 +25,13 @@ if(_cursorScreenPos distance _pos <= _distance) then { }; _menuDepth = (count GVAR(menuDepthPath)); - _opacity = 1; + _color = "#FFFFFFFF"; // ARGB Color (First Hex Pair is transparancy) if(_menuDepth > 0 && _index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { - _opacity = ((GVAR(renderDepth)/_menuDepth)) max 0.25; + _color = format ["#%1FFFFFF", [255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25)] call EFUNC(common,toHex)]; }; _path set[(count _path), _index]; // player sideChat format["r: %1", _actionData select 2]; - [_actionData select 0, [1,1,1,_opacity], _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); + [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); GVAR(currentOptions) set[(count GVAR(currentOptions)), [_this, _pos, _path]]; _currentRenderDepth = -1; _currentRenderDepth = GVAR(renderDepth); From 8c833206752f625396fec58977721e6b3719313d Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Thu, 19 Feb 2015 12:32:41 +0200 Subject: [PATCH 107/166] Separated dialing phone code into separate function to neaten up the original function. --- addons/explosives/functions/fnc_dialPhone.sqf | 28 +----------- .../explosives/functions/fnc_dialingPhone.sqf | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 27 deletions(-) create mode 100644 addons/explosives/functions/fnc_dialingPhone.sqf diff --git a/addons/explosives/functions/fnc_dialPhone.sqf b/addons/explosives/functions/fnc_dialPhone.sqf index 3bb2cc45e8..f694ff3d5f 100644 --- a/addons/explosives/functions/fnc_dialPhone.sqf +++ b/addons/explosives/functions/fnc_dialPhone.sqf @@ -28,33 +28,7 @@ for [{_i=0}, {_i<_ran}, {_i=_i+1}] do { }; if (_unit == ace_player) then { ctrlSetText [1400,"Calling"]; - [{ - EXPLODE_4_PVT(_this select 0,_unit,_i,_arr,_code); - if ((_i mod 4) == 0) then { - playSound3D [QUOTE(PATHTOF_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; - }; - ctrlSetText [1400,format["Calling%1",_arr select (_i - 4)]]; - if (_i >= (count _arr + 2)) then { - [_this select 1] call CALLSTACK(cba_fnc_removePerFrameHandler); - private "_explosive"; - _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); - if (!isNull (_explosive)) then { - [_unit, -1, [_explosive, 1]] call FUNC(detonateExplosive); - }; - _unit setVariable [QGVAR(Dialing), false, true]; - if (_unit == ace_player) then { - ctrlSetText [1400,"Call Ended!"]; - }; - }; - if (_i == (count _arr)) then { - private "_explosive"; - _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); - if (!isNull (_explosive)) then { - playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL _explosive,3.16228,1,75]; - }; - }; - (_this select 0) set [1, _i + 1]; - }, 0.25, [_unit,4,_arr,_code]] call CALLSTACK(CBA_fnc_addPerFrameHandler); + [FUNC(dialingPhone), 0.25, [_unit,4,_arr,_code]] call CALLSTACK(CBA_fnc_addPerFrameHandler); } else { private ["_explosive"]; _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); diff --git a/addons/explosives/functions/fnc_dialingPhone.sqf b/addons/explosives/functions/fnc_dialingPhone.sqf new file mode 100644 index 0000000000..7b71d0e5af --- /dev/null +++ b/addons/explosives/functions/fnc_dialingPhone.sqf @@ -0,0 +1,44 @@ +/* + * Author: Garth 'L-H' de Wet + * Performs the dial tones and detonation of explosive. + * + * Arguments: + * 0: Unit to do dialing + * 1: Index + * 2: Dialing points + * 3: IED code + * + * Return Value: + * None + * + * Example: + * [FUNC(dialingPhone), 0.25, [_unit,4,_arr,_code]] call CALLSTACK(CBA_fnc_addPerFrameHandler); + * + * Public: No + */ +#include "script_component.hpp" +EXPLODE_4_PVT(_this select 0,_unit,_i,_arr,_code); +if ((_i mod 4) == 0) then { + playSound3D [QUOTE(PATHTOF_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; +}; +ctrlSetText [1400,format["Calling%1",_arr select (_i - 4)]]; +if (_i >= (count _arr + 2)) then { + [_this select 1] call CALLSTACK(cba_fnc_removePerFrameHandler); + private "_explosive"; + _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); + if (!isNull (_explosive)) then { + [_unit, -1, [_explosive, 1]] call FUNC(detonateExplosive); + }; + _unit setVariable [QGVAR(Dialing), false, true]; + if (_unit == ace_player) then { + ctrlSetText [1400,"Call Ended!"]; + }; +}; +if (_i == (count _arr)) then { + private "_explosive"; + _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); + if (!isNull (_explosive)) then { + playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL _explosive,3.16228,1,75]; + }; +}; +(_this select 0) set [1, _i + 1]; From 00643c3c83011b1d5038f4213e87d2733f1871f9 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Thu, 19 Feb 2015 12:39:13 +0200 Subject: [PATCH 108/166] Ensured actual fuse time is used instead of simply 1. --- addons/explosives/functions/fnc_addCellphoneIED.sqf | 2 +- addons/explosives/functions/fnc_dialingPhone.sqf | 12 ++++++------ .../functions/fnc_getSpeedDialExplosive.sqf | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/explosives/functions/fnc_addCellphoneIED.sqf b/addons/explosives/functions/fnc_addCellphoneIED.sqf index b13473cf25..49bec07f1b 100644 --- a/addons/explosives/functions/fnc_addCellphoneIED.sqf +++ b/addons/explosives/functions/fnc_addCellphoneIED.sqf @@ -43,7 +43,7 @@ while {!_codeSet} do { if (isNil QGVAR(CellphoneIEDs)) then { GVAR(CellphoneIEDs) = []; }; -_count = GVAR(CellphoneIEDs) pushBack [_explosive,_code]; +_count = GVAR(CellphoneIEDs) pushBack [_explosive,_code,GetNumber(ConfigFile >> "CfgMagazines" >> _magazineClass >> "ACE_Triggers" >> "Cellphone" >> "FuseTime")]; _count = _count + 1; publicVariable QGVAR(CellphoneIEDs); _unit sideChat format ["IED %1 code: %2", _count,_code]; diff --git a/addons/explosives/functions/fnc_dialingPhone.sqf b/addons/explosives/functions/fnc_dialingPhone.sqf index 7b71d0e5af..c50f618abe 100644 --- a/addons/explosives/functions/fnc_dialingPhone.sqf +++ b/addons/explosives/functions/fnc_dialingPhone.sqf @@ -22,12 +22,14 @@ if ((_i mod 4) == 0) then { playSound3D [QUOTE(PATHTOF_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; }; ctrlSetText [1400,format["Calling%1",_arr select (_i - 4)]]; + +private "_explosive"; +_explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); + if (_i >= (count _arr + 2)) then { [_this select 1] call CALLSTACK(cba_fnc_removePerFrameHandler); - private "_explosive"; - _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); if (!isNull (_explosive)) then { - [_unit, -1, [_explosive, 1]] call FUNC(detonateExplosive); + [_unit, -1, [_explosive select 0, _explosive select 2]] call FUNC(detonateExplosive); }; _unit setVariable [QGVAR(Dialing), false, true]; if (_unit == ace_player) then { @@ -35,10 +37,8 @@ if (_i >= (count _arr + 2)) then { }; }; if (_i == (count _arr)) then { - private "_explosive"; - _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); if (!isNull (_explosive)) then { - playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL _explosive,3.16228,1,75]; + playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL (_explosive select 0),3.16228,1,75]; }; }; (_this select 0) set [1, _i + 1]; diff --git a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf index f5b3172c46..c00f15b5ed 100644 --- a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf +++ b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf @@ -21,7 +21,7 @@ if (isNil QGVAR(CellphoneIEDs)) exitWith {objNull}; _explosive = objNull; { if ((_x select 1) == _code) exitWith { - _explosive = _x select 0; + _explosive = _x; }; false } count GVAR(CellphoneIEDs); From 89a81dbed1d5ddcc6b8dcb7f8ad9d0a6b9aed677 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Thu, 19 Feb 2015 12:40:21 +0200 Subject: [PATCH 109/166] Forgotten function added. --- addons/explosives/XEH_preInit.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/explosives/XEH_preInit.sqf b/addons/explosives/XEH_preInit.sqf index d8f8dc1216..3747151d16 100644 --- a/addons/explosives/XEH_preInit.sqf +++ b/addons/explosives/XEH_preInit.sqf @@ -25,6 +25,7 @@ PREP(canDetonate); PREP(defuseExplosive); PREP(detonateExplosive); PREP(dialPhone); +PREP(dialingPhone); PREP(handleScrollWheel); From f5a6f6f4047524e081eef354892e72e188fb0906 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Thu, 19 Feb 2015 15:30:01 +0200 Subject: [PATCH 110/166] Fixed various points raised in the PR. --- addons/explosives/functions/fnc_dialPhone.sqf | 6 +++--- addons/explosives/functions/fnc_dialingPhone.sqf | 2 +- addons/explosives/functions/fnc_setSpeedDial.sqf | 4 +--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/addons/explosives/functions/fnc_dialPhone.sqf b/addons/explosives/functions/fnc_dialPhone.sqf index f694ff3d5f..58d3dab716 100644 --- a/addons/explosives/functions/fnc_dialPhone.sqf +++ b/addons/explosives/functions/fnc_dialPhone.sqf @@ -34,9 +34,9 @@ if (_unit == ace_player) then { _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); if (!isNull (_explosive)) then { [{ - playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL (_this select 1),3.16228,1,75]; + playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_this select 1),3.16228,1,75]; (_this select 0) setVariable [QGVAR(Dialing), false, true]; - }, [_unit,_explosive], 0.25 * (count _arr - 4), 0] call EFUNC(common,waitAndExecute); - [_explosive,0.25 * (count _arr - 1)] call FUNC(startTimer); + }, [_unit,_explosive select 0], 0.25 * (count _arr - 4), 0] call EFUNC(common,waitAndExecute); + [_explosive select 0,(0.25 * (count _arr - 1)) + (_explosive select 2)] call FUNC(startTimer); }; }; diff --git a/addons/explosives/functions/fnc_dialingPhone.sqf b/addons/explosives/functions/fnc_dialingPhone.sqf index c50f618abe..003fd734c1 100644 --- a/addons/explosives/functions/fnc_dialingPhone.sqf +++ b/addons/explosives/functions/fnc_dialingPhone.sqf @@ -38,7 +38,7 @@ if (_i >= (count _arr + 2)) then { }; if (_i == (count _arr)) then { if (!isNull (_explosive)) then { - playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL (_explosive select 0),3.16228,1,75]; + playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_explosive select 0),3.16228,1,75]; }; }; (_this select 0) set [1, _i + 1]; diff --git a/addons/explosives/functions/fnc_setSpeedDial.sqf b/addons/explosives/functions/fnc_setSpeedDial.sqf index 20a32a1224..adb2e6af03 100644 --- a/addons/explosives/functions/fnc_setSpeedDial.sqf +++ b/addons/explosives/functions/fnc_setSpeedDial.sqf @@ -20,9 +20,7 @@ _speedDial = ace_player getVariable [QGVAR(SpeedDial), []]; if (count _speedDial == 0) exitWith {}; _amount = if((_this select 0))then{1}else{-1}; -GVAR(CurrentSpeedDial) = GVAR(CurrentSpeedDial) + _amount; -GVAR(CurrentSpeedDial) = if(GVAR(CurrentSpeedDial) < 0)then{(count _speedDial)-1}else{GVAR(CurrentSpeedDial)}; -GVAR(CurrentSpeedDial) = if(GVAR(CurrentSpeedDial) >= (count _speedDial))then{0}else{GVAR(CurrentSpeedDial)}; +GVAR(CurrentSpeedDial) = (GVAR(CurrentSpeedDial) + _amount + count _speedDial) mod (count _speedDial); ctrlSetText [1400,(_speedDial select GVAR(CurrentSpeedDial)) select 1]; ctrlSetText [1401,(_speedDial select GVAR(CurrentSpeedDial)) select 0]; From 8e6600d5ec3e9b00b7e987c005a36056704deecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 10:36:59 -0300 Subject: [PATCH 111/166] Tweak distances --- addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf | 4 ++-- addons/interact_menu/functions/fnc_keyUp.sqf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index 0c057d7296..923b65e954 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -70,7 +70,7 @@ _recurseFnc = { [0,0,0], _statement, _condition, - 3, //distace + 10, //distace _children, GVAR(uidCounter) ]; @@ -89,7 +89,7 @@ _actions = [[ "Spine3", { true }, { true }, - 5, + 10, _actions, GVAR(uidCounter) ] diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 8f91b1322d..413fff11ad 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -1,4 +1,4 @@ -//fnc_keyUp.sqf +//fnc_keyUpSelfAction.sqf #include "script_component.hpp" GVAR(keyDown) = false; From 3b35d9d109bcab5af3c1c43c19379c30340ccfe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 10:38:09 -0300 Subject: [PATCH 112/166] Make interact sub menus open as circle sectors instead of full circles --- addons/interact_menu/functions/fnc_render.sqf | 6 +- .../functions/fnc_renderMenu.sqf | 72 ++++++++++++------- 2 files changed, 50 insertions(+), 28 deletions(-) diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index ba444c1a7a..a4b699aab3 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -25,15 +25,15 @@ if((count GVAR(toRender)) > 0 && (GVAR(keyDown) || GVAR(keyDownSelfAction))) the GVAR(renderDepth) = 0; _renderTargets = _x; { - [_renderTargets select 0, _x, 0] call FUNC(renderMenu); + [_renderTargets select 0, _x, 0, [270, 360]] call FUNC(renderMenu); } forEach (_renderTargets select 1); }; } forEach GVAR(toRender); } else { // Render only the self action menu _actions = (ACE_player getVariable QGVAR(selfActionData)) select 0; - _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset); - [ACE_player, _actions, 0, _pos] call FUNC(renderMenu); + _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset) vectorAdd [0,0,0.25]; + [ACE_player, _actions, 0, [270, 360], _pos] call FUNC(renderMenu); }; // player sideChat format["c: %1", count GVAR(toRender)]; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 0337d4e8c9..80f39b91c5 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -5,11 +5,14 @@ private ["_object", "_actionData", "_distance", "_index", "_pos", "_cursorScreen _object = _this select 0; _actionData = _this select 1; -_distance = _actionData select 5; _index = _this select 2; +_angles = _this select 3; -if((count _this) > 3) then { - _pos = _this select 3; +_distance = _actionData select 5; +EXPLODE_2_PVT(_angles,_centerAngle,_maxAngleSpan); + +if((count _this) > 4) then { + _pos = _this select 4; } else { if(typeName (_actionData select 2) == "ARRAY") then { _pos = _object modelToWorld (_actionData select 2); @@ -20,8 +23,8 @@ if((count _this) > 3) then { _cursorScreenPos = (positionCameraToWorld [0, 0, 0]); if(_cursorScreenPos distance _pos <= _distance) then { _path = []; - if((count _this) > 4) then { - _path = +(_this select 4); + if((count _this) > 5) then { + _path = +(_this select 5); }; _menuDepth = (count GVAR(menuDepthPath)); @@ -37,27 +40,46 @@ if(_cursorScreenPos distance _pos <= _distance) then { _currentRenderDepth = GVAR(renderDepth); GVAR(renderDepth) = GVAR(renderDepth) + 1; if(_index == (GVAR(menuDepthPath) select (GVAR(renderDepth)-1))) then { - _radialOffset = 0; + // Count how many actions are active + private "_numActions"; + _numActions = 0; { - // if(_index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { - this = _object; - _target = _object; - _player = ACE_player; - _active = [_object, ACE_player] call (_x select 4); - // diag_log text format["_active: %1: %2", (_x select 0), _active]; - if(_active) then { - _offset = [GVAR(vecLineMap), (270*(GVAR(renderDepth)%2))-(_radialOffset*45)] call FUNC(rotateVectLine); - _mod = 0.1*_distance; - _newPos = [ - (_pos select 0) + ((_offset select 0)*_mod), - (_pos select 1) + ((_offset select 1)*_mod), - (_pos select 2) + ((_offset select 2)*_mod) - ]; - // drawLine3D [_pos, _newPos, [1,0,0,1]]; - [_object, _x, _forEachIndex, _newPos, _path] call FUNC(renderMenu); - _radialOffset = _radialOffset + 1; - }; - // }; + this = _object; + _target = _object; + _player = ACE_player; + _active = [_object, ACE_player] call (_x select 4); + if(_active) then { + _numActions = _numActions + 1; + }; + } forEach (_actionData select 6); + systemChat format ["_numActions: %1", _numActions]; + + private "_angleSpan"; + _angleSpan = _maxAngleSpan min (35 * (_numActions - 1)); + + private "_angle"; + _angle = _centerAngle - _angleSpan / 2; + { + // if(_index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { + this = _object; + _target = _object; + _player = ACE_player; + _active = [_object, ACE_player] call (_x select 4); + // diag_log text format["_active: %1: %2", (_x select 0), _active]; + if(_active) then { + systemChat format ["_angle: %1", _angle]; + _offset = [GVAR(vecLineMap), _angle] call FUNC(rotateVectLine); + _mod = 0.4 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; + _newPos = [ + (_pos select 0) + ((_offset select 0)*_mod), + (_pos select 1) + ((_offset select 1)*_mod), + (_pos select 2) + ((_offset select 2)*_mod) + ]; + // drawLine3D [_pos, _newPos, [1,0,0,1]]; + [_object, _x, _forEachIndex, [_angle, 180], _newPos, _path] call FUNC(renderMenu); + _angle = _angle + _angleSpan / (_numActions); + }; + // }; } forEach (_actionData select 6); }; GVAR(renderDepth) = GVAR(renderDepth) - 1; From d05531566120e4705d72c852fc33936f88ff8a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 10:49:36 -0300 Subject: [PATCH 113/166] interact_menu: tab to space --- .../functions/fnc_compileMenu.sqf | 4 +- .../interact_menu/functions/fnc_keyDown.sqf | 4 +- .../functions/fnc_keyDownSelfAction.sqf | 8 +- addons/interact_menu/functions/fnc_keyUp.sqf | 4 +- .../functions/fnc_keyUpSelfAction.sqf | 4 +- addons/interact_menu/functions/fnc_probe.sqf | 2 +- addons/interact_menu/functions/fnc_render.sqf | 174 +++++++++--------- .../functions/fnc_renderIcon.sqf | 20 +- .../functions/fnc_renderMenu.sqf | 125 +++++++------ 9 files changed, 172 insertions(+), 173 deletions(-) diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 1b5e803ad6..647a78c7b2 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -77,7 +77,7 @@ _recurseFnc = { _children, GVAR(uidCounter) ]; - GVAR(uidCounter) = GVAR(uidCounter) + 1; + GVAR(uidCounter) = GVAR(uidCounter) + 1; _actions pushBack _entry; }; }; @@ -97,6 +97,6 @@ _actions = [[ GVAR(uidCounter) ] ]; -GVAR(uidCounter) = GVAR(uidCounter) + 1; +GVAR(uidCounter) = GVAR(uidCounter) + 1; _object setVariable [QUOTE(GVAR(actionData)), _actions]; \ No newline at end of file diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index e18ec69ae8..fdd39e7dc8 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -2,7 +2,7 @@ #include "script_component.hpp" if(!GVAR(keyDown)) then { - GVAR(keyDown) = true; - GVAR(keyDownTime) = diag_tickTime; + GVAR(keyDown) = true; + GVAR(keyDownTime) = diag_tickTime; }; true diff --git a/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf b/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf index b44fed6457..8e86cfd430 100644 --- a/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf @@ -2,10 +2,10 @@ #include "script_component.hpp" if(!GVAR(keyDownSelfAction)) then { - GVAR(keyDownSelfAction) = true; - GVAR(keyDown) = false; - GVAR(keyDownTime) = diag_tickTime; + GVAR(keyDownSelfAction) = true; + GVAR(keyDown) = false; + GVAR(keyDownTime) = diag_tickTime; - GVAR(selfMenuOffset) = [sin getDir ACE_player, cos getDir ACE_player, 0] vectorMultiply 2; + GVAR(selfMenuOffset) = [sin getDir ACE_player, cos getDir ACE_player, 0] vectorMultiply 2; }; true diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 413fff11ad..922a5dedce 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -3,10 +3,10 @@ GVAR(keyDown) = false; if(GVAR(actionSelected)) then { - this = GVAR(selectedTarget); + this = GVAR(selectedTarget); _player = ACE_Player; _target = GVAR(selectedTarget); - [GVAR(selectedTarget), player] call GVAR(selectedAction); + [GVAR(selectedTarget), player] call GVAR(selectedAction); }; GVAR(expanded) = false; GVAR(lastPath) = []; diff --git a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf index 0029e3bd05..b0023300bf 100644 --- a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf @@ -3,10 +3,10 @@ GVAR(keyDownSelfAction) = false; if(GVAR(actionSelected)) then { - this = GVAR(selectedTarget); + this = GVAR(selectedTarget); _player = ACE_Player; _target = GVAR(selectedTarget); - [GVAR(selectedTarget), player] call GVAR(selectedAction); + [GVAR(selectedTarget), player] call GVAR(selectedAction); }; GVAR(expanded) = false; GVAR(lastPath) = []; diff --git a/addons/interact_menu/functions/fnc_probe.sqf b/addons/interact_menu/functions/fnc_probe.sqf index 1f178180be..c7386c9bc6 100644 --- a/addons/interact_menu/functions/fnc_probe.sqf +++ b/addons/interact_menu/functions/fnc_probe.sqf @@ -9,7 +9,7 @@ if(!GVAR(keyDown)) then { { _actionObject = _x; _actionData = _actionObject getVariable [QUOTE(GVAR(actionData)), []]; - + if((count _actionData) > 0) then { _renderData = []; { diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index a4b699aab3..a6795e50a0 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -7,107 +7,107 @@ _cursorPos1 = positionCameraToWorld [0, 0, 0]; _cursorPos2 = positionCameraToWorld [0, 0, 2]; GVAR(currentOptions) = []; if((count GVAR(toRender)) > 0 && (GVAR(keyDown) || GVAR(keyDownSelfAction))) then { - if((count GVAR(vecLineMap)) == 0 || ((count GVAR(menuDepthPath)) > 0 && (getPosASL player) distance GVAR(lastPos) > 0.01)) then { - GVAR(lastPos) = getPosASL player; - _cursorVec = [_cursorPos2, _cursorPos1] call BIS_fnc_vectorFromXtoY; - _p1 = [0,0,0]; - _p2 = +_cursorVec; - _p = (_cursorVec call CBA_fnc_vect2polar); - _v = [(_p select 0), (_p select 1), (_p select 2)+90] call CBA_fnc_polar2vect; - _cp = [_cursorVec, _v] call BIS_fnc_crossProduct; + if((count GVAR(vecLineMap)) == 0 || ((count GVAR(menuDepthPath)) > 0 && (getPosASL player) distance GVAR(lastPos) > 0.01)) then { + GVAR(lastPos) = getPosASL player; + _cursorVec = [_cursorPos2, _cursorPos1] call BIS_fnc_vectorFromXtoY; + _p1 = [0,0,0]; + _p2 = +_cursorVec; + _p = (_cursorVec call CBA_fnc_vect2polar); + _v = [(_p select 0), (_p select 1), (_p select 2)+90] call CBA_fnc_polar2vect; + _cp = [_cursorVec, _v] call BIS_fnc_crossProduct; - GVAR(vecLineMap) = [_cp, _p1, _p2] call FUNC(rotateVectLineGetMap); - }; - if (GVAR(keyDown)) then { - // Render all nearby interaction menus - { - if(!(_forEachIndex in GVAR(filter))) then { - GVAR(renderDepth) = 0; - _renderTargets = _x; - { - [_renderTargets select 0, _x, 0, [270, 360]] call FUNC(renderMenu); - } forEach (_renderTargets select 1); - }; - } forEach GVAR(toRender); - } else { - // Render only the self action menu - _actions = (ACE_player getVariable QGVAR(selfActionData)) select 0; - _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset) vectorAdd [0,0,0.25]; - [ACE_player, _actions, 0, [270, 360], _pos] call FUNC(renderMenu); - }; + GVAR(vecLineMap) = [_cp, _p1, _p2] call FUNC(rotateVectLineGetMap); + }; + if (GVAR(keyDown)) then { + // Render all nearby interaction menus + { + if(!(_forEachIndex in GVAR(filter))) then { + GVAR(renderDepth) = 0; + _renderTargets = _x; + { + [_renderTargets select 0, _x, 0, [270, 360]] call FUNC(renderMenu); + } forEach (_renderTargets select 1); + }; + } forEach GVAR(toRender); + } else { + // Render only the self action menu + _actions = (ACE_player getVariable QGVAR(selfActionData)) select 0; + _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset) vectorAdd [0,0,0.25]; + [ACE_player, _actions, 0, [270, 360], _pos] call FUNC(renderMenu); + }; - // player sideChat format["c: %1", count GVAR(toRender)]; + // player sideChat format["c: %1", count GVAR(toRender)]; }; if(GVAR(keyDown) || GVAR(keyDownSelfAction)) then { - _cursorScreenPos = worldToScreen _cursorPos2; - _closestDistance = 1000000; - _closestSelection = -1; - { - _pos = _x select 1; - _sPos = worldToScreen _pos; - if(count _sPos > 0) then { - _disSq = (((_cursorScreenPos select 0) - (_sPos select 0))^2 + ((_cursorScreenPos select 1) - (_sPos select 1))^2); - if(_disSq < 0.0125 && _disSq < _closestDistance) then { - _closestDistance = _disSq; - _closestSelection = _forEachIndex; - }; - }; - } forEach GVAR(currentOptions); + _cursorScreenPos = worldToScreen _cursorPos2; + _closestDistance = 1000000; + _closestSelection = -1; + { + _pos = _x select 1; + _sPos = worldToScreen _pos; + if(count _sPos > 0) then { + _disSq = (((_cursorScreenPos select 0) - (_sPos select 0))^2 + ((_cursorScreenPos select 1) - (_sPos select 1))^2); + if(_disSq < 0.0125 && _disSq < _closestDistance) then { + _closestDistance = _disSq; + _closestSelection = _forEachIndex; + }; + }; + } forEach GVAR(currentOptions); - if(_closestSelection != -1) then { + if(_closestSelection != -1) then { - _closest = GVAR(currentOptions) select _closestSelection; + _closest = GVAR(currentOptions) select _closestSelection; - _pos = _closest select 1; - _cTime = diag_tickTime; - _delta = _cTime - GVAR(lastTime); - GVAR(lastTime) = _cTime; - GVAR(rotationAngle) = GVAR(rotationAngle) + (180*_delta); - if(GVAR(rotationAngle) > 360) then { - GVAR(rotationAngle) = GVAR(rotationAngle) - 360; - }; - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,.75], _pos, 0.6*SafeZoneW, 0.6*SafeZoneW, GVAR(rotationAngle), "", 0.5, 0.025, "TahomaB"]; - _foundTarget = true; - GVAR(actionSelected) = true; - GVAR(selectedTarget) = (_closest select 0) select 0; - GVAR(selectedAction) = ((_closest select 0) select 1) select 3; - _misMatch = false; - _hoverPath = (_closest select 2); - if((count GVAR(lastPath)) != (count _hoverPath)) then { - _misMatch = true; - } else { - { - if(_x != (_hoverPath select _forEachIndex)) exitWith { - _misMatch = true; - }; - } forEach GVAR(lastPath); - }; + _pos = _closest select 1; + _cTime = diag_tickTime; + _delta = _cTime - GVAR(lastTime); + GVAR(lastTime) = _cTime; + GVAR(rotationAngle) = GVAR(rotationAngle) + (180*_delta); + if(GVAR(rotationAngle) > 360) then { + GVAR(rotationAngle) = GVAR(rotationAngle) - 360; + }; + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,.75], _pos, 0.6*SafeZoneW, 0.6*SafeZoneW, GVAR(rotationAngle), "", 0.5, 0.025, "TahomaB"]; + _foundTarget = true; + GVAR(actionSelected) = true; + GVAR(selectedTarget) = (_closest select 0) select 0; + GVAR(selectedAction) = ((_closest select 0) select 1) select 3; + _misMatch = false; + _hoverPath = (_closest select 2); + if((count GVAR(lastPath)) != (count _hoverPath)) then { + _misMatch = true; + } else { + { + if(_x != (_hoverPath select _forEachIndex)) exitWith { + _misMatch = true; + }; + } forEach GVAR(lastPath); + }; - if(_misMatch) then { - GVAR(lastPath) = _hoverPath; - GVAR(startHoverTime) = diag_tickTime; - GVAR(expanded) = false; - } else { - if(!GVAR(expanded) && diag_tickTime-GVAR(startHoverTime) > 0.25) then { - GVAR(expanded) = true; - GVAR(menuDepthPath) = +GVAR(lastPath); - }; - }; - }; - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selected_ca.paa", [1,0,0,1], _cursorPos2, 1, 1, 0, "", 0.5, 0.025, "TahomaB"]; + if(_misMatch) then { + GVAR(lastPath) = _hoverPath; + GVAR(startHoverTime) = diag_tickTime; + GVAR(expanded) = false; + } else { + if(!GVAR(expanded) && diag_tickTime-GVAR(startHoverTime) > 0.25) then { + GVAR(expanded) = true; + GVAR(menuDepthPath) = +GVAR(lastPath); + }; + }; + }; + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selected_ca.paa", [1,0,0,1], _cursorPos2, 1, 1, 0, "", 0.5, 0.025, "TahomaB"]; }; if(!_foundTarget && GVAR(actionSelected)) then { - GVAR(actionSelected) = false; - GVAR(expanded) = false; - GVAR(lastPath) = []; - if(!GVAR(keyDown)) then { - GVAR(vecLineMap) = []; - }; + GVAR(actionSelected) = false; + GVAR(expanded) = false; + GVAR(lastPath) = []; + if(!GVAR(keyDown)) then { + GVAR(vecLineMap) = []; + }; }; for "_i" from GVAR(iconCount) to (count GVAR(iconCtrls))-1 do { - ctrlDelete (GVAR(iconCtrls) select _i); + ctrlDelete (GVAR(iconCtrls) select _i); }; GVAR(iconCtrls) resize GVAR(iconCount); GVAR(iconCount) = 0; diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 30821ffdac..4aa5e29aff 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -9,18 +9,18 @@ _icon = _this select 6; _sPos = worldToScreen _pos; // _sPos = _pos; if(count _sPos > 0) then { - // player sideChat format["render!"]; - if(GVAR(iconCount) > (count GVAR(iconCtrls))-1) then { - GVAR(iconCtrls) pushBack ((findDisplay 46) ctrlCreate ["RscStructuredText", 54021+GVAR(iconCount)]); - }; - _ctrl = GVAR(iconCtrls) select GVAR(iconCount); - GVAR(iconCount) = GVAR(iconCount) + 1; + // player sideChat format["render!"]; + if(GVAR(iconCount) > (count GVAR(iconCtrls))-1) then { + GVAR(iconCtrls) pushBack ((findDisplay 46) ctrlCreate ["RscStructuredText", 54021+GVAR(iconCount)]); + }; + _ctrl = GVAR(iconCtrls) select GVAR(iconCount); + GVAR(iconCount) = GVAR(iconCount) + 1; if(_icon == "") then { _icon = DEFAULT_ICON; }; _text = format ["%3", _icon, _color, _text]; - _ctrl ctrlSetStructuredText (parseText _text); - _ctrl ctrlSetPosition [(_sPos select 0)-(0.011*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.025*SafeZoneW]; - // _ctrl ctrlSetBackgroundColor [1,0,0,1]; - _ctrl ctrlCommit 0; + _ctrl ctrlSetStructuredText (parseText _text); + _ctrl ctrlSetPosition [(_sPos select 0)-(0.011*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.025*SafeZoneW]; + // _ctrl ctrlSetBackgroundColor [1,0,0,1]; + _ctrl ctrlCommit 0; }; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 3510037b0b..1072a53906 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -12,75 +12,74 @@ _distance = _actionData select 5; EXPLODE_2_PVT(_angles,_centerAngle,_maxAngleSpan); if((count _this) > 4) then { - _pos = _this select 4; + _pos = _this select 4; } else { - if(typeName (_actionData select 2) == "ARRAY") then { - _pos = _object modelToWorld (_actionData select 2); - } else { - _pos = _object modelToWorld (_object selectionPosition (_actionData select 2)); - }; + if(typeName (_actionData select 2) == "ARRAY") then { + _pos = _object modelToWorld (_actionData select 2); + } else { + _pos = _object modelToWorld (_object selectionPosition (_actionData select 2)); + }; }; _cursorScreenPos = (positionCameraToWorld [0, 0, 0]); if(_cursorScreenPos distance _pos <= _distance) then { - _path = []; - if((count _this) > 5) then { - _path = +(_this select 5); - }; - _menuDepth = (count GVAR(menuDepthPath)); + _path = []; + if((count _this) > 5) then { + _path = +(_this select 5); + }; + _menuDepth = (count GVAR(menuDepthPath)); - _color = "#FFFFFFFF"; // ARGB Color (First Hex Pair is transparancy) - if(_menuDepth > 0 && _index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { + // ARGB Color (First Hex Pair is transparancy) + _color = "#FFFFFFFF"; + if(_menuDepth > 0 && _index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { _color = format ["#%1FFFFFF", [255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25)] call EFUNC(common,toHex)]; - }; - _path set[(count _path), _index]; - // player sideChat format["r: %1", _actionData select 2]; - [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); - GVAR(currentOptions) set[(count GVAR(currentOptions)), [_this, _pos, _path]]; - _currentRenderDepth = -1; - _currentRenderDepth = GVAR(renderDepth); - GVAR(renderDepth) = GVAR(renderDepth) + 1; - if(_index == (GVAR(menuDepthPath) select (GVAR(renderDepth)-1))) then { - // Count how many actions are active - private "_numActions"; - _numActions = 0; - { - this = _object; - _target = _object; - _player = ACE_player; - _active = [_object, ACE_player] call (_x select 4); - if(_active) then { - _numActions = _numActions + 1; - }; - } forEach (_actionData select 6); - systemChat format ["_numActions: %1", _numActions]; + }; + _path set[(count _path), _index]; + // player sideChat format["r: %1", _actionData select 2]; + [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); + GVAR(currentOptions) set[(count GVAR(currentOptions)), [_this, _pos, _path]]; + _currentRenderDepth = -1; + _currentRenderDepth = GVAR(renderDepth); + GVAR(renderDepth) = GVAR(renderDepth) + 1; + if(_index == (GVAR(menuDepthPath) select (GVAR(renderDepth)-1))) then { + // Count how many actions are active + private "_numActions"; + _numActions = 0; + { + this = _object; + _target = _object; + _player = ACE_player; + _active = [_object, ACE_player] call (_x select 4); + if(_active) then { + _numActions = _numActions + 1; + }; + } forEach (_actionData select 6); + systemChat format ["_numActions: %1", _numActions]; - private "_angleSpan"; - _angleSpan = _maxAngleSpan min (35 * (_numActions - 1)); + private "_angleSpan"; + _angleSpan = _maxAngleSpan min (35 * (_numActions - 1)); - private "_angle"; - _angle = _centerAngle - _angleSpan / 2; - { - // if(_index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { - this = _object; - _target = _object; - _player = ACE_player; - _active = [_object, ACE_player] call (_x select 4); - // diag_log text format["_active: %1: %2", (_x select 0), _active]; - if(_active) then { - systemChat format ["_angle: %1", _angle]; - _offset = [GVAR(vecLineMap), _angle] call FUNC(rotateVectLine); - _mod = 0.4 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; - _newPos = [ - (_pos select 0) + ((_offset select 0)*_mod), - (_pos select 1) + ((_offset select 1)*_mod), - (_pos select 2) + ((_offset select 2)*_mod) - ]; - // drawLine3D [_pos, _newPos, [1,0,0,1]]; - [_object, _x, _forEachIndex, [_angle, 180], _newPos, _path] call FUNC(renderMenu); - _angle = _angle + _angleSpan / (_numActions); - }; - // }; - } forEach (_actionData select 6); - }; - GVAR(renderDepth) = GVAR(renderDepth) - 1; + private "_angle"; + _angle = _centerAngle - _angleSpan / 2; + { + this = _object; + _target = _object; + _player = ACE_player; + _active = [_object, ACE_player] call (_x select 4); + // diag_log text format["_active: %1: %2", (_x select 0), _active]; + if(_active) then { + systemChat format ["_angle: %1", _angle]; + _offset = [GVAR(vecLineMap), _angle] call FUNC(rotateVectLine); + _mod = 0.4 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; + _newPos = [ + (_pos select 0) + ((_offset select 0)*_mod), + (_pos select 1) + ((_offset select 1)*_mod), + (_pos select 2) + ((_offset select 2)*_mod) + ]; + // drawLine3D [_pos, _newPos, [1,0,0,1]]; + [_object, _x, _forEachIndex, [_angle, 180], _newPos, _path] call FUNC(renderMenu); + _angle = _angle + _angleSpan / (_numActions); + }; + } forEach (_actionData select 6); + }; + GVAR(renderDepth) = GVAR(renderDepth) - 1; }; From 96404bc42a0bacf839cf73bcbc15ac056ae0f517 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Thu, 19 Feb 2015 15:59:14 +0200 Subject: [PATCH 114/166] Fixed isNull check not working. Fixed audio not being found. --- .../functions/fnc_addCellphoneIED.sqf | 2 +- addons/explosives/functions/fnc_dialPhone.sqf | 6 +- .../explosives/functions/fnc_dialingPhone.sqf | 10 +- .../functions/fnc_getSpeedDialExplosive.sqf | 13 +- .../functions/fnc_place_Approve.sqf | 133 +++++++++--------- 5 files changed, 81 insertions(+), 83 deletions(-) diff --git a/addons/explosives/functions/fnc_addCellphoneIED.sqf b/addons/explosives/functions/fnc_addCellphoneIED.sqf index 49bec07f1b..84cb57cf4e 100644 --- a/addons/explosives/functions/fnc_addCellphoneIED.sqf +++ b/addons/explosives/functions/fnc_addCellphoneIED.sqf @@ -38,7 +38,7 @@ while {!_codeSet} do { _code = "0" + _code; _count = _count - 1; }; - _codeSet = (isNull [objNull,_code] call FUNC(getSpeedDialExplosive)); + _codeSet = (count ([_code] call FUNC(getSpeedDialExplosive))) == 0; }; if (isNil QGVAR(CellphoneIEDs)) then { GVAR(CellphoneIEDs) = []; diff --git a/addons/explosives/functions/fnc_dialPhone.sqf b/addons/explosives/functions/fnc_dialPhone.sqf index 58d3dab716..41b2a4a4f7 100644 --- a/addons/explosives/functions/fnc_dialPhone.sqf +++ b/addons/explosives/functions/fnc_dialPhone.sqf @@ -31,10 +31,10 @@ if (_unit == ace_player) then { [FUNC(dialingPhone), 0.25, [_unit,4,_arr,_code]] call CALLSTACK(CBA_fnc_addPerFrameHandler); } else { private ["_explosive"]; - _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); - if (!isNull (_explosive)) then { + _explosive = [_code] call FUNC(getSpeedDialExplosive); + if ((count _explosive) > 0) then { [{ - playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_this select 1),3.16228,1,75]; + playSound3D [QUOTE(PATHTO_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_this select 1),3.16228,1,75]; (_this select 0) setVariable [QGVAR(Dialing), false, true]; }, [_unit,_explosive select 0], 0.25 * (count _arr - 4), 0] call EFUNC(common,waitAndExecute); [_explosive select 0,(0.25 * (count _arr - 1)) + (_explosive select 2)] call FUNC(startTimer); diff --git a/addons/explosives/functions/fnc_dialingPhone.sqf b/addons/explosives/functions/fnc_dialingPhone.sqf index 003fd734c1..d3c429c9fc 100644 --- a/addons/explosives/functions/fnc_dialingPhone.sqf +++ b/addons/explosives/functions/fnc_dialingPhone.sqf @@ -19,16 +19,16 @@ #include "script_component.hpp" EXPLODE_4_PVT(_this select 0,_unit,_i,_arr,_code); if ((_i mod 4) == 0) then { - playSound3D [QUOTE(PATHTOF_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; + playSound3D [QUOTE(PATHTO_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; }; ctrlSetText [1400,format["Calling%1",_arr select (_i - 4)]]; private "_explosive"; -_explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); +_explosive = [_code] call FUNC(getSpeedDialExplosive); if (_i >= (count _arr + 2)) then { [_this select 1] call CALLSTACK(cba_fnc_removePerFrameHandler); - if (!isNull (_explosive)) then { + if ((count _explosive) > 0) then { [_unit, -1, [_explosive select 0, _explosive select 2]] call FUNC(detonateExplosive); }; _unit setVariable [QGVAR(Dialing), false, true]; @@ -37,8 +37,8 @@ if (_i >= (count _arr + 2)) then { }; }; if (_i == (count _arr)) then { - if (!isNull (_explosive)) then { - playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_explosive select 0),3.16228,1,75]; + if ((count _explosive) > 0) then { + playSound3D [QUOTE(PATHTO_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_explosive select 0),3.16228,1,75]; }; }; (_this select 0) set [1, _i + 1]; diff --git a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf index c00f15b5ed..d6d5b57b3b 100644 --- a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf +++ b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf @@ -1,24 +1,23 @@ /* * Author: Garth 'L-H' de Wet - * Gets the explosive object or objNull from the speed dial entry. + * Gets the explosive from the speed dial entry. * * Arguments: - * 0: Unit - * 1: Speed dial entry + * 0: Speed dial entry * * Return Value: * Associated explosive (or ObjNull) * * Example: - * [ace_player, "2113"] call ace_explosives_fnc_getSpeedDialExplosive; + * ["2113"] call ace_explosives_fnc_getSpeedDialExplosive; * * Public: Yes */ #include "script_component.hpp" -EXPLODE_2_PVT(_this,_unit,_code); +EXPLODE_1_PVT(_this,_code); private ["_explosive"]; -if (isNil QGVAR(CellphoneIEDs)) exitWith {objNull}; -_explosive = objNull; +if (isNil QGVAR(CellphoneIEDs)) exitWith {[]}; +_explosive = []; { if ((_x select 1) == _code) exitWith { _explosive = _x; diff --git a/addons/explosives/functions/fnc_place_Approve.sqf b/addons/explosives/functions/fnc_place_Approve.sqf index 97528cb8f6..77cfbb92a1 100644 --- a/addons/explosives/functions/fnc_place_Approve.sqf +++ b/addons/explosives/functions/fnc_place_Approve.sqf @@ -28,79 +28,78 @@ _player = ACE_player; [_player, "DefaultAction", _player getVariable [QGVAR(Place), -1]] call EFUNC(Common,removeActionEventHandler); [_player, "MenuBack", _player getVariable [QGVAR(Cancel), -1]] call EFUNC(Common,removeActionEventHandler); call EFUNC(interaction,hideMouseHint); -if ((_setup getVariable [QGVAR(Class), ""]) != "") then { - _dir = (getDir _setup); - if (_dir > 180) then { - _dir = _dir - 180; - } else { - _dir = 180 + _dir; - }; - _setup setVariable [QGVAR(Direction), _dir]; - _player setVariable [QGVAR(PlantingExplosive), true]; - _setup addEventHandler ["EpeContactStart", { - if (!((_this select 0) getVariable [QGVAR(Handled), false])) then { - private ["_player", "_pos", "_attachTo"]; +if ((_setup getVariable [QGVAR(Class), ""]) == "") exitWith { + deleteVehicle _setup; +}; +_dir = (getDir _setup); +if (_dir > 180) then { + _dir = _dir - 180; +} else { + _dir = 180 + _dir; +}; +_setup setVariable [QGVAR(Direction), _dir]; +_player setVariable [QGVAR(PlantingExplosive), true]; +_setup addEventHandler ["EpeContactStart", { + if (!((_this select 0) getVariable [QGVAR(Handled), false])) then { + private ["_player", "_pos", "_attachTo"]; + _player = ACE_player; + _player setVariable [QGVAR(PlantingExplosive), false]; + _pos = getPosATL (_this select 0); + (_this select 0) enableSimulationGlobal false; + if (surfaceIsWater _pos) then { + _pos = getPosASL (_this select 0); + (_this select 0) setPosASL _pos; + }else{ + (_this select 0) setPosATL _pos; + }; + (_this select 0) setVariable [QGVAR(Handled), true]; + _attachTo = objNull; + if (!isNull (_this select 1) && {(_this select 1) isKindOf "AllVehicles"}) then { + _attachTo = (_this select 1); + }; + [(_this select 0),_attachTo, _pos] spawn { // TODO: Change to scheduled delay execution + private ["_mag", "_setup", "_dir", "_player"]; + _setup = _this select 0; _player = ACE_player; - _pos = getPosATL (_this select 0); - (_this select 0) enableSimulationGlobal false; - if (surfaceIsWater _pos) then { - _pos = getPosASL (_this select 0); - (_this select 0) setPosASL _pos; - }else{ - (_this select 0) setPosATL _pos; - }; - (_this select 0) setVariable [QGVAR(Handled), true]; - _player setVariable [QGVAR(PlantingExplosive), false]; - _attachTo = objNull; - if (!isNull (_this select 1) && {(_this select 1) isKindOf "AllVehicles"}) then { - _attachTo = (_this select 1); - }; - [(_this select 0),_attachTo, _pos] spawn { // TODO: Change to scheduled delay execution - private ["_mag", "_setup", "_dir", "_player"]; - _setup = _this select 0; - _player = ACE_player; - _mag = _setup getVariable [QGVAR(Class), ""]; - _dir = _setup getVariable [QGVAR(Direction), 0]; + _mag = _setup getVariable [QGVAR(Class), ""]; + _dir = _setup getVariable [QGVAR(Direction), 0]; - sleep getNumber(ConfigFile >> "CfgMagazines" >> _mag >> "ACE_DelayTime"); - _explosive = [_player, _this select 2, _dir, _mag, _setup getVariable QGVAR(Trigger), - [_setup getVariable QGVAR(Timer)], isNull (_this select 1)] call FUNC(placeExplosive); - deleteVehicle _setup; - if (!isNull(_explosive)) then { - _player RemoveMagazine _mag; - if (!isNull (_this select 1)) then { - _explosive attachTo [(_this select 1)]; - _dir = _dir - (getDir (_this select 1)); - [[_explosive, _dir, 0], QFUNC(setPosition)] call EFUNC(common,execRemoteFnc); - }; + sleep getNumber(ConfigFile >> "CfgMagazines" >> _mag >> "ACE_DelayTime"); + _explosive = [_player, _this select 2, _dir, _mag, _setup getVariable QGVAR(Trigger), + [_setup getVariable QGVAR(Timer)], isNull (_this select 1)] call FUNC(placeExplosive); + deleteVehicle _setup; + if (!isNull(_explosive)) then { + _player RemoveMagazine _mag; + if (!isNull (_this select 1)) then { + _explosive attachTo [(_this select 1)]; + _dir = _dir - (getDir (_this select 1)); + [[_explosive, _dir, 0], QFUNC(setPosition)] call EFUNC(common,execRemoteFnc); }; }; }; - }]; - _setup enableSimulationGlobal true; - _player playActionNow "MedicOther"; - [_setup] spawn { // TODO: Change to scheduled delay execution - private ["_setup", "_player"]; - _setup = _this select 0; - _player = ACE_player; - sleep 5; + }; +}]; +_setup enableSimulationGlobal true; +_player playActionNow "MedicOther"; +[_setup] spawn { // TODO: Change to scheduled delay execution + private ["_setup", "_player"]; + _setup = _this select 0; + _player = ACE_player; + sleep 5; + _player setVariable [QGVAR(PlantingExplosive), false]; + if (!isNull _setup) then { + private ["_mag", "_dir", "_delayTime"]; + _mag = _setup getVariable [QGVAR(Class), ""]; + _dir = _setup getVariable [QGVAR(Direction), 0]; + _delayTime = (getNumber(ConfigFile >> "CfgMagazines" >> _mag >> "ACE_DelayTime")) - 5; + if (_delayTime > 0) then { + sleep _delayTime; + }; if (!isNull _setup) then { - private ["_mag", "_dir", "_delayTime"]; - _mag = _setup getVariable [QGVAR(Class), ""]; - _dir = _setup getVariable [QGVAR(Direction), 0]; - _delayTime = (getNumber(ConfigFile >> "CfgMagazines" >> _mag >> "ACE_DelayTime")) - 5; - if (_delayTime > 0) then { - sleep _delayTime; - }; - if (!isNull _setup) then { - [_player, GetPosATL _setup, _dir, _mag, _setup getVariable QGVAR(Trigger), - [_setup getVariable QGVAR(Timer)], true] call FUNC(placeExplosive); - deleteVehicle _setup; - _player RemoveMagazine _mag; - _player setVariable [QGVAR(PlantingExplosive), false]; - }; + [_player, GetPosATL _setup, _dir, _mag, _setup getVariable QGVAR(Trigger), + [_setup getVariable QGVAR(Timer)], true] call FUNC(placeExplosive); + deleteVehicle _setup; + _player RemoveMagazine _mag; }; }; -}else{ - deleteVehicle _setup; }; From db5e8bcc3455a336a5072584a448c7f013538079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 12:01:47 -0300 Subject: [PATCH 115/166] Modify the opacity of icons along with that of the text --- addons/interact_menu/functions/fnc_renderIcon.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 4aa5e29aff..ad381f691d 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -6,6 +6,7 @@ _text = _this select 0; _color = _this select 1; _pos = _this select 2; _icon = _this select 6; + _sPos = worldToScreen _pos; // _sPos = _pos; if(count _sPos > 0) then { @@ -18,7 +19,7 @@ if(count _sPos > 0) then { if(_icon == "") then { _icon = DEFAULT_ICON; }; - _text = format ["%3", _icon, _color, _text]; + _text = format ["%4", _icon, _color, _color, _text]; _ctrl ctrlSetStructuredText (parseText _text); _ctrl ctrlSetPosition [(_sPos select 0)-(0.011*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.025*SafeZoneW]; // _ctrl ctrlSetBackgroundColor [1,0,0,1]; From a8797fe45adf4b5a8b30c98a8128d6f440e98a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 12:02:48 -0300 Subject: [PATCH 116/166] Fix for the angular spacing of submenus --- addons/interact_menu/functions/fnc_renderMenu.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 1072a53906..532762d41b 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -75,9 +75,9 @@ if(_cursorScreenPos distance _pos <= _distance) then { (_pos select 1) + ((_offset select 1)*_mod), (_pos select 2) + ((_offset select 2)*_mod) ]; - // drawLine3D [_pos, _newPos, [1,0,0,1]]; + // drawLine3D [_pos, _newPos, [1,0,0,0.5]]; [_object, _x, _forEachIndex, [_angle, 180], _newPos, _path] call FUNC(renderMenu); - _angle = _angle + _angleSpan / (_numActions); + _angle = _angle + _angleSpan / ((_numActions-1) max 1); }; } forEach (_actionData select 6); }; From 30943cbfd43be373bb4a0431b847225ae3f48783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 12:03:20 -0300 Subject: [PATCH 117/166] move the main menu actions to the right cuadrant --- addons/interact_menu/functions/fnc_render.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index a6795e50a0..4893d7e819 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -25,7 +25,7 @@ if((count GVAR(toRender)) > 0 && (GVAR(keyDown) || GVAR(keyDownSelfAction))) the GVAR(renderDepth) = 0; _renderTargets = _x; { - [_renderTargets select 0, _x, 0, [270, 360]] call FUNC(renderMenu); + [_renderTargets select 0, _x, 0, [180, 360]] call FUNC(renderMenu); } forEach (_renderTargets select 1); }; } forEach GVAR(toRender); @@ -33,7 +33,7 @@ if((count GVAR(toRender)) > 0 && (GVAR(keyDown) || GVAR(keyDownSelfAction))) the // Render only the self action menu _actions = (ACE_player getVariable QGVAR(selfActionData)) select 0; _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset) vectorAdd [0,0,0.25]; - [ACE_player, _actions, 0, [270, 360], _pos] call FUNC(renderMenu); + [ACE_player, _actions, 0, [180, 360], _pos] call FUNC(renderMenu); }; // player sideChat format["c: %1", count GVAR(toRender)]; From 1ea35548e0713cf2610475ec8186bcb879178a1a Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 18:40:40 +0100 Subject: [PATCH 118/166] Fixed ambiance sounds module. --- addons/missionmodules/CfgVehicles.hpp | 4 ++-- .../functions/fnc_moduleAmbianceSound.sqf | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/missionmodules/CfgVehicles.hpp b/addons/missionmodules/CfgVehicles.hpp index afdb58006b..92c379efb2 100644 --- a/addons/missionmodules/CfgVehicles.hpp +++ b/addons/missionmodules/CfgVehicles.hpp @@ -11,7 +11,7 @@ class CfgVehicles { displayName = "Ambiance Sounds [ACE]"; icon = QUOTE(PATHTOF(data\moduleSound.paa)); category = "ACE_missionModules"; - function = QUOTE(FUNC(moduleAmbianceSound); + function = QUOTE(FUNC(moduleAmbianceSound)); functionPriority = 1; isGlobal = 1; isTriggerActivated = 0; @@ -57,7 +57,7 @@ class CfgVehicles { displayName = "Volume"; description = "The volume of the sounds played"; typeName = "NUMBER"; - defaultValue = 0; + defaultValue = 1; }; }; class ModuleDescription { diff --git a/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf b/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf index 95153be8d1..943d795b7a 100644 --- a/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf +++ b/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf @@ -38,7 +38,7 @@ if (_activated && local _logic) then { _nilCheckPassedList = ""; { - _x = [_x] call EFUNC(common,removeWhiteSpace); + _x = [_x] call EFUNC(common,string_removeWhiteSpace); _splittedList set [_foreachIndex, _x]; }foreach _splittedList; @@ -61,21 +61,22 @@ if (_activated && local _logic) then { }foreach _ambianceSounds; [{ - private ["_args", "_logic", "_ambianceSounds", "_minimalDistance", "_maximalDistance", "_minDelayBetweensounds", "_maxDelayBetweenSounds", "_volume", "_followPlayers","_lastTimePlayed", "_newPos"] + private ["_args", "_logic", "_ambianceSounds", "_minimalDistance", "_maximalDistance", "_minDelayBetweensounds", "_maxDelayBetweenSounds", "_volume", "_followPlayers","_lastTimePlayed", "_newPos"]; _args = _this select 0; _logic = _args select 0; + _minDelayBetweensounds = _args select 4; + _maxDelayBetweenSounds = _args select 5; _lastTimePlayed = _args select 8; if (!alive _logic) exitwith { [(_this select 1)] call cba_fnc_removePerFrameHandler; }; - if (_lastTimePlayed - time >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { + if (time - _lastTimePlayed >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { _ambianceSounds = _args select 1; _minimalDistance = _args select 2; _maximalDistance = _args select 3; - _minDelayBetweensounds = _args select 4; - _maxDelayBetweenSounds = _args select 5; + _volume = _args select 6; _followPlayers = _args select 7; @@ -111,13 +112,12 @@ if (_activated && local _logic) then { // If no unit is to close to this position, we will play the sound. if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { - playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), ObjNull, false, _newPos, _volume, 1, 1000]; _args set [8, time]; }; }; }; - }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, time] ] call CBA_fnc_addPerFrameHandler; + }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, time] ] call cba_fnc_addPerFrameHandler; }; true; From af3709f481226ecba3c8d470ddc02047a813ab87 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 19:07:19 +0100 Subject: [PATCH 119/166] Fixed forgotten missionModules. --- addons/missionmodules/$PBOPREFIX$ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/missionmodules/$PBOPREFIX$ b/addons/missionmodules/$PBOPREFIX$ index ea1be0daee..6e7c7ebfc1 100644 --- a/addons/missionmodules/$PBOPREFIX$ +++ b/addons/missionmodules/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\addons\missionModules \ No newline at end of file +z\ace\addons\missionmodules \ No newline at end of file From 612fa69c1c4cf7ed8b81c5086dc90877d0eda400 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 19:12:14 +0100 Subject: [PATCH 120/166] Renamed string_removeWhiteSpace to stringRemoveWhiteSpace. --- addons/common/XEH_preInit.sqf | 2 +- ...ring_removeWhiteSpace.sqf => fnc_stringRemoveWhiteSpace.sqf} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename addons/common/functions/{fnc_string_removeWhiteSpace.sqf => fnc_stringRemoveWhiteSpace.sqf} (100%) diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 3710963c63..e193c81470 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -170,7 +170,7 @@ PREP(setVolume); PREP(sortAlphabeticallyBy); PREP(stringCompare); PREP(stringToColoredText); -PREP(string_removeWhiteSpace); +PREP(stringRemoveWhiteSpace); PREP(subString); PREP(switchToGroupSide); PREP(throttledPublicVariable); diff --git a/addons/common/functions/fnc_string_removeWhiteSpace.sqf b/addons/common/functions/fnc_stringRemoveWhiteSpace.sqf similarity index 100% rename from addons/common/functions/fnc_string_removeWhiteSpace.sqf rename to addons/common/functions/fnc_stringRemoveWhiteSpace.sqf From b0373de57632ae9ea1623f1757e73e457fa65279 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 19:14:52 +0100 Subject: [PATCH 121/166] Tabs to spaces --- .../functions/fnc_endRadioTransmission.sqf | 18 ++++----- addons/common/functions/fnc_exportConfig.sqf | 4 +- addons/common/functions/fnc_getGunner.sqf | 6 +-- addons/common/functions/fnc_getHitPoints.sqf | 34 ++++++++--------- .../fnc_getHitPointsWithSelections.sqf | 38 +++++++++---------- addons/common/functions/fnc_hashGet.sqf | 24 ++++++------ addons/common/functions/fnc_hashHasKey.sqf | 18 ++++----- .../functions/fnc_hashListCreateHash.sqf | 12 +++--- addons/common/functions/fnc_hashListPush.sqf | 12 +++--- .../common/functions/fnc_hashListSelect.sqf | 26 ++++++------- addons/common/functions/fnc_hashListSet.sqf | 24 ++++++------ addons/common/functions/fnc_hashRem.sqf | 34 ++++++++--------- addons/common/functions/fnc_hashSet.sqf | 28 +++++++------- .../common/functions/fnc_queueAnimation.sqf | 4 +- 14 files changed, 141 insertions(+), 141 deletions(-) diff --git a/addons/common/functions/fnc_endRadioTransmission.sqf b/addons/common/functions/fnc_endRadioTransmission.sqf index 990d4e03d8..772a34a06b 100644 --- a/addons/common/functions/fnc_endRadioTransmission.sqf +++ b/addons/common/functions/fnc_endRadioTransmission.sqf @@ -14,17 +14,17 @@ // ACRE if (isClass (configFile >> "CfgPatches" >> "acre_main")) then { - [-1] call acre_core_fnc_handleMultiPttKeyPressUp; - [0] call acre_core_fnc_handleMultiPttKeyPressUp; - [1] call acre_core_fnc_handleMultiPttKeyPressUp; - [2] call acre_core_fnc_handleMultiPttKeyPressUp; + [-1] call acre_core_fnc_handleMultiPttKeyPressUp; + [0] call acre_core_fnc_handleMultiPttKeyPressUp; + [1] call acre_core_fnc_handleMultiPttKeyPressUp; + [2] call acre_core_fnc_handleMultiPttKeyPressUp; }; // TFAR if (isClass (configFile >> "CfgPatches" >> "task_force_radio")) then { - call TFAR_fnc_onSwTangentReleased; - call TFAR_fnc_onAdditionalSwTangentReleased; - call TFAR_fnc_onLRTangentReleased; - call TFAR_fnc_onAdditionalLRTangentReleased; - call TFAR_fnc_onDDTangentReleased; + call TFAR_fnc_onSwTangentReleased; + call TFAR_fnc_onAdditionalSwTangentReleased; + call TFAR_fnc_onLRTangentReleased; + call TFAR_fnc_onAdditionalLRTangentReleased; + call TFAR_fnc_onDDTangentReleased; }; diff --git a/addons/common/functions/fnc_exportConfig.sqf b/addons/common/functions/fnc_exportConfig.sqf index 10c88d6bca..c298785c26 100644 --- a/addons/common/functions/fnc_exportConfig.sqf +++ b/addons/common/functions/fnc_exportConfig.sqf @@ -1,8 +1,8 @@ // by commy2 /* - usage: + usage: - (configFile >> "CfgAmmo") call FUNC(exportConfig); + (configFile >> "CfgAmmo") call FUNC(exportConfig); */ #include "script_component.hpp" diff --git a/addons/common/functions/fnc_getGunner.sqf b/addons/common/functions/fnc_getGunner.sqf index 0c82066e4b..71191083e0 100644 --- a/addons/common/functions/fnc_getGunner.sqf +++ b/addons/common/functions/fnc_getGunner.sqf @@ -20,9 +20,9 @@ private "_gunner"; _gunner = objNull; { - if (_weapon in (_vehicle weaponsTurret _x)) exitWith { - _gunner = _vehicle turretUnit _x; - }; + if (_weapon in (_vehicle weaponsTurret _x)) exitWith { + _gunner = _vehicle turretUnit _x; + }; } forEach allTurrets _vehicle; _gunner diff --git a/addons/common/functions/fnc_getHitPoints.sqf b/addons/common/functions/fnc_getHitPoints.sqf index a6d75e41b9..26b0b1b840 100644 --- a/addons/common/functions/fnc_getHitPoints.sqf +++ b/addons/common/functions/fnc_getHitPoints.sqf @@ -23,33 +23,33 @@ _hitpoints = []; private "_hitpointClasses"; _hitpointClasses = [_config >> "HitPoints"]; { - private "_class"; - _class = ([_config, _x] call FUNC(getTurretConfigPath)) >> "HitPoints"; + private "_class"; + _class = ([_config, _x] call FUNC(getTurretConfigPath)) >> "HitPoints"; - if (isClass _class) then { - _hitpointClasses pushBack _class; - }; + if (isClass _class) then { + _hitpointClasses pushBack _class; + }; } forEach allTurrets _vehicle; // iterate through all classes with hitpoints and their parents { - private "_class"; - _class = _x; + private "_class"; + _class = _x; - while {isClass _class} do { + while {isClass _class} do { - for "_i" from 0 to (count _class - 1) do { - private "_entry"; - _entry = configName (_class select _i); + for "_i" from 0 to (count _class - 1) do { + private "_entry"; + _entry = configName (_class select _i); - if (!(_entry in _hitpoints) && {!isNil {_vehicle getHitPointDamage _entry}}) then { - _hitpoints pushBack _entry; - }; - }; + if (!(_entry in _hitpoints) && {!isNil {_vehicle getHitPointDamage _entry}}) then { + _hitpoints pushBack _entry; + }; + }; - _class = inheritsFrom _class; - }; + _class = inheritsFrom _class; + }; } forEach _hitpointClasses; diff --git a/addons/common/functions/fnc_getHitPointsWithSelections.sqf b/addons/common/functions/fnc_getHitPointsWithSelections.sqf index e9a7a8fac5..f0c9801382 100644 --- a/addons/common/functions/fnc_getHitPointsWithSelections.sqf +++ b/addons/common/functions/fnc_getHitPointsWithSelections.sqf @@ -24,36 +24,36 @@ _selections = []; private "_hitpointClasses"; _hitpointClasses = [_config >> "HitPoints"]; { - private "_class"; - _class = ([_config, _x] call FUNC(getTurretConfigPath)) >> "HitPoints"; + private "_class"; + _class = ([_config, _x] call FUNC(getTurretConfigPath)) >> "HitPoints"; - if (isClass _class) then { - _hitpointClasses pushBack _class; - }; + if (isClass _class) then { + _hitpointClasses pushBack _class; + }; } forEach allTurrets _vehicle; // iterate through all classes with hitpoints and their parents { - private "_class"; - _class = _x; + private "_class"; + _class = _x; - while {isClass _class} do { + while {isClass _class} do { - for "_i" from 0 to (count _class - 1) do { - private ["_entry", "_selection"]; + for "_i" from 0 to (count _class - 1) do { + private ["_entry", "_selection"]; - _entry = configName (_class select _i); - _selection = getText (_class select _i >> "name"); + _entry = configName (_class select _i); + _selection = getText (_class select _i >> "name"); - if (!(_selection in _selections) && {!isNil {_vehicle getHit _selection}}) then { - _hitpoints pushBack _entry; - _selections pushBack _selection; - }; - }; + if (!(_selection in _selections) && {!isNil {_vehicle getHit _selection}}) then { + _hitpoints pushBack _entry; + _selections pushBack _selection; + }; + }; - _class = inheritsFrom _class; - }; + _class = inheritsFrom _class; + }; } forEach _hitpointClasses; diff --git a/addons/common/functions/fnc_hashGet.sqf b/addons/common/functions/fnc_hashGet.sqf index 6147d06a73..7682b2f6a2 100644 --- a/addons/common/functions/fnc_hashGet.sqf +++ b/addons/common/functions/fnc_hashGet.sqf @@ -9,18 +9,18 @@ _key = _this select 1; ERRORDATA(2); _val = nil; try { - if(VALIDHASH(_hash)) then { - _index = (_hash select 0) find _key; - if(_index != -1) then { - _val = (_hash select 1) select _index; - if(IS_STRING(_val) && {_val == "ACREHASHREMOVEDONOTUSETHISVAL"}) then { - _val = nil; - }; - }; - } else { - ERROR("Input hash is not valid"); - }; + if(VALIDHASH(_hash)) then { + _index = (_hash select 0) find _key; + if(_index != -1) then { + _val = (_hash select 1) select _index; + if(IS_STRING(_val) && {_val == "ACREHASHREMOVEDONOTUSETHISVAL"}) then { + _val = nil; + }; + }; + } else { + ERROR("Input hash is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; _val diff --git a/addons/common/functions/fnc_hashHasKey.sqf b/addons/common/functions/fnc_hashHasKey.sqf index d69ad2f3e8..8011e987fb 100644 --- a/addons/common/functions/fnc_hashHasKey.sqf +++ b/addons/common/functions/fnc_hashHasKey.sqf @@ -9,15 +9,15 @@ _key = _this select 1; ERRORDATA(2); _val = false; try { - if(VALIDHASH(_hash)) then { - _index = (_hash select 0) find _key; - if(_index != -1) then { - _val = true; - }; - } else { - ERROR("Input hash is not valid"); - }; + if(VALIDHASH(_hash)) then { + _index = (_hash select 0) find _key; + if(_index != -1) then { + _val = true; + }; + } else { + ERROR("Input hash is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; _val diff --git a/addons/common/functions/fnc_hashListCreateHash.sqf b/addons/common/functions/fnc_hashListCreateHash.sqf index fef9c79b85..cdad5987cd 100644 --- a/addons/common/functions/fnc_hashListCreateHash.sqf +++ b/addons/common/functions/fnc_hashListCreateHash.sqf @@ -7,12 +7,12 @@ _hashList = _this select 0; ERRORDATA(1); _hashKeys = []; try { - if(VALIDHASH(_hashList)) then { - _hashKeys = (_hashList select 0); - } else { - ERROR("Input hashlist is not valid"); - }; + if(VALIDHASH(_hashList)) then { + _hashKeys = (_hashList select 0); + } else { + ERROR("Input hashlist is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; [_hashKeys, []]; diff --git a/addons/common/functions/fnc_hashListPush.sqf b/addons/common/functions/fnc_hashListPush.sqf index e783f7c324..afd092a1b9 100644 --- a/addons/common/functions/fnc_hashListPush.sqf +++ b/addons/common/functions/fnc_hashListPush.sqf @@ -7,11 +7,11 @@ _hashList = _this select 0; _value = _this select 1; ERRORDATA(2); try { - if(VALIDHASH(_hashList)) then { - [_hashList, (count (_hashList select 1)), _value] call FUNC(hashListSet); - } else { - ERROR("Input hashlist in push not valid"); - }; + if(VALIDHASH(_hashList)) then { + [_hashList, (count (_hashList select 1)), _value] call FUNC(hashListSet); + } else { + ERROR("Input hashlist in push not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; diff --git a/addons/common/functions/fnc_hashListSelect.sqf b/addons/common/functions/fnc_hashListSelect.sqf index e1ee0aae0f..0c552d072e 100644 --- a/addons/common/functions/fnc_hashListSelect.sqf +++ b/addons/common/functions/fnc_hashListSelect.sqf @@ -8,20 +8,20 @@ _index = _this select 1; ERRORDATA(2); _hash = nil; try { - if(VALIDHASH(_hashList)) then { - _keys = _hashList select 0; - _hashes = _hashList select 1; - if(_index < (count _hashes)) then { - _values = _hashes select _index; + if(VALIDHASH(_hashList)) then { + _keys = _hashList select 0; + _hashes = _hashList select 1; + if(_index < (count _hashes)) then { + _values = _hashes select _index; - _hash = [_keys, _values, 1]; - } else { - ERROR("Index of hashlist is out of range"); - }; - } else { - ERROR("Input hashlist is not valid"); - }; + _hash = [_keys, _values, 1]; + } else { + ERROR("Index of hashlist is out of range"); + }; + } else { + ERROR("Input hashlist is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; _hash; diff --git a/addons/common/functions/fnc_hashListSet.sqf b/addons/common/functions/fnc_hashListSet.sqf index 8b7239dffd..c384bc15c9 100644 --- a/addons/common/functions/fnc_hashListSet.sqf +++ b/addons/common/functions/fnc_hashListSet.sqf @@ -8,17 +8,17 @@ _index = _this select 1; _value = _this select 2; ERRORDATA(3); try { - if(VALIDHASH(_hashList)) then { - if(VALIDHASH(_value)) then { - _vals = _value select 1; - - (_hashList select 1) set[_index, _vals]; - } else { - ERROR("Set hash in hashlist is not valid"); - }; - } else { - ERROR("Input hashlist is not valid"); - }; + if(VALIDHASH(_hashList)) then { + if(VALIDHASH(_value)) then { + _vals = _value select 1; + + (_hashList select 1) set[_index, _vals]; + } else { + ERROR("Set hash in hashlist is not valid"); + }; + } else { + ERROR("Input hashlist is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; diff --git a/addons/common/functions/fnc_hashRem.sqf b/addons/common/functions/fnc_hashRem.sqf index 86898fb3df..000dbbefe0 100644 --- a/addons/common/functions/fnc_hashRem.sqf +++ b/addons/common/functions/fnc_hashRem.sqf @@ -8,23 +8,23 @@ _key = _this select 1; ERRORDATA(2); _val = nil; try { - if(VALIDHASH(_hash)) then { - _index = (_hash select 0) find _key; - if(_index != -1) then { - (_hash select 1) set[_index, "ACREHASHREMOVEDONOTUSETHISVAL"]; - // is this hash is not part of a hash list? - // if it is we need to leave the keys intact. - if((count _hash) == 2) then { - // if this is a standalone hash then we can clean it up - (_hash select 0) set[_index, "ACREHASHREMOVEDONOTUSETHISVAL"]; - _hash set[0, ((_hash select 0) - ["ACREHASHREMOVEDONOTUSETHISVAL"])]; - _hash set[1, ((_hash select 1) - ["ACREHASHREMOVEDONOTUSETHISVAL"])]; - }; - }; - } else { - ERROR("Input hash is not valid"); - }; + if(VALIDHASH(_hash)) then { + _index = (_hash select 0) find _key; + if(_index != -1) then { + (_hash select 1) set[_index, "ACREHASHREMOVEDONOTUSETHISVAL"]; + // is this hash is not part of a hash list? + // if it is we need to leave the keys intact. + if((count _hash) == 2) then { + // if this is a standalone hash then we can clean it up + (_hash select 0) set[_index, "ACREHASHREMOVEDONOTUSETHISVAL"]; + _hash set[0, ((_hash select 0) - ["ACREHASHREMOVEDONOTUSETHISVAL"])]; + _hash set[1, ((_hash select 1) - ["ACREHASHREMOVEDONOTUSETHISVAL"])]; + }; + }; + } else { + ERROR("Input hash is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; true diff --git a/addons/common/functions/fnc_hashSet.sqf b/addons/common/functions/fnc_hashSet.sqf index 23438eaf83..0e374d5f12 100644 --- a/addons/common/functions/fnc_hashSet.sqf +++ b/addons/common/functions/fnc_hashSet.sqf @@ -9,19 +9,19 @@ _key = _this select 1; _val = _this select 2; ERRORDATA(3); try { - if(VALIDHASH(_hash)) then { - _index = (_hash select 0) find _key; - if(_index == -1) then { - _index = (_hash select 0) find "ACREHASHREMOVEDONOTUSETHISVAL"; - if(_index == -1) then { - _index = (count (_hash select 0)); - }; - (_hash select 0) set[_index, _key]; - }; - (_hash select 1) set[_index, _val]; - } else { - ERROR("Input hash is not valid"); - }; + if(VALIDHASH(_hash)) then { + _index = (_hash select 0) find _key; + if(_index == -1) then { + _index = (_hash select 0) find "ACREHASHREMOVEDONOTUSETHISVAL"; + if(_index == -1) then { + _index = (count (_hash select 0)); + }; + (_hash select 0) set[_index, _key]; + }; + (_hash select 1) set[_index, _val]; + } else { + ERROR("Input hash is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; diff --git a/addons/common/functions/fnc_queueAnimation.sqf b/addons/common/functions/fnc_queueAnimation.sqf index a489a46174..73f3dca109 100644 --- a/addons/common/functions/fnc_queueAnimation.sqf +++ b/addons/common/functions/fnc_queueAnimation.sqf @@ -4,7 +4,7 @@ terminate (missionNamespace getVariable [QGVAR(waitForAnimationHandle), scriptNull]); GVAR(waitForAnimationHandle) = _this spawn { - waitUntil {!([_this select 0] call FUNC(inTransitionAnim))}; + waitUntil {!([_this select 0] call FUNC(inTransitionAnim))}; - _this call FUNC(doAnimation); + _this call FUNC(doAnimation); }; From c8d4acfc81c81f246400ef85e07fd3120b888cf4 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 19:29:54 +0100 Subject: [PATCH 122/166] Refactored displayText to no longer use spawn. --- addons/common/functions/fnc_displayText.sqf | 38 +++++++++------------ 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/addons/common/functions/fnc_displayText.sqf b/addons/common/functions/fnc_displayText.sqf index c6a68cbab2..7121ef6813 100644 --- a/addons/common/functions/fnc_displayText.sqf +++ b/addons/common/functions/fnc_displayText.sqf @@ -18,36 +18,32 @@ #define DEFAULT_DELAY 2 #define DEFAULT_PRIORITY 0 -if (isNil QGVAR(lastHint)) then { - GVAR(lastHint) = [0, 0]; -}; - _this resize 4; -_this spawn { - private ["_text", "_sound", "_delay", "_priority", "_lastHintTime", "_lastHintPriority", "_time"]; +private ["_text", "_sound", "_delay", "_priority", "_lastHintTime", "_lastHintPriority", "_time"]; +_text = _this select 0; +_sound = _this select 1; +_delay = _this select 2; +_priority = _this select 3; - _text = _this select 0; - _sound = _this select 1; - _delay = _this select 2; - _priority = _this select 3; +if (isNil QGVAR(lastHint)) then { + GVAR(lastHint) = [0, 0]; +}; - _lastHintTime = GVAR(lastHint) select 0; - _lastHintPriority = GVAR(lastHint) select 1; +_lastHintTime = GVAR(lastHint) select 0; +_lastHintPriority = GVAR(lastHint) select 1; - if !(typeName _text in ["STRING", "TEXT"]) then {_text = str _text}; - if (isNil "_sound") then {_sound = DEFAULT_PLAY_SOUND}; - if (isNil "_delay") then {_delay = DEFAULT_DELAY}; - if (isNil "_priority") then {_priority = DEFAULT_PRIORITY}; +if !(typeName _text in ["STRING", "TEXT"]) then {_text = str _text}; +if (isNil "_sound") then {_sound = DEFAULT_PLAY_SOUND}; +if (isNil "_delay") then {_delay = DEFAULT_DELAY}; +if (isNil "_priority") then {_priority = DEFAULT_PRIORITY}; - _time = time; - if (_time > _lastHintTime + _delay || {_priority >= _lastHintPriority}) then { +_time = time; +if (_time > _lastHintTime + _delay || {_priority >= _lastHintPriority}) then { hintSilent _text; if (_sound) then {playSound "ACE_Sound_Click"}; GVAR(lastHint) set [0, _time]; GVAR(lastHint) set [1, _priority]; - sleep _delay; - if (_time == GVAR(lastHint) select 0) then {hintSilent ""}; - }; + [{if ((_this select 0) == GVAR(lastHint) select 0) then {hintSilent ""};}, [_time], _delay, 0] call FUNC(waitAndExecute); }; From 21199a4ee663f0f42178d84003f56c2c43ca92ad Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 19:32:49 +0100 Subject: [PATCH 123/166] Now uses BIS_fnc_rscLayer --- addons/common/functions/fnc_displayInformation.sqf | 7 ++----- addons/common/functions/fnc_displayMessage.sqf | 4 +--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/addons/common/functions/fnc_displayInformation.sqf b/addons/common/functions/fnc_displayInformation.sqf index 64a27b0e40..007e1c3e32 100644 --- a/addons/common/functions/fnc_displayInformation.sqf +++ b/addons/common/functions/fnc_displayInformation.sqf @@ -10,8 +10,6 @@ #include "script_component.hpp" -#define DISPLAY_LAYER 32547 - private["_title", "_content","_type","_display","_headerCtrl","_contentCtrl","_contentAmountOfChars","_pos","_icon","_iconCtrl"]; _title = [_this, 0, "",[""]] call BIS_fnc_Param; _content = [_this, 1, [""],[[""]]] call BIS_fnc_Param; @@ -19,7 +17,7 @@ _type = [_this, 2, 0, [0]] call BIS_fnc_Param; _icon = [_this, 3, "",[""]] call BIS_fnc_Param; if (_title != "") then { - DISPLAY_LAYER cutRsc ['ACE_RscDisplayInformation',"PLAIN"]; + ("ACE_RscDisplayInformation" call BIS_fnc_rscLayer) cutRsc ['ACE_RscDisplayInformation',"PLAIN"]; disableSerialization; _display = uiNamespace getvariable 'ACE_RscDisplayInformation'; @@ -62,6 +60,5 @@ if (_title != "") then { }; }; } else { - - DISPLAY_LAYER cutText ["","PLAIN"]; + ("ACE_RscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; }; \ No newline at end of file diff --git a/addons/common/functions/fnc_displayMessage.sqf b/addons/common/functions/fnc_displayMessage.sqf index 317de8b240..7b3274cfc4 100644 --- a/addons/common/functions/fnc_displayMessage.sqf +++ b/addons/common/functions/fnc_displayMessage.sqf @@ -10,15 +10,13 @@ #include "script_component.hpp" -#define DISPLAY_LAYER 546 - private["_title", "_content","_type","_display","_headerCtrl","_contentCtrl","_contentAmountOfChars","_pos"]; _title = [_this, 0, "",[""]] call BIS_fnc_Param; _content = [_this, 1, "",[""]] call BIS_fnc_Param; _type = [_this, 2, 0, [0]] call BIS_fnc_Param; if (_title != "" && _content != "") then { - DISPLAY_LAYER cutRsc ['ACE_RscDisplayMessage',"PLAIN"]; + ("ACE_RscDisplayMessage" call BIS_fnc_rscLayer) cutRsc ['ACE_RscDisplayMessage',"PLAIN"]; disableSerialization; _display = uiNamespace getvariable 'ACE_RscDisplayMessage'; From f7d5d615ee1cbc18aee5d2c259bec947114c639f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 15:36:27 -0300 Subject: [PATCH 124/166] allow actions to be defined for different selections --- addons/attach/CfgVehicles.hpp | 43 ++-- addons/captives/CfgVehicles.hpp | 173 ++++++++-------- .../functions/fnc_compileMenu.sqf | 36 ++-- addons/interact_menu/functions/fnc_probe.sqf | 1 + .../functions/fnc_renderIcon.sqf | 2 +- .../functions/fnc_renderMenu.sqf | 5 +- addons/interaction/CfgVehicles.hpp | 192 +++++++++--------- addons/interaction/stringtable.xml | 3 + addons/logistics_uavbattery/CfgVehicles.hpp | 4 +- addons/map/CfgVehicles.hpp | 14 +- addons/respawn/CfgVehicles.hpp | 111 ++++++---- addons/vehiclelock/CfgVehicles.hpp | 55 ++--- 12 files changed, 356 insertions(+), 283 deletions(-) diff --git a/addons/attach/CfgVehicles.hpp b/addons/attach/CfgVehicles.hpp index 1cd65127a6..b681c0f7f7 100644 --- a/addons/attach/CfgVehicles.hpp +++ b/addons/attach/CfgVehicles.hpp @@ -1,25 +1,30 @@ #define MACRO_ATTACHTOVEHICLE \ class ACE_Actions { \ - class GVAR(AttachVehicle) { \ - displayName = "$STR_ACE_Attach_AttachDetach"; \ - condition = QUOTE(([ARR_3(_player, _target, '')] call FUNC(canAttach))); \ - statement = QUOTE( [ARR_2(_player, _target)] call FUNC(openAttachUI);); \ - exceptions[] = {"ACE_Drag_isNotDragging"}; \ - showDisabled = 0; \ - priority = 0; \ - icon = PATHTOF(UI\attach_ca.paa); \ - distance = 4; \ - }; \ - class GVAR(DetachVehicle) { \ - displayName = "$STR_ACE_Attach_Detach"; \ - condition = QUOTE(([ARR_2(_player, _target)] call FUNC(canDetach))); \ - statement = QUOTE( [ARR_2(_player, _target)] call FUNC(detach) ); \ - exceptions[] = {"ACE_Drag_isNotDragging"}; \ - showDisabled = 0; \ - priority = 0; \ - icon = PATHTOF(UI\detach_ca.paa); \ - distance = 4; \ + class ACE_MainActions { \ + selection = ""; \ + distance = 5; \ + condition = "true"; \ + class GVAR(AttachVehicle) { \ + displayName = "$STR_ACE_Attach_AttachDetach"; \ + condition = QUOTE(([ARR_3(_player, _target, '')] call FUNC(canAttach))); \ + statement = QUOTE( [ARR_2(_player, _target)] call FUNC(openAttachUI);); \ + exceptions[] = {"ACE_Drag_isNotDragging"}; \ + showDisabled = 0; \ + priority = 0; \ + icon = PATHTOF(UI\attach_ca.paa); \ + distance = 4; \ + }; \ + class GVAR(DetachVehicle) { \ + displayName = "$STR_ACE_Attach_Detach"; \ + condition = QUOTE(([ARR_2(_player, _target)] call FUNC(canDetach))); \ + statement = QUOTE( [ARR_2(_player, _target)] call FUNC(detach) ); \ + exceptions[] = {"ACE_Drag_isNotDragging"}; \ + showDisabled = 0; \ + priority = 0; \ + icon = PATHTOF(UI\detach_ca.paa); \ + distance = 4; \ + }; \ }; \ }; diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index d292402bcf..57f9644a4a 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -2,70 +2,78 @@ class CfgVehicles { class Man; class CAManBase: Man { class ACE_Actions { - class ACE_ApplyHandcuffs { - displayName = "$STR_ACE_Captives_SetCaptive"; - distance = 4; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doApplyHandcuffs)); - exceptions[] = {}; - showDisabled = 0; - priority = 2.4; - icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); - hotkey = "C"; + class ACE_RightHandActions { + selection = "righthand"; + displayName = "Right hand"; + distance = 5; + condition = QUOTE(([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs)) || ([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs))); + class ACE_ApplyHandcuffs { + displayName = "$STR_ACE_Captives_SetCaptive"; + distance = 4; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doApplyHandcuffs)); + exceptions[] = {}; + showDisabled = 0; + priority = 2.4; + icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); + hotkey = "C"; + }; + class ACE_RemoveHandcuffs { + displayName = "$STR_ACE_Captives_ReleaseCaptive"; + distance = 4; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs)); + exceptions[] = {}; + showDisabled = 0; + priority = 2.4; + icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); + hotkey = "R"; + }; }; - class ACE_RemoveHandcuffs { - displayName = "$STR_ACE_Captives_ReleaseCaptive"; - distance = 4; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs)); - exceptions[] = {}; - showDisabled = 0; - priority = 2.4; - icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); - hotkey = "R"; - }; - class ACE_EscortCaptive { - displayName = "$STR_ACE_Captives_EscortCaptive"; - distance = 4; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canEscortCaptive)); - statement = QUOTE([ARR_3(_player, _target, true)] call FUNC(doEscortCaptive)); - exceptions[] = {}; - showDisabled = 0; - icon = QUOTE(PATHTOF(UI\captive_ca.paa)); - priority = 2.3; - hotkey = "E"; - }; - class ACE_StopEscorting { - displayName = "$STR_ACE_Captives_StopEscorting"; - distance = 4; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canStopEscorting)); - statement = QUOTE([ARR_3(_player,_target, false)] call FUNC(doEscortCaptive)); - exceptions[] = {QGVAR(isNotEscorting)}; - showDisabled = 0; - icon = QUOTE(PATHTOF(UI\captive_ca.paa)); - priority = 2.3; - hotkey = "E"; - }; - class ACE_LoadCaptive { - displayName = "$STR_ACE_Captives_LoadCaptive"; - distance = 4; - condition = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(canLoadCaptive)); - statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(doLoadCaptive)); - exceptions[] = {QGVAR(isNotEscorting)}; - showDisabled = 0; - icon = QUOTE(PATHTOF(UI\captive_ca.paa)); - priority = 2.2; - hotkey = "L"; - }; - class ACE_FriskPerson { - displayName = "$STR_ACE_Captives_FriskPerson"; - distance = 2; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canFriskPerson)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doFriskPerson)); - showDisabled = 0; - //icon = ""; //@todo - priority = 3; - hotkey = "F"; + class ACE_MainActions { + class ACE_EscortCaptive { + displayName = "$STR_ACE_Captives_EscortCaptive"; + distance = 4; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canEscortCaptive)); + statement = QUOTE([ARR_3(_player, _target, true)] call FUNC(doEscortCaptive)); + exceptions[] = {}; + showDisabled = 0; + icon = QUOTE(PATHTOF(UI\captive_ca.paa)); + priority = 2.3; + hotkey = "E"; + }; + class ACE_StopEscorting { + displayName = "$STR_ACE_Captives_StopEscorting"; + distance = 4; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canStopEscorting)); + statement = QUOTE([ARR_3(_player,_target, false)] call FUNC(doEscortCaptive)); + exceptions[] = {QGVAR(isNotEscorting)}; + showDisabled = 0; + icon = QUOTE(PATHTOF(UI\captive_ca.paa)); + priority = 2.3; + hotkey = "E"; + }; + class ACE_LoadCaptive { + displayName = "$STR_ACE_Captives_LoadCaptive"; + distance = 4; + condition = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(canLoadCaptive)); + statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(doLoadCaptive)); + exceptions[] = {QGVAR(isNotEscorting)}; + showDisabled = 0; + icon = QUOTE(PATHTOF(UI\captive_ca.paa)); + priority = 2.2; + hotkey = "L"; + }; + class ACE_FriskPerson { + displayName = "$STR_ACE_Captives_FriskPerson"; + distance = 2; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canFriskPerson)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doFriskPerson)); + showDisabled = 0; + //icon = ""; //@todo + priority = 3; + hotkey = "F"; + }; }; }; @@ -100,24 +108,27 @@ class CfgVehicles { #define MACRO_LOADUNLOADCAPTIVE \ class ACE_Actions { \ - class ACE_LoadCaptive { \ - displayName = "$STR_ACE_Captives_LoadCaptive"; \ - distance = 4; \ - condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \ - statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(doLoadCaptive)); \ - exceptions[] = {QGVAR(isNotEscorting)}; \ - showDisabled = 0; \ - priority = 1.2; \ - hotkey = "L"; \ - }; \ - class ACE_UnloadCaptive { \ - displayName = "$STR_ACE_Captives_UnloadCaptive"; \ - distance = 4; \ - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive)); \ - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doUnloadCaptive)); \ - showDisabled = 0; \ - priority = 1.2; \ - hotkey = "C"; \ + class ACE_MainActions { \ + selection = ""; \ + class ACE_LoadCaptive { \ + displayName = "$STR_ACE_Captives_LoadCaptive"; \ + distance = 4; \ + condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \ + statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(doLoadCaptive)); \ + exceptions[] = {QGVAR(isNotEscorting)}; \ + showDisabled = 0; \ + priority = 1.2; \ + hotkey = "L"; \ + }; \ + class ACE_UnloadCaptive { \ + displayName = "$STR_ACE_Captives_UnloadCaptive"; \ + distance = 4; \ + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive)); \ + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doUnloadCaptive)); \ + showDisabled = 0; \ + priority = 1.2; \ + hotkey = "C"; \ + }; \ }; \ }; diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 647a78c7b2..1e89a1b969 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -37,7 +37,7 @@ _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions"; _recurseFnc = { - private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_condition", "_showDisabled", + private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", "_enableInside", "_children", "_entry", "_actionsCfg"]; _actions = []; _actionsCfg = _this select 0; @@ -48,7 +48,10 @@ _recurseFnc = { _distance = getNumber (_entryCfg >> "distance"); _icon = getText (_entryCfg >> "icon"); _statement = compile (getText (_entryCfg >> "statement")); - + _selection = getText (_entryCfg >> "selection"); + if (_selection == "") then { + _selection = [0,0,0]; + }; _condition = getText (_entryCfg >> "condition"); if (_condition == "") then {_condition = "true"}; @@ -59,24 +62,18 @@ _recurseFnc = { _enableInside = getNumber (_entryCfg >> "enableInside"); _condition = compile _condition; - // diag_log text format["_condition: %1", _condition]; - _children = []; - if(isArray (_entryCfg >> "subMenu")) then { - _subMenuDef = getArray (_entryCfg >> "subMenu"); - _childMenuName = _subMenuDef select 0; - _childMenuCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions" >> _childMenuName; - _children = [_childMenuCfg] call _recurseFnc; - }; + _children = [_entryCfg] call _recurseFnc; _entry = [ _displayName, _icon, - [0,0,0], + _selection, _statement, _condition, _distance, _children, GVAR(uidCounter) ]; + diag_log _entry; GVAR(uidCounter) = GVAR(uidCounter) + 1; _actions pushBack _entry; }; @@ -85,9 +82,20 @@ _recurseFnc = { }; _actions = [_actionsCfg] call _recurseFnc; +//diag_log _actions; +// Backward-compat, filter only base actions that have a selection +private ["_newActions","_oldActions","_selection"]; +_filteredActions = []; +{ + _selection = _x select 2; + if (typeName _selection == "STRING") then { + _filteredActions pushBack _x; + }; +} forEach _actions; +/* _actions = [[ - "TEST!", + "Interactions", "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", "Spine3", { true }, @@ -98,5 +106,5 @@ _actions = [[ ] ]; GVAR(uidCounter) = GVAR(uidCounter) + 1; - -_object setVariable [QUOTE(GVAR(actionData)), _actions]; \ No newline at end of file +*/ +_object setVariable [QUOTE(GVAR(actionData)), _filteredActions]; \ No newline at end of file diff --git a/addons/interact_menu/functions/fnc_probe.sqf b/addons/interact_menu/functions/fnc_probe.sqf index c7386c9bc6..9fdb166f6d 100644 --- a/addons/interact_menu/functions/fnc_probe.sqf +++ b/addons/interact_menu/functions/fnc_probe.sqf @@ -18,6 +18,7 @@ if(!GVAR(keyDown)) then { _target = _actionObject; _player = ACE_player; _active = [_target, ACE_player] call (_actionItem select 4); + systemChat format ["%1 %2 is active %3", _actionObject, _actionItem select 0, _active]; // player sideChat format["_active: %1 %2", _actionItem select 0, _active]; if(_active) then { _renderItem = +_actionItem; diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index ad381f691d..63623aeae1 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -6,7 +6,7 @@ _text = _this select 0; _color = _this select 1; _pos = _this select 2; _icon = _this select 6; - +//systemChat format ["Drawing icon %1", _text]; _sPos = worldToScreen _pos; // _sPos = _pos; if(count _sPos > 0) then { diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 532762d41b..a5eb2cbe22 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -34,7 +34,6 @@ if(_cursorScreenPos distance _pos <= _distance) then { _color = format ["#%1FFFFFF", [255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25)] call EFUNC(common,toHex)]; }; _path set[(count _path), _index]; - // player sideChat format["r: %1", _actionData select 2]; [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); GVAR(currentOptions) set[(count GVAR(currentOptions)), [_this, _pos, _path]]; _currentRenderDepth = -1; @@ -53,7 +52,7 @@ if(_cursorScreenPos distance _pos <= _distance) then { _numActions = _numActions + 1; }; } forEach (_actionData select 6); - systemChat format ["_numActions: %1", _numActions]; + systemChat format ["Menu %1, _numActions: %2", _actionData select 0, _numActions]; private "_angleSpan"; _angleSpan = _maxAngleSpan min (35 * (_numActions - 1)); @@ -67,7 +66,7 @@ if(_cursorScreenPos distance _pos <= _distance) then { _active = [_object, ACE_player] call (_x select 4); // diag_log text format["_active: %1: %2", (_x select 0), _active]; if(_active) then { - systemChat format ["_angle: %1", _angle]; + //systemChat format ["_angle: %1", _angle]; _offset = [GVAR(vecLineMap), _angle] call FUNC(rotateVectLine); _mod = 0.4 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; _newPos = [ diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index ce1a98abc5..78b87f0967 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -30,123 +30,133 @@ class CfgVehicles { class Man; class CAManBase: Man { class ACE_Actions { - class ACE_TeamManagement { - displayName = "$STR_ACE_Interaction_TeamManagement"; + class ACE_MainActions { + displayName = "$STR_ACE_Interaction_MainAction"; distance = 4; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {GVAR(EnableTeamManagement)}); + condition = QUOTE(true); statement = ""; - showDisabled = 0; - priority = 3.2; - icon = PATHTOF(UI\team\team_management_ca.paa); - subMenu[] = {"ACE_TeamManagement", 0}; - hotkey = "M"; - enableInside = 1; + icon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa"; + selection = "spine3"; - class ACE_JoinTeamRed { - displayName = "$STR_ACE_Interaction_JoinTeamRed"; + class ACE_TeamManagement { + displayName = "$STR_ACE_Interaction_TeamManagement"; distance = 4; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); - statement = QUOTE([ARR_2(_target,'RED')] call DFUNC(joinTeam)); - showDisabled = 1; - icon = PATHTOF(UI\team\team_red_ca.paa); - priority = 2.4; - hotkey = "R"; + condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {GVAR(EnableTeamManagement)}); + statement = ""; + showDisabled = 0; + priority = 3.2; + icon = PATHTOF(UI\team\team_management_ca.paa); + hotkey = "M"; + enableInside = 1; + + class ACE_JoinTeamRed { + displayName = "$STR_ACE_Interaction_JoinTeamRed"; + distance = 4; + condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); + statement = QUOTE([ARR_2(_target,'RED')] call DFUNC(joinTeam)); + showDisabled = 1; + icon = PATHTOF(UI\team\team_red_ca.paa); + priority = 2.4; + hotkey = "R"; + enableInside = 1; + }; + class ACE_JoinTeamGreen { + displayName = "$STR_ACE_Interaction_JoinTeamGreen"; + distance = 4; + condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); + statement = QUOTE([ARR_2(_target,'GREEN')] call DFUNC(joinTeam)); + showDisabled = 1; + icon = PATHTOF(UI\team\team_green_ca.paa); + priority = 2.3; + hotkey = "G"; + enableInside = 1; + }; + class ACE_JoinTeamBlue { + displayName = "$STR_ACE_Interaction_JoinTeamBlue"; + distance = 4; + condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); + statement = QUOTE([ARR_2(_target,'BLUE')] call DFUNC(joinTeam)); + showDisabled = 1; + icon = PATHTOF(UI\team\team_blue_ca.paa); + priority = 2.2; + hotkey = "B"; + enableInside = 1; + }; + class ACE_JoinTeamYellow { + displayName = "$STR_ACE_Interaction_JoinTeamYellow"; + distance = 4; + condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); + statement = QUOTE([ARR_2(_target,'YELLOW')] call DFUNC(joinTeam)); + showDisabled = 1; + icon = PATHTOF(UI\team\team_yellow_ca.paa); + priority = 2.1; + hotkey = "Y"; + enableInside = 1; + }; + + class ACE_LeaveTeam { + displayName = "$STR_ACE_Interaction_LeaveTeam"; + distance = 4; + condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {assignedTeam _player != 'MAIN'}); + statement = QUOTE([ARR_2(_target,'MAIN')] call DFUNC(joinTeam)); + showDisabled = 1; + icon = PATHTOF(UI\team\team_white_ca.paa); + priority = 2.5; + hotkey = "N"; + enableInside = 1; + }; + }; + + class ACE_JoinGroup { + displayName = "$STR_ACE_Interaction_JoinGroup"; + distance = 4; + condition = QUOTE(side group _player == side group _target && {group _player != group _target}); + statement = QUOTE([_player] joinSilent group _target;); + showDisabled = 0; + priority = 2.6; + icon = PATHTOF(UI\team\team_management_ca.paa); + hotkey = "J"; enableInside = 1; }; - class ACE_JoinTeamGreen { - displayName = "$STR_ACE_Interaction_JoinTeamGreen"; + + class ACE_GetDown { + displayName = "$STR_ACE_Interaction_GetDown"; distance = 4; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); - statement = QUOTE([ARR_2(_target,'GREEN')] call DFUNC(joinTeam)); - showDisabled = 1; - icon = PATHTOF(UI\team\team_green_ca.paa); - priority = 2.3; - hotkey = "G"; - enableInside = 1; - }; - class ACE_JoinTeamBlue { - displayName = "$STR_ACE_Interaction_JoinTeamBlue"; - distance = 4; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); - statement = QUOTE([ARR_2(_target,'BLUE')] call DFUNC(joinTeam)); - showDisabled = 1; - icon = PATHTOF(UI\team\team_blue_ca.paa); + condition = QUOTE([_target] call DFUNC(canInteractWith)); + statement = QUOTE([_target] call DFUNC(getDown)); + showDisabled = 0; priority = 2.2; - hotkey = "B"; - enableInside = 1; }; - class ACE_JoinTeamYellow { - displayName = "$STR_ACE_Interaction_JoinTeamYellow"; + class ACE_SendAway { + displayName = "$STR_ACE_Interaction_SendAway"; distance = 4; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); - statement = QUOTE([ARR_2(_target,'YELLOW')] call DFUNC(joinTeam)); - showDisabled = 1; - icon = PATHTOF(UI\team\team_yellow_ca.paa); - priority = 2.1; - hotkey = "Y"; - enableInside = 1; + condition = QUOTE([_target] call DFUNC(canInteractWith)); + statement = QUOTE([_target] call DFUNC(sendAway)); + showDisabled = 0; + priority = 2.0; }; - - class ACE_LeaveTeam { - displayName = "$STR_ACE_Interaction_LeaveTeam"; + class ACE_Pardon { + displayName = "$STR_ACE_Interaction_Pardon"; distance = 4; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {assignedTeam _player != 'MAIN'}); - statement = QUOTE([ARR_2(_target,'MAIN')] call DFUNC(joinTeam)); - showDisabled = 1; - icon = PATHTOF(UI\team\team_white_ca.paa); + condition = QUOTE(rating _target < -2000 && {alive _target} && {side group _player == side group _target}); + statement = QUOTE([ARR_3(_target,'{_this addRating -rating _this}',_target)] call DEFUNC(common,execRemoteFnc)); + showDisabled = 0; priority = 2.5; - hotkey = "N"; enableInside = 1; }; }; class ACE_TapShoulder { displayName = "$STR_ACE_Interaction_TapShoulder"; + selection = "rightshoulder"; distance = 4; condition = QUOTE([ARR_2(_player, _target)] call DFUNC(canTapShoulder)); statement = QUOTE([ARR_2(_player, _target)] call DFUNC(tapShoulder)); - showDisabled = 1; + showDisabled = 0; priority = 2.8; hotkey = "Q"; enableInside = 1; }; - class ACE_JoinGroup { - displayName = "$STR_ACE_Interaction_JoinGroup"; - distance = 4; - condition = QUOTE(side group _player == side group _target && {group _player != group _target}); - statement = QUOTE([_player] joinSilent group _target;); - showDisabled = 0; - priority = 2.6; - icon = PATHTOF(UI\team\team_management_ca.paa); - hotkey = "J"; - enableInside = 1; - }; - - class ACE_GetDown { - displayName = "$STR_ACE_Interaction_GetDown"; - distance = 4; - condition = QUOTE([_target] call DFUNC(canInteractWith)); - statement = QUOTE([_target] call DFUNC(getDown)); - showDisabled = 0; - priority = 2.2; - }; - class ACE_SendAway { - displayName = "$STR_ACE_Interaction_SendAway"; - distance = 4; - condition = QUOTE([_target] call DFUNC(canInteractWith)); - statement = QUOTE([_target] call DFUNC(sendAway)); - showDisabled = 0; - priority = 2.0; - }; - class ACE_Pardon { - displayName = "$STR_ACE_Interaction_Pardon"; - distance = 4; - condition = QUOTE(rating _target < -2000 && {alive _target} && {side group _player == side group _target}); - statement = QUOTE([ARR_3(_target,'{_this addRating -rating _this}',_target)] call DEFUNC(common,execRemoteFnc)); - showDisabled = 0; - priority = 2.5; - enableInside = 1; - }; }; class ACE_SelfActions { diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index e58e808687..d0c5f47790 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -2,6 +2,9 @@ + + Interactions >> + Interaction Menu Interaktionsmenü diff --git a/addons/logistics_uavbattery/CfgVehicles.hpp b/addons/logistics_uavbattery/CfgVehicles.hpp index 933079071a..a3a3fc763d 100644 --- a/addons/logistics_uavbattery/CfgVehicles.hpp +++ b/addons/logistics_uavbattery/CfgVehicles.hpp @@ -2,6 +2,7 @@ class CfgVehicles { class Helicopter_Base_F; class UAV_01_base_F: Helicopter_Base_F { class ACE_Actions { + class ACE_MainActions { class GVAR(RefuelUAV) { displayName = "$STR_ACE_logistics_uavbattery_Recharge"; distance = 4; @@ -11,9 +12,10 @@ class CfgVehicles { priority = 1.245; \ icon = QUOTE(PATHTOF(ui\UAV_battery.paa)); }; + }; }; }; - + // Misc box content class Box_NATO_Support_F; class ACE_Box_Misc: Box_NATO_Support_F { diff --git a/addons/map/CfgVehicles.hpp b/addons/map/CfgVehicles.hpp index 6c2d4a1ee1..eafc85cdf1 100644 --- a/addons/map/CfgVehicles.hpp +++ b/addons/map/CfgVehicles.hpp @@ -85,12 +85,14 @@ class CfgVehicles { }; class ACE_Actions { - class ACE_CopyMap { - displayName = "$STR_ACE_Map_CopyMap"; - condition = QUOTE(([_target] call EFUNC(common,isPlayer) && {'ItemMap' in assigneditems _player} && {'ACE_MapTools' in items _player} && {'ItemMap' in assignedItems _target})); - statement = QUOTE([ARR_2(_player,_target)] call FUNC(copyMapStart)); - showDisabled = 0; - priority = -1; + class ACE_MainActions { + class ACE_CopyMap { + displayName = "$STR_ACE_Map_CopyMap"; + condition = QUOTE(([_target] call EFUNC(common,isPlayer) && {'ItemMap' in assigneditems _player} && {'ACE_MapTools' in items _player} && {'ItemMap' in assignedItems _target})); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(copyMapStart)); + showDisabled = 0; + priority = -1; + }; }; }; }; diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp index bdf4576eb3..cbf35b0baf 100644 --- a/addons/respawn/CfgVehicles.hpp +++ b/addons/respawn/CfgVehicles.hpp @@ -78,13 +78,18 @@ class CfgVehicles { init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; _this call FUNC(initRallypoint)); }; class ACE_Actions : ACE_Actions { - class ACE_Teleport { - displayName = "Teleport to Rallypoint"; - distance = 4; - condition = QUOTE(side group _player == west); - statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; + class ACE_MainActions { + distance = 5; + condition = "true"; + selection = ""; + class ACE_Teleport { + displayName = "Teleport to Rallypoint"; + distance = 4; + condition = QUOTE(side group _player == west); + statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); + showDisabled = 1; + priority = 1; + }; }; }; }; @@ -98,13 +103,18 @@ class CfgVehicles { init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; _this call FUNC(initRallypoint)); }; class ACE_Actions : ACE_Actions { - class ACE_Teleport { - displayName = "Teleport to Rallypoint"; - distance = 4; - condition = QUOTE(side group _player == east); - statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; + class ACE_MainActions { + distance = 5; + condition = "true"; + selection = ""; + class ACE_Teleport { + displayName = "Teleport to Rallypoint"; + distance = 4; + condition = QUOTE(side group _player == east); + statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); + showDisabled = 1; + priority = 1; + }; }; }; }; @@ -118,13 +128,18 @@ class CfgVehicles { init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; _this call FUNC(initRallypoint)); }; class ACE_Actions : ACE_Actions { - class ACE_Teleport { - displayName = "Teleport to Rallypoint"; - distance = 4; - condition = QUOTE(side group _player == independent); - statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; + class ACE_MainActions { + distance = 5; + condition = "true"; + selection = ""; + class ACE_Teleport { + displayName = "Teleport to Rallypoint"; + distance = 4; + condition = QUOTE(side group _player == independent); + statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); + showDisabled = 1; + priority = 1; + }; }; }; }; @@ -139,13 +154,17 @@ class CfgVehicles { init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; _this call FUNC(initRallypoint)); }; class ACE_Actions : ACE_Actions { - class ACE_Teleport { - displayName = "Teleport to Base"; - distance = 4; - condition = QUOTE(side group _player == west); - statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; + class ACE_MainActions { + distance = 5; + condition = "true"; + class ACE_Teleport { + displayName = "Teleport to Base"; + distance = 4; + condition = QUOTE(side group _player == west); + statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); + showDisabled = 1; + priority = 1; + }; }; }; }; @@ -159,13 +178,17 @@ class CfgVehicles { init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; _this call FUNC(initRallypoint)); }; class ACE_Actions : ACE_Actions { - class ACE_Teleport { - displayName = "Teleport to Base"; - distance = 4; - condition = QUOTE(side group _player == east); - statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; + class ACE_MainActions { + distance = 5; + condition = "true"; + class ACE_Teleport { + displayName = "Teleport to Base"; + distance = 4; + condition = QUOTE(side group _player == east); + statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); + showDisabled = 1; + priority = 1; + }; }; }; }; @@ -179,13 +202,17 @@ class CfgVehicles { init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; _this call FUNC(initRallypoint)); }; class ACE_Actions : ACE_Actions { - class ACE_Teleport { - displayName = "Teleport to Base"; - distance = 4; - condition = QUOTE(side group _player == independent); - statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; + class ACE_MainActions { + distance = 5; + condition = "true"; + class ACE_Teleport { + displayName = "Teleport to Base"; + distance = 4; + condition = QUOTE(side group _player == independent); + statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); + showDisabled = 1; + priority = 1; + }; }; }; }; diff --git a/addons/vehiclelock/CfgVehicles.hpp b/addons/vehiclelock/CfgVehicles.hpp index 79591280d8..2ffb4eee44 100644 --- a/addons/vehiclelock/CfgVehicles.hpp +++ b/addons/vehiclelock/CfgVehicles.hpp @@ -1,29 +1,34 @@ #define MACRO_LOCK_ACTIONS \ - class ACE_unlockVehicle { \ - displayName = "$STR_ACE_Vehicle_Action_UnLock"; \ - distance = 4; \ - condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(2,3)]}); \ - statement = QUOTE([ARR_3('SetVehicleLock', [_target], [ARR_2(_target,false)])] call EFUNC(common,targetEvent)); \ - showDisabled = 0; \ - priority = 0.3; \ - icon = QUOTE(PATHTOF(ui\key_menuIcon_ca.paa)); \ - }; \ - class ACE_lockVehicle { \ - displayName = "$STR_ACE_Vehicle_Action_Lock"; \ - distance = 4; \ - condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(0,1)]}); \ - statement = QUOTE([ARR_3('SetVehicleLock', [_target], [ARR_2(_target,true)])] call EFUNC(common,targetEvent)); \ - showDisabled = 0; \ - priority = 0.2; \ - icon = QUOTE(PATHTOF(ui\key_menuIcon_ca.paa)); \ - }; \ - class ACE_lockpickVehicle { \ - displayName = "$STR_ACE_Vehicle_Action_Lockpick"; \ - distance = 4; \ - condition = QUOTE([ARR_3(_player, _target, 'canLockpick')] call FUNC(lockpick)); \ - statement = QUOTE([ARR_3(_player, _target, 'startLockpick')] call FUNC(lockpick)); \ - showDisabled = 0; \ - priority = 0.1; \ + class ACE_MainActions { \ + selection = ""; \ + distance = 5; \ + condition = "true"; \ + class ACE_unlockVehicle { \ + displayName = "$STR_ACE_Vehicle_Action_UnLock"; \ + distance = 4; \ + condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(2,3)]}); \ + statement = QUOTE([ARR_3('SetVehicleLock', [_target], [ARR_2(_target,false)])] call EFUNC(common,targetEvent)); \ + showDisabled = 0; \ + priority = 0.3; \ + icon = QUOTE(PATHTOF(ui\key_menuIcon_ca.paa)); \ + }; \ + class ACE_lockVehicle { \ + displayName = "$STR_ACE_Vehicle_Action_Lock"; \ + distance = 4; \ + condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(0,1)]}); \ + statement = QUOTE([ARR_3('SetVehicleLock', [_target], [ARR_2(_target,true)])] call EFUNC(common,targetEvent)); \ + showDisabled = 0; \ + priority = 0.2; \ + icon = QUOTE(PATHTOF(ui\key_menuIcon_ca.paa)); \ + }; \ + class ACE_lockpickVehicle { \ + displayName = "$STR_ACE_Vehicle_Action_Lockpick"; \ + distance = 4; \ + condition = QUOTE([ARR_3(_player, _target, 'canLockpick')] call FUNC(lockpick)); \ + statement = QUOTE([ARR_3(_player, _target, 'startLockpick')] call FUNC(lockpick)); \ + showDisabled = 0; \ + priority = 0.1; \ + }; \ }; class CfgVehicles { From 861a6b1775ca23ece2748dbee581c1c551fe6522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 15:47:59 -0300 Subject: [PATCH 125/166] avoid all submenus opening simultaneously by switching menu paths to use uids --- addons/interact_menu/functions/fnc_renderMenu.sqf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index a5eb2cbe22..e6b47241c4 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -1,11 +1,11 @@ //fnc_renderMenu.sqf #include "script_component.hpp" -private ["_object", "_actionData", "_distance", "_index", "_pos", "_cursorScreenPos", "_path", "_menuDepth", "_opacity", "_currentRenderDepth", "_radialOffset", "_active", "_x", "_offset", "_newPos", "_forEachIndex"]; +private ["_object", "_actionData", "_distance", "_uid", "_pos", "_cursorScreenPos", "_path", "_menuDepth", "_opacity", "_currentRenderDepth", "_radialOffset", "_active", "_x", "_offset", "_newPos", "_forEachIndex"]; _object = _this select 0; _actionData = _this select 1; -_index = _this select 2; +_uid = _actionData select 7;//_this select 2; _angles = _this select 3; _distance = _actionData select 5; @@ -30,16 +30,16 @@ if(_cursorScreenPos distance _pos <= _distance) then { // ARGB Color (First Hex Pair is transparancy) _color = "#FFFFFFFF"; - if(_menuDepth > 0 && _index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { + if(_menuDepth > 0 && _uid != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { _color = format ["#%1FFFFFF", [255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25)] call EFUNC(common,toHex)]; }; - _path set[(count _path), _index]; + _path set[(count _path), _uid]; [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); GVAR(currentOptions) set[(count GVAR(currentOptions)), [_this, _pos, _path]]; _currentRenderDepth = -1; _currentRenderDepth = GVAR(renderDepth); GVAR(renderDepth) = GVAR(renderDepth) + 1; - if(_index == (GVAR(menuDepthPath) select (GVAR(renderDepth)-1))) then { + if(_uid == (GVAR(menuDepthPath) select (GVAR(renderDepth)-1))) then { // Count how many actions are active private "_numActions"; _numActions = 0; From ae61dff44e3474a6a6e050e64185dcf15d3c167e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 19 Feb 2015 14:29:38 -0600 Subject: [PATCH 126/166] Move draw to function (wip) --- .../functions/fnc_canStopEscorting.sqf | 16 +--- addons/nametags/XEH_postInit.sqf | 67 +--------------- addons/nametags/XEH_preInit.sqf | 1 + addons/nametags/config.cpp | 5 +- .../functions/fnc_drawNameTagIcon.sqf | 2 +- .../nametags/functions/fnc_initIsSpeaking.sqf | 1 - addons/nametags/functions/fnc_onDraw3d.sqf | 77 +++++++++++++++++++ 7 files changed, 85 insertions(+), 84 deletions(-) create mode 100644 addons/nametags/functions/fnc_onDraw3d.sqf diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf index e6a5a0e568..1767ea6ed0 100644 --- a/addons/captives/functions/fnc_canStopEscorting.sqf +++ b/addons/captives/functions/fnc_canStopEscorting.sqf @@ -19,22 +19,10 @@ PARAMS_1(_unit); DEFAULT_PARAM(1,_target,objNull); -private ["_isAttached"]; - if (isNull _target) then { _target = _unit getVariable [QGVAR(escortedUnit), objNull]; }; -if (isNull _target) exitWith { - ERROR("Null Target (no ACE_escortedUnit)"); - false -}; +if (isNull _target) exitWith {false}; -_isAttached = _target in (attachedObjects _unit); - -if (_isAttached && (!(_target getVariable [QGVAR(isHandcuffed), false]))) exitWith { - ERROR("Attached But Not Captive"); - false -}; - -_isAttached +(_target in (attachedObjects _unit)) && {!(_target getVariable [QGVAR(isHandcuffed), false])} diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index 0837ce3e88..1ad0e38879 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -27,69 +27,4 @@ if (!hasInterface) exitWith {}; // Draw handle -addMissionEventHandler ["Draw3D", { - if (GVAR(showPlayerNames) == 0) exitWith {}; - - _player = ACE_player; - - //When cursorTarget is on a vehicle show the nametag for the commander. - //If set to "Only On Keypress" settings, fade just like main tags - if (GVAR(showCursorTagForVehicles)) then { - _target = cursorTarget; - if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then { - _target = effectiveCommander _target; - if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - _distance = _player distance _target; - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); - if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress - _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time)); - }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); - }; - }; - }; - - if (GVAR(showPlayerNames) in [2,4]) then { - //"Only Cursor" mode, only show nametags for humans - _target = cursorTarget; - if ((!isNull _target) && {_target isKindOf "CAManBase"} && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - _distance = _player distance _target; - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); - if ((GVAR(showPlayerNames) == 4)) then { //only on keypress - _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time)); - }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); - }; - } else { - _pos = positionCameraToWorld [0, 0, 0]; - _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5]; - - if (!surfaceIsWater _pos) then { - _pos = ATLtoASL _pos; - }; - _pos2 = positionCameraToWorld [0, 0, 1]; - if (!surfaceIsWater _pos2) then { - _pos2 = ATLtoASL _pos2; - }; - _vecy = _pos2 vectorDiff _pos; - - { - _target = _x; - - if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight - _relPos = (visiblePositionASL _target) vectorDiff _pos; - _distance = vectorMagnitude _relPos; - _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy)); - - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); - - if (GVAR(showPlayerNames) == 3) then { //only on keypress - _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time)); - }; - - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); - }; - } forEach _targets; - }; -}]; +addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; diff --git a/addons/nametags/XEH_preInit.sqf b/addons/nametags/XEH_preInit.sqf index b56841c2aa..80c06cff1f 100644 --- a/addons/nametags/XEH_preInit.sqf +++ b/addons/nametags/XEH_preInit.sqf @@ -8,6 +8,7 @@ PREP(drawNameTagIcon); PREP(getVehicleData); PREP(initIsSpeaking); PREP(moduleNameTags); +PREP(onDraw3d); PREP(onMouseZChanged); PREP(setText); diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp index d17c156b78..25992c0174 100644 --- a/addons/nametags/config.cpp +++ b/addons/nametags/config.cpp @@ -53,10 +53,11 @@ class ACE_Settings { isClientSetable = 0; }; class GVAR(showSoundWaves) { - value = 0; - typeName = "BOOL"; + value = 1; + typeName = "SCALAR"; isClientSetable = 1; displayName = "$STR_ACE_NameTags_ShowSoundWaves"; + values[] = {"Disabled", "Use Nametag settings", "Always Show All"}; }; class GVAR(PlayerNamesViewDistance) { value = 5; diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index ca2ed39c5e..d991baf433 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -25,7 +25,7 @@ "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs.paa" \ ] -private ["_player", "_target", "_alpha", "_heightOffset", "_height", "_position", "_color", "_name", "_rank", "_size"]; +private ["_height", "_position", "_color", "_name", "_rank", "_size"]; PARAMS_4(_player,_target,_alpha,_heightOffset); diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf index 7d632e51dd..b7dc920fa2 100644 --- a/addons/nametags/functions/fnc_initIsSpeaking.sqf +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -45,7 +45,6 @@ case (isClass (configFile >> "cfgPatches" >> "acre_api")): { _newSetting = ([ACE_player] call ACRE_api_fnc_isBroadcasting) || {!(isNull findDisplay 55)}; if (!(_oldSetting isEqualTo _newSetting)) then { ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true]; - // ["IsTalking??", [ACE_player, _newSetting]] call localEvent //any use in ACE for a "speaking event"? }; }; }; diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf new file mode 100644 index 0000000000..49b4177dda --- /dev/null +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -0,0 +1,77 @@ +#include "script_component.hpp" + +_player = ACE_player; + +//don't show nametags in spectator +if (!alive _player) exitWith {}; + +_onKeyPressAlphaMax = 2 + (GVAR(ShowNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0 + +//If set to only show on keypress and nothing would be visable, exit +if ((GVAR(showPlayerNames) in [3,4]) && {GVAR(showSoundWaves) < 2} && {(2 + (GVAR(ShowNamesTime) - time)) < 0}) exitWith{}; + + +//When cursorTarget is on a vehicle show the nametag for the commander. +//If set to "Only On Keypress" settings, fade just like main tags +if (GVAR(showCursorTagForVehicles)) then { + _target = cursorTarget; + if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then { + _target = effectiveCommander _target; + if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + _distance = _player distance _target; + _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); + if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress + _alpha = _alpha min _onKeyPressAlphaMax; + }; + [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + }; + }; +}; + +//"Only Cursor" mode, only show nametags for humans +if (GVAR(showPlayerNames) in [2,4]) then { + _target = cursorTarget; + if ((!isNull _target) && {_target isKindOf "CAManBase"} && {(side (group _target)) == (side (group _player))} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + _distance = _player distance _target; + _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); + if ((GVAR(showPlayerNames) == 4)) then { //only on keypress + _alpha = _alpha min _onKeyPressAlphaMax; + }; + [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + }; +}; + + +if ((GVAR(showPlayerNames) in [1,3]) || {GVAR(showSoundWaves) == 2}) then { + _pos = positionCameraToWorld [0, 0, 0]; + _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5]; + + if (!surfaceIsWater _pos) then { + _pos = ATLtoASL _pos; + }; + _pos2 = positionCameraToWorld [0, 0, 1]; + if (!surfaceIsWater _pos2) then { + _pos2 = ATLtoASL _pos2; + }; + _vecy = _pos2 vectorDiff _pos; + + { + _target = _x; + + if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight + _relPos = (visiblePositionASL _target) vectorDiff _pos; + _distance = vectorMagnitude _relPos; + _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy)); + + _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); + + if (GVAR(showPlayerNames) == 3) then { //only on keypress + _alpha = _alpha min _onKeyPressAlphaMax; + }; + + [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + }; + } forEach _targets; +}; + From a8e269bc18d46f65d77599123194dc336d56277b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 19 Feb 2015 14:34:08 -0600 Subject: [PATCH 127/166] Cleanup Escort Logic No more ERROR spam --- .../captives/functions/fnc_canStopEscorting.sqf | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf index e6a5a0e568..56065a43fc 100644 --- a/addons/captives/functions/fnc_canStopEscorting.sqf +++ b/addons/captives/functions/fnc_canStopEscorting.sqf @@ -19,22 +19,10 @@ PARAMS_1(_unit); DEFAULT_PARAM(1,_target,objNull); -private ["_isAttached"]; - if (isNull _target) then { _target = _unit getVariable [QGVAR(escortedUnit), objNull]; }; -if (isNull _target) exitWith { - ERROR("Null Target (no ACE_escortedUnit)"); - false -}; +if (isNull _target) exitWith {false}; -_isAttached = _target in (attachedObjects _unit); - -if (_isAttached && (!(_target getVariable [QGVAR(isHandcuffed), false]))) exitWith { - ERROR("Attached But Not Captive"); - false -}; - -_isAttached +(_target in (attachedObjects _unit)) && {_target getVariable [QGVAR(isHandcuffed), false]} From a81c1fbef5cc637276325830e8f1e3ffe2c84876 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 21:38:51 +0100 Subject: [PATCH 128/166] Overhauled AGM hint. --- addons/common/HintConfig.hpp | 6 ++-- addons/common/config.cpp | 29 ++++++++++++++++++- .../functions/fnc_displayTextPicture.sqf | 2 +- .../functions/fnc_displayTextStructured.sqf | 29 ++++++++++--------- .../functions/fnc_setSettingFromConfig.sqf | 3 +- addons/common/stringtable.xml | 8 ++++- 6 files changed, 56 insertions(+), 21 deletions(-) diff --git a/addons/common/HintConfig.hpp b/addons/common/HintConfig.hpp index 8c8dc38abb..28346c3da3 100644 --- a/addons/common/HintConfig.hpp +++ b/addons/common/HintConfig.hpp @@ -25,6 +25,7 @@ class RscTitles { y = safeZoneY + 0.2 * safezoneH; w = 0.2 * safeZoneW; h = 0.1 * SafeZoneH; + font = "PuristaMedium"; }; }; }; @@ -36,7 +37,6 @@ class RscTitles { fadeIn = 0.2; fadeOut = 0.2; name = "ACE_RscErrorHint"; - class controls { class HintBox: RscStructuredText { idc = 1; @@ -56,7 +56,7 @@ class RscTitles { duration = 7; idd = 86411; movingenable = 0; - onLoad = "uiNamespace setVariable ['ACE_RscDisplayMessage', _this select 0];" + onLoad = "uiNamespace setVariable ['ACE_RscDisplayMessage', _this select 0];"; fadein = 0; class controlsBackground { class header: ACE_gui_staticBase { @@ -88,7 +88,7 @@ class RscTitles { duration = 15; idd = 86412; movingenable = 0; - onLoad = "uiNamespace setVariable ['ACE_RscDisplayInformation', _this select 0];" + onLoad = "uiNamespace setVariable ['ACE_RscDisplayInformation', _this select 0];"; fadein = 0; class controlsBackground { class header: ACE_gui_staticBase { diff --git a/addons/common/config.cpp b/addons/common/config.cpp index b1c479b54f..b86744f0a9 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -102,7 +102,14 @@ class ACE_Settings { displayName = "$STR_ACE_Common_SettingFeedbackIconsName"; description = "$STR_ACE_Common_SettingFeedbackIconsDesc"; values[] = {"Hide", "Top right, downwards", "Top right, to the left", "Top left, downwards", "Top left, to the right"}; - }; + }; + class GVAR(displayTextColor) { + value[] = {0,0,0,0}; + typeName = "COLOR"; + isClientSetable = 1; + displayName = "$STR_ACE_Common_SettingDisplayTextColorName"; + description = "$STR_ACE_Common_SettingDisplayTextColorDesc"; + }; }; #include "define.hpp" @@ -113,3 +120,23 @@ class ACE_Settings { #include #include +class CfgUIGrids { + class IGUI { + class Presets { + class Arma3 { + class Variables { + grid_ACE_displayText[] = {{safeZoneW + safeZoneX - 0.175 * safezoneW, safeZoneY + 0.175 * safezoneH, 0.15 * safeZoneW, 0.125 * SafeZoneH}, "(((safezoneW / safezoneH) min 1.2) / 40)","((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"}; + }; + }; + }; + + class Variables { + class grid_ACE_displayText { + displayName = "ACE Hint"; + description = "Textual in game feedback to the player."; + preview = "\a3\Ui_f\data\GUI\Cfg\UIGrids\grid_hint_ca.paa"; + saveToProfile[] = {0,1}; + }; + }; + }; +}; diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index 8d46d8d38e..060f04f591 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -22,7 +22,7 @@ if (typeName _text != "TEXT") then { }; _text = composeText [ - parseText format ["", _image], + parseText format ["", _image], lineBreak, _text ]; diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 62db6a829f..e103c904b3 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -12,7 +12,7 @@ */ #include "script_component.hpp" -private ["_text", "_size", "_isShown", "_ctrlHint"]; +private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position"]; _text = _this select 0; _size = _this select 1; @@ -20,7 +20,10 @@ _size = _this select 1; if (isNil "_size") then {_size = 1}; if (typeName _text != "TEXT") then { - _text = composeText [lineBreak, parseText format ["%1", _text]]; + if (typeName _text == "STRING" && {isLocalized _text}) then { + _text = localize _text; + }; + _text = composeText [lineBreak, parseText format ["%1", _text]]; }; _isShown = ctrlShown (uiNamespace getVariable ["ACE_ctrlHint", controlNull]); @@ -30,19 +33,17 @@ _isShown = ctrlShown (uiNamespace getVariable ["ACE_ctrlHint", controlNull]); disableSerialization; _ctrlHint = uiNamespace getVariable "ACE_ctrlHint"; -_ctrlHint ctrlSetPosition [ - safeZoneW + safeZoneX - 0 * safezoneW, - safeZoneY + 0.2 * safezoneH, - 0.2 * safeZoneW, - _size * 0.1 * SafeZoneH -]; +_ctrlHint ctrlSetBackgroundColor GVAR(displayTextColor); + +_xPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_X", safeZoneW + safeZoneX - 0.175 * safezoneW]; +_yPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_Y", safeZoneY + 0.175 * safezoneH]; +_wPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_W", 0.15 * safeZoneW]; +_hPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_H", 0.125 * SafeZoneH]; +_position = [_xPos, _yPos, _wPos, _size * _hPos]; + +_ctrlHint ctrlSetPosition _position; _ctrlHint ctrlCommit 0; _ctrlHint ctrlSetStructuredText _text; -_ctrlHint ctrlSetPosition [ - safeZoneW + safeZoneX - 0.2 * safezoneW, - safeZoneY + 0.2 * safezoneH, - 0.2 * safeZoneW, - _size * 0.1 * SafeZoneH -]; +_ctrlHint ctrlSetPosition _position; _ctrlHint ctrlCommit ([0.2, 0] select _isShown); diff --git a/addons/common/functions/fnc_setSettingFromConfig.sqf b/addons/common/functions/fnc_setSettingFromConfig.sqf index 4151f3e0e4..577f3083e6 100644 --- a/addons/common/functions/fnc_setSettingFromConfig.sqf +++ b/addons/common/functions/fnc_setSettingFromConfig.sqf @@ -17,7 +17,8 @@ EXPLODE_1_PVT(_this,_optionEntry); _fnc_getValueWithType = { EXPLODE_2_PVT(_this,_optionEntry,_typeName); - _value = getNumber (_optionEntry >> "value"); + _valueConfig = (_optionEntry >> "value"); + _value = if (!(isArray _valueConfig) && !(isText _valueConfig)) then { getNumber (_optionEntry >> "value"); } else { 0 }; TRACE_3("_fnc_getValueWithType:", configName _optionEntry, _typeName, _value); if (_typeName == "BOOL") exitWith { _value > 0 diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index f7705f8ad9..3ece4206d7 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -320,7 +320,13 @@ Select the position of or disable the feedback icons on your screen. These icons will show to provide extra feedback on your character status and actions performed. - + + + Hint Background color + + + The color of the background from the ACE hints. + \ No newline at end of file From b58abaa2c03dc175fd2ff04f43bf2bbef137db67 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 22:01:09 +0100 Subject: [PATCH 129/166] Added a transparant background --- addons/common/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/config.cpp b/addons/common/config.cpp index b86744f0a9..201e44e181 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -104,7 +104,7 @@ class ACE_Settings { values[] = {"Hide", "Top right, downwards", "Top right, to the left", "Top left, downwards", "Top left, to the right"}; }; class GVAR(displayTextColor) { - value[] = {0,0,0,0}; + value[] = {0,0,0,0.1}; typeName = "COLOR"; isClientSetable = 1; displayName = "$STR_ACE_Common_SettingDisplayTextColorName"; From 0dfeb22ec87084c04d8148276deee0b4153017be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 18:03:14 -0300 Subject: [PATCH 130/166] tidy up --- addons/interact_menu/XEH_preInit.sqf | 19 +++++++++---------- addons/interact_menu/config.cpp | 2 +- .../interact_menu/functions/fnc_addAction.sqf | 19 ++++++++++--------- .../functions/fnc_setToRender.sqf | 6 ------ 4 files changed, 20 insertions(+), 26 deletions(-) delete mode 100644 addons/interact_menu/functions/fnc_setToRender.sqf diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index da01026425..d3766cf765 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -2,21 +2,20 @@ ADDON = false; -PREP(setToRender); -PREP(render); -PREP(renderIcon); -PREP(renderMenu); -PREP(probe); -PREP(rotateVectLineGetMap); -PREP(rotateVectLine); +PREP(addAction); +PREP(compileMenu); +PREP(compileMenuSelfAction); PREP(keyDown); PREP(keyDownSelfAction); PREP(keyUp); PREP(keyUpSelfAction); -PREP(compileMenu); -PREP(compileMenuSelfAction); -PREP(addAction); +PREP(probe); PREP(removeAction); +PREP(render); +PREP(renderIcon); +PREP(renderMenu); +PREP(rotateVectLine); +PREP(rotateVectLineGetMap); GVAR(toRender) = []; diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp index a7b7bae6df..784c6529d6 100644 --- a/addons/interact_menu/config.cpp +++ b/addons/interact_menu/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; - author[] = {""}; + author[] = {"NouberNou", "CAA-Picard"}; authorUrl = ""; VERSION_CONFIG; }; diff --git a/addons/interact_menu/functions/fnc_addAction.sqf b/addons/interact_menu/functions/fnc_addAction.sqf index 4b9243cfac..9c22023db4 100644 --- a/addons/interact_menu/functions/fnc_addAction.sqf +++ b/addons/interact_menu/functions/fnc_addAction.sqf @@ -1,19 +1,20 @@ /* * Author: commy2 - * * Add an ACE action to an object. Note: This function is NOT global. * * Argument: - * 0: Object the action should be assigned to (Object) - * 1: Name of the action shown in the menu (String) - * 2: Icon (String) - * 3: Position (Position or Selection Name) - * 4: Statement (Code) - * 5: Condition (Code) - * 6: Distance (Number) + * 0: Object the action should be assigned to + * 1: Name of the action shown in the menu + * 2: Icon + * 3: Position (Position or Selection Name) or + * 4: Statement + * 5: Condition + * 6: Distance * * Return value: - * The entry array, which can be used to remove the entry, or add children entries. + * The entry array, which can be used to remove the entry, or add children entries . + * + * Public: No */ #include "script_component.hpp" diff --git a/addons/interact_menu/functions/fnc_setToRender.sqf b/addons/interact_menu/functions/fnc_setToRender.sqf deleted file mode 100644 index 4cc7cfd68f..0000000000 --- a/addons/interact_menu/functions/fnc_setToRender.sqf +++ /dev/null @@ -1,6 +0,0 @@ -//fnc_setToRender.sqf -#include "script_component.hpp" -// No idea what this function was for, it was autogenerated out of my WIP file... -private ["_options"]; -_object = _this select 0; -_options = _this select 1; From 41145e5731b86d7ef3af40f349cb3248478ec8e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 18:03:25 -0300 Subject: [PATCH 131/166] reduce size of the menu --- addons/interact_menu/functions/fnc_renderIcon.sqf | 3 ++- addons/interact_menu/functions/fnc_renderMenu.sqf | 13 +++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 63623aeae1..a57a0642a1 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -19,9 +19,10 @@ if(count _sPos > 0) then { if(_icon == "") then { _icon = DEFAULT_ICON; }; - _text = format ["%4", _icon, _color, _color, _text]; + _text = format ["%4", _icon, _color, _color, _text]; _ctrl ctrlSetStructuredText (parseText _text); _ctrl ctrlSetPosition [(_sPos select 0)-(0.011*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.025*SafeZoneW]; + // _ctrl ctrlSetBackgroundColor [1,0,0,1]; _ctrl ctrlCommit 0; }; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index e6b47241c4..aafcf78f27 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -55,7 +55,7 @@ if(_cursorScreenPos distance _pos <= _distance) then { systemChat format ["Menu %1, _numActions: %2", _actionData select 0, _numActions]; private "_angleSpan"; - _angleSpan = _maxAngleSpan min (35 * (_numActions - 1)); + _angleSpan = _maxAngleSpan min (55 * (_numActions - 1)); private "_angle"; _angle = _centerAngle - _angleSpan / 2; @@ -68,15 +68,20 @@ if(_cursorScreenPos distance _pos <= _distance) then { if(_active) then { //systemChat format ["_angle: %1", _angle]; _offset = [GVAR(vecLineMap), _angle] call FUNC(rotateVectLine); - _mod = 0.4 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; + _mod = 0.15 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; _newPos = [ (_pos select 0) + ((_offset select 0)*_mod), (_pos select 1) + ((_offset select 1)*_mod), (_pos select 2) + ((_offset select 2)*_mod) ]; // drawLine3D [_pos, _newPos, [1,0,0,0.5]]; - [_object, _x, _forEachIndex, [_angle, 180], _newPos, _path] call FUNC(renderMenu); - _angle = _angle + _angleSpan / ((_numActions-1) max 1); + [_object, _x, _forEachIndex, [_angle, 170], _newPos, _path] call FUNC(renderMenu); + + if (_angle == 360) then { + _angle = _angle + _angleSpan / _numActions; + } else { + _angle = _angle + _angleSpan / ((_numActions-1) max 1); + }; }; } forEach (_actionData select 6); }; From bc3a226c64dd7e15687823ab4c2a938bc6d5b9b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 18:56:43 -0300 Subject: [PATCH 132/166] Text under the icon --- addons/interact_menu/functions/fnc_renderIcon.sqf | 6 +++--- addons/interact_menu/functions/fnc_renderMenu.sqf | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index a57a0642a1..efa28907bf 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -19,10 +19,10 @@ if(count _sPos > 0) then { if(_icon == "") then { _icon = DEFAULT_ICON; }; - _text = format ["%4", _icon, _color, _color, _text]; + _text = format ["
%4", _icon, _color, _color, _text]; _ctrl ctrlSetStructuredText (parseText _text); - _ctrl ctrlSetPosition [(_sPos select 0)-(0.011*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.025*SafeZoneW]; - + _ctrl ctrlSetPosition [(_sPos select 0)-(0.2*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.035*SafeZoneW]; + //_ctrl ctrlSetBackgroundColor [1, 0, 0, 0.1]; // _ctrl ctrlSetBackgroundColor [1,0,0,1]; _ctrl ctrlCommit 0; }; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index aafcf78f27..91104d9c6b 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -75,7 +75,7 @@ if(_cursorScreenPos distance _pos <= _distance) then { (_pos select 2) + ((_offset select 2)*_mod) ]; // drawLine3D [_pos, _newPos, [1,0,0,0.5]]; - [_object, _x, _forEachIndex, [_angle, 170], _newPos, _path] call FUNC(renderMenu); + [_object, _x, _forEachIndex, [_angle, 150], _newPos, _path] call FUNC(renderMenu); if (_angle == 360) then { _angle = _angle + _angleSpan / _numActions; From 3ade628d87430f180fc32123c0dc991dcd9872cd Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 19 Feb 2015 16:42:28 -0600 Subject: [PATCH 133/166] Handle 3 Soundwave options --- .../functions/fnc_canStopEscorting.sqf | 2 +- .../functions/fnc_drawNameTagIcon.sqf | 53 +++++++------ addons/nametags/functions/fnc_onDraw3d.sqf | 75 +++++++++++++------ addons/nametags/script_component.hpp | 8 +- 4 files changed, 92 insertions(+), 46 deletions(-) diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf index 1767ea6ed0..56065a43fc 100644 --- a/addons/captives/functions/fnc_canStopEscorting.sqf +++ b/addons/captives/functions/fnc_canStopEscorting.sqf @@ -25,4 +25,4 @@ if (isNull _target) then { if (isNull _target) exitWith {false}; -(_target in (attachedObjects _unit)) && {!(_target getVariable [QGVAR(isHandcuffed), false])} +(_target in (attachedObjects _unit)) && {_target getVariable [QGVAR(isHandcuffed), false]} diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index d991baf433..8ccbfc9b4a 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -4,9 +4,11 @@ * Draw the nametag and rank icon. * * Argument: - * 0: Unit (Array) - * 1: alpha (Number) - * 2: Height offset (Number) + * 0: Unit (Player) + * 1: Target + * 2: alpha (Number) + * 4: Height offset (Number) + * 5: Draw Type * * Return value: * None. @@ -23,30 +25,38 @@ "\A3\Ui_f\data\GUI\Cfg\Ranks\captain_gs.paa", \ "\A3\Ui_f\data\GUI\Cfg\Ranks\major_gs.paa", \ "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs.paa" \ -] + ] private ["_height", "_position", "_color", "_name", "_rank", "_size"]; -PARAMS_4(_player,_target,_alpha,_heightOffset); +PARAMS_5(_player,_target,_alpha,_heightOffset,_iconType); -_name = [_target, true] call EFUNC(common,getName); +if (_alpha < 0) exitWith {}; //Don't waste time if not visable +if (_iconType == ICON_NONE) exitWith {}; //Don't waste time if not visable + +//Set Text: +_name = if (_iconType in [ICON_NAME, ICON_NAME_RANK, ICON_NAME_SPEAK]) then { + [_target, true] call EFUNC(common,getName) +} else { + "" +}; + +//Set Icon: _icon = ""; _size = 0; - -if (GVAR(showSoundWaves) && {(_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}}) then { +if ((_iconType == ICON_NAME_SPEAK) || (_iconType == ICON_SPEAK)) then { _icon = QUOTE(PATHTOF(UI\soundwave)) + str (floor (random 10)) + ".paa"; _size = 0.75; _alpha = _alpha + 0.6;//Boost alpha when speaking } else { - if (GVAR(showPlayerRanks)) then { + if (_iconType == ICON_NAME_RANK) then { _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1); _size = 0.75; }; }; -if (_alpha < 0) exitWith {}; //Don't waste time if not visable - +//Set Color: if !(group _target == group _player) then { _color = +GVAR(defaultNametagColor); //Make a copy, then multiply both alpha values (allows client to decrease alpha in settings) _color set [3, (_color select 3) * _alpha]; @@ -55,19 +65,18 @@ if !(group _target == group _player) then { }; _height = [2, 1.5, 1, 1.5, 1] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find (stance _target)); - // Convert position to ASLW (expected by drawIcon3D) and add height offsets _position = _target modelToWorldVisual [0, 0, (_height + _heightOffset)]; drawIcon3D [ - _icon, - _color, - _position, - _size, - _size, - 0, - _name, - 2, - 0.033, - "PuristaMedium" +_icon, +_color, +_position, +_size, +_size, +0, +_name, +2, +0.033, +"PuristaMedium" ]; diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf index 49b4177dda..127afb8561 100644 --- a/addons/nametags/functions/fnc_onDraw3d.sqf +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -5,44 +5,61 @@ _player = ACE_player; //don't show nametags in spectator if (!alive _player) exitWith {}; -_onKeyPressAlphaMax = 2 + (GVAR(ShowNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0 - -//If set to only show on keypress and nothing would be visable, exit -if ((GVAR(showPlayerNames) in [3,4]) && {GVAR(showSoundWaves) < 2} && {(2 + (GVAR(ShowNamesTime) - time)) < 0}) exitWith{}; +_onKeyPressAlphaMax = if ((GVAR(showPlayerNames) in [3,4])) then { + 2 + (GVAR(ShowNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0 +} else { + 1 +}; +_defaultIcon = if (GVAR(showPlayerRanks)) then { + ICON_NAME_RANK; +} else { + ICON_NAME; +}; //When cursorTarget is on a vehicle show the nametag for the commander. //If set to "Only On Keypress" settings, fade just like main tags -if (GVAR(showCursorTagForVehicles)) then { +if (GVAR(showCursorTagForVehicles) && {_onKeyPressAlphaMax > 0}) then { _target = cursorTarget; if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then { _target = effectiveCommander _target; - if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + if ((!isNull _target) && + {(side (group _target)) == (side (group _player))} && + {_target != _player} && + {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && + {!(_target getVariable ["ACE_hideName", false])}) then { _distance = _player distance _target; _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); - if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress - _alpha = _alpha min _onKeyPressAlphaMax; - }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + _alpha = _alpha min _onKeyPressAlphaMax; + [_player, _target, _alpha, _distance * 0.026, _defaultIcon] call FUNC(drawNameTagIcon); }; }; }; -//"Only Cursor" mode, only show nametags for humans -if (GVAR(showPlayerNames) in [2,4]) then { +//"Only Cursor" mode, only show nametags for humans on cursorTarget +if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then { _target = cursorTarget; - if ((!isNull _target) && {_target isKindOf "CAManBase"} && {(side (group _target)) == (side (group _player))} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + if ((!isNull _target) && + {_target isKindOf "CAManBase"} && + {(side (group _target)) == (side (group _player))} && + {_target != _player} && + {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && + {!(_target getVariable ["ACE_hideName", false])}) then { _distance = _player distance _target; _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); - if ((GVAR(showPlayerNames) == 4)) then { //only on keypress - _alpha = _alpha min _onKeyPressAlphaMax; + _alpha = _alpha min _onKeyPressAlphaMax; + _icon = ICON_NONE; + if (GVAR(showSoundWaves) == 2) then { //icon will be drawn below, so only show name here + _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME} else {_defaultIcon}; + } else { + _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME_SPEAK} else {_defaultIcon}; }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + + [_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon); }; }; - -if ((GVAR(showPlayerNames) in [1,3]) || {GVAR(showSoundWaves) == 2}) then { +if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(showSoundWaves) == 2}) then { _pos = positionCameraToWorld [0, 0, 0]; _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5]; @@ -58,7 +75,20 @@ if ((GVAR(showPlayerNames) in [1,3]) || {GVAR(showSoundWaves) == 2}) then { { _target = _x; - if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + _icon = ICON_NONE; + if ((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) then { + if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_NAME_SPEAK;} else {_icon = _defaultIcon}; + } else { + //showSoundWaves must be 2, only draw speak icon + if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_SPEAK;}; + }; + + if ((_icon != ICON_NONE) && + {(side (group _target)) == (side (group _player))} && + {_target != _player} && + {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && + {!(_target getVariable ["ACE_hideName", false])}) then { + if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight _relPos = (visiblePositionASL _target) vectorDiff _pos; _distance = vectorMagnitude _relPos; @@ -66,12 +96,13 @@ if ((GVAR(showPlayerNames) in [1,3]) || {GVAR(showSoundWaves) == 2}) then { _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); - if (GVAR(showPlayerNames) == 3) then { //only on keypress + if ((GVAR(showSoundWaves) == 2) && {(_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}}) then { + _alpha = 1; + } else { _alpha = _alpha min _onKeyPressAlphaMax; }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + [_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon); }; } forEach _targets; }; - diff --git a/addons/nametags/script_component.hpp b/addons/nametags/script_component.hpp index 6cffb95618..e80768a723 100644 --- a/addons/nametags/script_component.hpp +++ b/addons/nametags/script_component.hpp @@ -9,4 +9,10 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_NAMETAGS #endif -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" + +#define ICON_NONE 0 +#define ICON_NAME 1 +#define ICON_NAME_RANK 2 +#define ICON_NAME_SPEAK 3 +#define ICON_SPEAK 4 From dd92c5e845b5cbeeaea04067703684c87c6b64a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 19:45:46 -0300 Subject: [PATCH 134/166] Tap on either shoulder. "Tap" animation --- addons/interaction/CfgVehicles.hpp | 17 ++++++++-- .../interaction/functions/fnc_tapShoulder.sqf | 21 ++++++------ addons/interaction/stringtable.xml | 34 +++++++++++++------ 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index 78b87f0967..801e564384 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -146,12 +146,23 @@ class CfgVehicles { }; }; - class ACE_TapShoulder { + class ACE_TapShoulderRight { displayName = "$STR_ACE_Interaction_TapShoulder"; selection = "rightshoulder"; - distance = 4; + distance = 2.0; condition = QUOTE([ARR_2(_player, _target)] call DFUNC(canTapShoulder)); - statement = QUOTE([ARR_2(_player, _target)] call DFUNC(tapShoulder)); + statement = QUOTE([ARR_3(_player, _target, 0)] call DFUNC(tapShoulder)); + showDisabled = 0; + priority = 2.8; + hotkey = "Q"; + enableInside = 1; + }; + class ACE_TapShoulderLeft { + displayName = "$STR_ACE_Interaction_TapShoulder"; + selection = "leftshoulder"; + distance = 2.0; + condition = QUOTE([ARR_2(_player, _target)] call DFUNC(canTapShoulder)); + statement = QUOTE([ARR_3(_player, _target, 1)] call DFUNC(tapShoulder)); showDisabled = 0; priority = 2.8; hotkey = "Q"; diff --git a/addons/interaction/functions/fnc_tapShoulder.sqf b/addons/interaction/functions/fnc_tapShoulder.sqf index 02eed88542..262012dbb9 100644 --- a/addons/interaction/functions/fnc_tapShoulder.sqf +++ b/addons/interaction/functions/fnc_tapShoulder.sqf @@ -1,21 +1,22 @@ // by commy2 #include "script_component.hpp" -private ["_unit", "_message"]; - -_tapper = _this select 0; -_target = _this select 1; +EXPLODE_3_PVT(_this,_tapper,_target,_shoulderNum); if (_target != ACE_player) exitWith { - addCamShake [4, 0.5, 5]; - if !(local _target) then { - [[_tapper, _target], QUOTE(DFUNC(tapShoulder)), _target] call EFUNC(common,execRemoteFnc); - }; + addCamShake [4, 0.5, 5]; + ACE_player playActionNow 'gestureAdvance'; + if !(local _target) then { + [[_tapper, _target, _shoulderNum], QUOTE(DFUNC(tapShoulder)), _target] call EFUNC(common,execRemoteFnc); + }; }; addCamShake [4, 0.5, 5]; -//_message = format ["%1 tapped you on your shoulder.", [_unit] call EFUNC(common,getName)]; -_message = localize "STR_ACE_Interaction_YouWereTapped"; +if (_shoulderNum == 0) then { + _message = localize "STR_ACE_Interaction_YouWereTappedRight"; +} else { + _message = localize "STR_ACE_Interaction_YouWereTappedLeft"; +}; [_message] call EFUNC(common,displayTextStructured); diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index d0c5f47790..960d136c0f 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -341,17 +341,29 @@ Tocar ombro Dai un colpetto - - You were tapped on the shoulder. - Dir wurde auf die Schulter geklopft - Te tocaron el hombro. - On te tape sur l'épaule. - Zostałeś klepnięty po ramieniu - Vállonveregettek - Někdo tě poklepal na rameno. - Вас похлопали по плечу - Você foi tocado no ombro. - Ti è stato dato un colpetto sulla spalla + + You were tapped on the RIGHT shoulder > + Te tocaron el hombro DERECHO > + Dir wurde auf die Schulter geklopft > + On te tape sur l'épaule > + Zostałeś klepnięty po ramieniu > + Vállonveregettek > + Někdo tě poklepal na rameno > + Вас похлопали по плечу > + Você foi tocado no ombro > + Ti è stato dato un colpetto sulla spalla > + + + < You were tapped on the LEFT shoulder. + < Te tocaron el hombro IZQUIERDO. + < Dir wurde auf die Schulter geklopft + < On te tape sur l'épaule. + < Zostałeś klepnięty po ramieniu + < Vállonveregettek + < Někdo tě poklepal na rameno. + < Вас похлопали по плечу + < Você foi tocado no ombro. + < Ti è stato dato un colpetto sulla spalla Cancel From 3511a74ef95a73ea2f1f61fe1f8861660d5c2036 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 19 Feb 2015 16:59:21 -0600 Subject: [PATCH 135/166] Don't show sound if not enabled --- addons/nametags/functions/fnc_onDraw3d.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf index 127afb8561..8aa503d377 100644 --- a/addons/nametags/functions/fnc_onDraw3d.sqf +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -52,7 +52,7 @@ if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then { if (GVAR(showSoundWaves) == 2) then { //icon will be drawn below, so only show name here _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME} else {_defaultIcon}; } else { - _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME_SPEAK} else {_defaultIcon}; + _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target} && {GVAR(showSoundWaves) > 0}) then {ICON_NAME_SPEAK} else {_defaultIcon}; }; [_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon); @@ -77,7 +77,7 @@ if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(sho _icon = ICON_NONE; if ((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) then { - if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_NAME_SPEAK;} else {_icon = _defaultIcon}; + if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target} && {GVAR(showSoundWaves) > 0}) then {_icon = ICON_NAME_SPEAK;} else {_icon = _defaultIcon}; } else { //showSoundWaves must be 2, only draw speak icon if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_SPEAK;}; From 908f23a78f315c03ed6135d885c51c82b60a6fa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 20:10:07 -0300 Subject: [PATCH 136/166] Removed filtering actions --- .../functions/fnc_compileMenu.sqf | 26 +------------------ 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 1e89a1b969..e1168baa2b 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -82,29 +82,5 @@ _recurseFnc = { }; _actions = [_actionsCfg] call _recurseFnc; -//diag_log _actions; -// Backward-compat, filter only base actions that have a selection -private ["_newActions","_oldActions","_selection"]; -_filteredActions = []; -{ - _selection = _x select 2; - if (typeName _selection == "STRING") then { - _filteredActions pushBack _x; - }; -} forEach _actions; -/* -_actions = [[ - "Interactions", - "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", - "Spine3", - { true }, - { true }, - 5, - _actions, - GVAR(uidCounter) -] -]; -GVAR(uidCounter) = GVAR(uidCounter) + 1; -*/ -_object setVariable [QUOTE(GVAR(actionData)), _filteredActions]; \ No newline at end of file +_object setVariable [QUOTE(GVAR(actionData)), _actions]; From 6b7f649244e6d6f68930a795fe56b82497bdaaf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Sat, 21 Feb 2015 17:11:03 -0300 Subject: [PATCH 137/166] interact_menu: add headers --- .../interact_menu/functions/fnc_addAction.sqf | 19 +++----- .../functions/fnc_compileMenu.sqf | 36 +++++++--------- .../functions/fnc_compileMenuSelfAction.sqf | 43 ++++++++----------- .../interact_menu/functions/fnc_keyDown.sqf | 13 +++++- .../functions/fnc_keyDownSelfAction.sqf | 13 +++++- addons/interact_menu/functions/fnc_keyUp.sqf | 13 +++++- .../functions/fnc_keyUpSelfAction.sqf | 13 +++++- addons/interact_menu/functions/fnc_probe.sqf | 18 ++++++-- .../functions/fnc_removeAction.sqf | 23 +++++----- addons/interact_menu/functions/fnc_render.sqf | 13 +++++- .../functions/fnc_renderIcon.sqf | 23 ++++++++-- .../functions/fnc_renderMenu.sqf | 18 +++++++- .../functions/fnc_rotateVectLine.sqf | 14 +++++- .../functions/fnc_rotateVectLineGetMap.sqf | 15 ++++++- 14 files changed, 190 insertions(+), 84 deletions(-) diff --git a/addons/interact_menu/functions/fnc_addAction.sqf b/addons/interact_menu/functions/fnc_addAction.sqf index 9c22023db4..3d445a4b13 100644 --- a/addons/interact_menu/functions/fnc_addAction.sqf +++ b/addons/interact_menu/functions/fnc_addAction.sqf @@ -1,9 +1,9 @@ /* - * Author: commy2 - * Add an ACE action to an object. Note: This function is NOT global. + * Author: commy2 and NouberNou + * Add an ACE action to an object or inside a parent action. Note: This function is NOT global. * * Argument: - * 0: Object the action should be assigned to + * 0: Object the action should be assigned to or parent action or * 1: Name of the action shown in the menu * 2: Icon * 3: Position (Position or Selection Name) or @@ -18,15 +18,10 @@ */ #include "script_component.hpp" -private ["_object", "_displayName", "_icon", "_position", "_statement", "_condition", "_distance", "_actions", "_entry"]; -_object = _this select 0; -_displayName = _this select 1; -_icon = _this select 2; -_position = _this select 3; -_statement = _this select 4; -_condition = _this select 5; -_distance = _this select 6; +EXPLODE_7_PVT(_this,_object,_displayName,_icon,_position,_statement,_condition,_distance); + +private ["_actions","_entry"]; _actions = []; if(IS_OBJECT(_object)) then { _actions = _object getVariable [QUOTE(GVAR(actionData)), []]; @@ -51,4 +46,4 @@ _entry = [ ]; GVAR(uidCounter) = GVAR(uidCounter) + 1; _actions pushBack _entry; -_entry; \ No newline at end of file +_entry; diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index e1168baa2b..0bcecf0732 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -1,23 +1,18 @@ -//fnc_compileMenu.sqf -#include "script_component.hpp"; -// diag_log text format["COMPILE ACTIONS: %1", _this]; - -_object = _this select 0; -_objectType = typeOf _object; - - /* -displayName = "$STR_ACE_Interaction_TeamManagement"; -distance = 4; -condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {GVAR(EnableTeamManagement)}); -statement = ""; -showDisabled = 0; -priority = 3.2; -icon = PATHTOF(UI\team\team_management_ca.paa); -subMenu[] = {"ACE_TeamManagement", 0}; -hotkey = "M"; -enableInside = 1; -*/ + * Author: NouberNou + * Compile the action menu from config for a given object. + * + * Argument: + * 0: Object + * + * Return value: + * None + * + * Public: No + */ +#include "script_component.hpp"; + +EXPLODE_1_PVT(_this,_object); /* [ @@ -33,6 +28,8 @@ enableInside = 1; ] */ +private ["_objectType","_recurseFnc","_actions"]; +_objectType = typeOf _object; _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions"; @@ -73,7 +70,6 @@ _recurseFnc = { _children, GVAR(uidCounter) ]; - diag_log _entry; GVAR(uidCounter) = GVAR(uidCounter) + 1; _actions pushBack _entry; }; diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index 923b65e954..0135d64eb8 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -1,21 +1,18 @@ -//fnc_compileMenuSelfAction.sqf -#include "script_component.hpp"; -// diag_log text format["COMPILE ACTIONS: %1", _this]; - -_object = _this select 0; -_objectType = typeOf _object; - - /* -displayName = "$STR_ACE_Hearing_Earbuds_On"; -condition = QUOTE( !([_player] call FUNC(hasEarPlugsIn)) && {'ACE_EarBuds' in items _player} ); -statement = QUOTE( [_player] call FUNC(putInEarPlugs) ); -showDisabled = 0; -priority = 2.5; -icon = PATHTOF(UI\ACE_earplugs_x_ca.paa); -hotkey = "E"; -enableInside = 1; -*/ + * Author: NouberNou and CAA-Picard + * Compile the self action menu from config for a given object. + * + * Argument: + * 0: Object + * + * Return value: + * None + * + * Public: No + */ +#include "script_component.hpp"; + +EXPLODE_1_PVT(_this,_object); /* [ @@ -31,6 +28,8 @@ enableInside = 1; ] */ +private ["_objectType","_recurseFnc","_actions"]; +_objectType = typeOf _object; _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions"; @@ -56,14 +55,7 @@ _recurseFnc = { _enableInside = getNumber (_entryCfg >> "enableInside"); _condition = compile _condition; - // diag_log text format["_condition: %1", _condition]; - _children = []; - if(isArray (_entryCfg >> "subMenu")) then { - _subMenuDef = getArray (_entryCfg >> "subMenu"); - _childMenuName = _subMenuDef select 0; - _childMenuCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions" >> _childMenuName; - _children = [_childMenuCfg] call _recurseFnc; - }; + _children = [_entryCfg] call _recurseFnc; _entry = [ _displayName, _icon, @@ -83,6 +75,7 @@ _recurseFnc = { _actions = [_actionsCfg] call _recurseFnc; +// Create a master action to base on self action _actions = [[ "Self Actions", "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index fdd39e7dc8..5d37019858 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -1,4 +1,15 @@ -//fnc_keyDown.sqf +/* + * Author: NouberNou + * Handle interaction key down + * + * Argument: + * None + * + * Return value: + * true + * + * Public: No + */ #include "script_component.hpp" if(!GVAR(keyDown)) then { diff --git a/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf b/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf index 8e86cfd430..be46dd132c 100644 --- a/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf @@ -1,4 +1,15 @@ -//fnc_keyDownSelfAction.sqf +/* + * Author: NouberNou + * Handle self action key down + * + * Argument: + * None + * + * Return value: + * true + * + * Public: No + */ #include "script_component.hpp" if(!GVAR(keyDownSelfAction)) then { diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 922a5dedce..6a39f40f95 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -1,4 +1,15 @@ -//fnc_keyUpSelfAction.sqf +/* + * Author: NouberNou + * Handle interaction key up + * + * Argument: + * None + * + * Return value: + * true + * + * Public: No + */ #include "script_component.hpp" GVAR(keyDown) = false; diff --git a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf index b0023300bf..82130c9993 100644 --- a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf @@ -1,4 +1,15 @@ -//fnc_keyUp.sqf +/* + * Author: NouberNou + * Handle self action key up + * + * Argument: + * None + * + * Return value: + * true + * + * Public: No + */ #include "script_component.hpp" GVAR(keyDownSelfAction) = false; diff --git a/addons/interact_menu/functions/fnc_probe.sqf b/addons/interact_menu/functions/fnc_probe.sqf index 9fdb166f6d..dc1b7e6c87 100644 --- a/addons/interact_menu/functions/fnc_probe.sqf +++ b/addons/interact_menu/functions/fnc_probe.sqf @@ -1,9 +1,21 @@ -//fnc_probe.sqf +/* + * Author: NouberNou + * Scan de vicinity of the player and collect every interaction available around it on + * the GVAR(toRender) array. + * + * Argument: + * None + * + * Return value: + * None + * + * Public: No + */ #include "script_component.hpp" private ["_nearestObjects", "_actionObject", "_x", "_actionData", "_renderData", "_actionItem", "_active", "_renderItem", "_object", "_forEachIndex"]; if(!GVAR(keyDown)) then { - _nearestObjects = nearestObjects [(getPos player), ["All"], 100]; + _nearestObjects = nearestObjects [(getPos ACE_player), ["All"], 100]; GVAR(toRender) = []; { @@ -36,7 +48,7 @@ if(!GVAR(keyDown)) then { GVAR(filter) = []; { _object = _x select 0; - if(_object distance player > 100) then { + if(_object distance ACE_player > 100) then { GVAR(filter) set[(count GVAR(filter)), _forEachIndex]; }; } forEach GVAR(toRender); diff --git a/addons/interact_menu/functions/fnc_removeAction.sqf b/addons/interact_menu/functions/fnc_removeAction.sqf index 3b32f4d012..3ab4379768 100644 --- a/addons/interact_menu/functions/fnc_removeAction.sqf +++ b/addons/interact_menu/functions/fnc_removeAction.sqf @@ -1,24 +1,21 @@ /* - * Author: commy2 - * - * Add an ACE action to an object. Note: This function is global. + * Author: commy2 and NouberNou + * Remove an action from an object * * Argument: - * 0: Object the action should be assigned to (Object) - * 1: Entry to remove (Array or Number) + * 0: Object the action should be assigned to + * 1: Entry to remove or * * Return value: - * ID of the action (used to remove it later). + * None + * + * Public: No */ - #include "script_component.hpp" -private ["_object", "_entry", "_found", "_actions", "_searchFnc"]; - -_object = _this select 0; -_entry = _this select 1; - +EXPLODE_2_PVT(_this,_object,_entry); +private ["_found", "_actions", "_searchFnc"]; if(!IS_OBJECT(_object)) exitWith {false}; @@ -50,4 +47,4 @@ _searchFnc = { _actions = [_actions, _entry] call _searchFnc; _object setVariable [QUOTE(GVAR(actionData)), _actions]; -_found; \ No newline at end of file +_found; diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 4893d7e819..79d300019a 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -1,4 +1,15 @@ -//fnc_render.sqf +/* + * Author: NouberNou and CAA-Picard + * Render all available nearby interactions + * + * Argument: + * None + * + * Return value: + * None + * + * Public: No + */ #include "script_component.hpp" private ["_cursorPos1", "_cursorPos2", "_cursorVec", "_p1", "_p2", "_p", "_v", "_cp", "_forEachIndex", "_renderTargets", "_x", "_cursorScreenPos", "_closestDistance", "_closestSelection", "_pos", "_sPos", "_disSq", "_closest", "_cTime", "_delta", "_foundTarget", "_misMatch", "_hoverPath", "_i"]; diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index efa28907bf..4b04ff6909 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -1,4 +1,21 @@ -//fnc_renderIcon.sqf +/* + * Author: NouberNou and CAA-Picard + * Render a single interaction icon + * + * Argument: + * 0: Text + * 1: Color + * 2: 3d position ASL + * 3: ? + * 4: ? + * 5: ? + * 6: Icon + * + * Return value: + * None + * + * Public: No + */ #include "script_component.hpp" #define DEFAULT_ICON QUOTE(\z\ace\addons\interaction\ui\dot_ca.paa) private ["_color", "_pos", "_sPos", "_ctrl", "_icon"]; @@ -6,11 +23,11 @@ _text = _this select 0; _color = _this select 1; _pos = _this select 2; _icon = _this select 6; -//systemChat format ["Drawing icon %1", _text]; + _sPos = worldToScreen _pos; // _sPos = _pos; if(count _sPos > 0) then { - // player sideChat format["render!"]; + if(GVAR(iconCount) > (count GVAR(iconCtrls))-1) then { GVAR(iconCtrls) pushBack ((findDisplay 46) ctrlCreate ["RscStructuredText", 54021+GVAR(iconCount)]); }; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 91104d9c6b..4c437aa6f3 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -1,4 +1,20 @@ -//fnc_renderMenu.sqf +/* + * Author: NouberNou and CAA-Picard + * Render a interaction menu + * + * Argument: + * 0: Object + * 1: Action data + * 2: ? + * 3: Angle range available for rendering + * 4: 3D position (Optional) + * 5: Path of UIDs (Optional) + * + * Return value: + * None + * + * Public: No + */ #include "script_component.hpp" private ["_object", "_actionData", "_distance", "_uid", "_pos", "_cursorScreenPos", "_path", "_menuDepth", "_opacity", "_currentRenderDepth", "_radialOffset", "_active", "_x", "_offset", "_newPos", "_forEachIndex"]; diff --git a/addons/interact_menu/functions/fnc_rotateVectLine.sqf b/addons/interact_menu/functions/fnc_rotateVectLine.sqf index d411ffbf84..4639a50903 100644 --- a/addons/interact_menu/functions/fnc_rotateVectLine.sqf +++ b/addons/interact_menu/functions/fnc_rotateVectLine.sqf @@ -1,4 +1,16 @@ -//fnc_rotateVectLine.sqf +/* + * Author: NouberNou + * Rotate a vector line (?) + * + * Argument: + * 0: Map + * 1: Theta + * + * Return value: + * 0: ?? + * + * Public: No + */ #include "script_component.hpp" private ["_theta", "_p", "_map", "_p1", "_p2", "_q1", "_q2", "_u", "_d"]; diff --git a/addons/interact_menu/functions/fnc_rotateVectLineGetMap.sqf b/addons/interact_menu/functions/fnc_rotateVectLineGetMap.sqf index 40a1d0ca0c..e695f3fa8e 100644 --- a/addons/interact_menu/functions/fnc_rotateVectLineGetMap.sqf +++ b/addons/interact_menu/functions/fnc_rotateVectLineGetMap.sqf @@ -1,4 +1,17 @@ -//fnc_rotateVectLineGetMap.sqf +/* + * Author: NouberNou + * ? + * + * Argument: + * 0: p0 + * 1: p1 + * 2: p2 + * + * Return value: + * Map + * + * Public: No + */ #include "script_component.hpp" private ["_p", "_p1", "_p2", "_q1", "_q2", "_u", "_d"]; From 8945f99be1b23037c2be1477c4819ea53ab88a02 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 21 Feb 2015 21:19:54 -0600 Subject: [PATCH 138/166] Fix CurrentChannel GVAR -> FUNC onEachFrame exits when channel control is closed --- addons/common/RscInfoType.hpp | 2 +- .../common/functions/fnc_currentChannel.sqf | 2 +- .../functions/fnc_onLoadRscDisplayChannel.sqf | 41 +++++++------ .../functions/fnc_initInsertMarker.sqf | 61 +++++++++++-------- 4 files changed, 59 insertions(+), 47 deletions(-) diff --git a/addons/common/RscInfoType.hpp b/addons/common/RscInfoType.hpp index d0b08c50c2..fe21b05265 100644 --- a/addons/common/RscInfoType.hpp +++ b/addons/common/RscInfoType.hpp @@ -26,5 +26,5 @@ class RscDisplayInventory { }; class RscDisplayChannel { - onLoad = QUOTE(_this call GVAR(onLoadRscDisplayChannel)); + onLoad = QUOTE(_this call FUNC(onLoadRscDisplayChannel)); }; diff --git a/addons/common/functions/fnc_currentChannel.sqf b/addons/common/functions/fnc_currentChannel.sqf index 115364fb24..a7ca8c1dd5 100644 --- a/addons/common/functions/fnc_currentChannel.sqf +++ b/addons/common/functions/fnc_currentChannel.sqf @@ -14,4 +14,4 @@ #define CHANNELS ["group", "side", "global", "command", "vehicle", "direct"] #define CHANNELS_LOCALIZED [localize "str_channel_group", localize "str_channel_side", localize "str_channel_global", localize "str_channel_command", localize "str_channel_vehicle", localize "str_channel_direct"] -CHANNELS select (CHANNELS_LOCALIZED find (uiNamespace getVariable ["ACE_currentChannel", ""])) max 0 +CHANNELS select (CHANNELS_LOCALIZED find (uiNamespace getVariable [QGVAR(currentChannel), ""])) max 0 diff --git a/addons/common/functions/fnc_onLoadRscDisplayChannel.sqf b/addons/common/functions/fnc_onLoadRscDisplayChannel.sqf index 2a2fbfc9a4..ae8113c1b8 100644 --- a/addons/common/functions/fnc_onLoadRscDisplayChannel.sqf +++ b/addons/common/functions/fnc_onLoadRscDisplayChannel.sqf @@ -1,24 +1,29 @@ /* - Name: FUNC(onLoadRscDisplayChannel) - - Author: Pabst Mirror, commy2 - - Description: - When the RscDisplayChannel is loaded, this will constantly uiNamespace variable "ACE_currentChannel" - with the raw localized text of CA_Channel (IDC=101). Only runs while the display is open. - - Parameters: - 0: DISPLAY - RscDisplayChannel - - Returns: - Nothing -*/ + * Author: Pabst Mirror, commy2 + * When the RscDisplayChannel is loaded, this will constantly uiNamespace variable ace_common_currentChannel + * with the raw localized text of CA_Channel (IDC=101). Only runs while the display is open. + * + * Arguments: + * 0: The RscDisplayChannel Display + * + * Return Value: + * Nothing + * + * Example: + * onLoad = QUOTE(_this call FUNC(onLoadRscDisplayChannel)); + * + * Public: No + */ #include "script_component.hpp" -uiNamespace setVariable ["ACE_ctrlChannel", (_this select 0) displayCtrl 101]; +uiNamespace setVariable [QGVAR(currentChannelControl), ((_this select 0) displayCtrl 101)]; ["ACE_currentChannel", "onEachFrame", { - if (ctrlText (uiNamespace getVariable ["ACE_ctrlChannel", controlNull]) != "") then { - uiNamespace setVariable ["ACE_currentChannel", ctrlText (uiNamespace getVariable ["ACE_ctrlChannel", controlNull])]; - }; + if (isNull (uiNamespace getVariable [QGVAR(currentChannelControl), controlNull])) then { + ["ACE_currentChannel", "onEachFrame"] call BIS_fnc_removeStackedEventHandler; + } else { + private "_localizedChannelText"; + _localizedChannelText = ctrlText (uiNamespace getVariable [QGVAR(currentChannelControl), controlNull]); + uiNamespace setVariable [QGVAR(currentChannel), _localizedChannelText]; + }; }] call BIS_fnc_addStackedEventhandler; diff --git a/addons/markers/functions/fnc_initInsertMarker.sqf b/addons/markers/functions/fnc_initInsertMarker.sqf index d172c6a532..e5328a7470 100644 --- a/addons/markers/functions/fnc_initInsertMarker.sqf +++ b/addons/markers/functions/fnc_initInsertMarker.sqf @@ -31,42 +31,49 @@ ctrlSetFocus _text; //Change ok button's text based on current channel - //if (isNull _buttonOK) exitWith {true}; + [{ + EXPLODE_2_PVT(_this,_params,_pfhId); + EXPLODE_1_PVT(_params,_buttonOK); - _channel = ""; - _textColor = [1,1,1,1]; - switch (call EFUNC(common,currentChannel)) do { + if (isNull _buttonOK) exitWith { + [_pfhId] call CBA_fnc_removePerFrameHandler; + }; + + _channel = ""; + _textColor = [1,1,1,1]; + switch (call EFUNC(common,currentChannel)) do { case ("global"): { - _channel = localize "str_channel_global"; - _textColor = [(216/255),(216/255),(216/255),1]; - }; + _channel = localize "str_channel_global"; + _textColor = [(216/255),(216/255),(216/255),1]; + }; case ("side"): { - _channel = localize "str_channel_side"; - _textColor = [(70/255),(211/255),(252/255),1]; - }; + _channel = localize "str_channel_side"; + _textColor = [(70/255),(211/255),(252/255),1]; + }; case ("group"): { - _channel = localize "str_channel_group"; - _textColor = [(181/255),(248/255),(98/255),1]; - }; + _channel = localize "str_channel_group"; + _textColor = [(181/255),(248/255),(98/255),1]; + }; case ("vehicle"): { - _channel = localize "str_channel_vehicle"; - _textColor = [(255/255),(208/255),(0/255),1]; - }; + _channel = localize "str_channel_vehicle"; + _textColor = [(255/255),(208/255),(0/255),1]; + }; case ("direct"): { - _channel = localize "str_channel_direct"; - _textColor = [(255/255),(255/255),(255/255),1]; - }; + _channel = localize "str_channel_direct"; + _textColor = [(255/255),(255/255),(255/255),1]; + }; case ("command"): { - _channel = localize "str_channel_command"; - _textColor = [(255/255),(255/255),(70/255),1]; + _channel = localize "str_channel_command"; + _textColor = [(255/255),(255/255),(70/255),1]; + }; }; - }; - //If localization not found, then don't touch anything (default is RscButtonMenuOK's localized text) - if (_channel != "") then { - _buttonOK ctrlSetTextColor _textColor; - _buttonOK ctrlSetText format [localize "STR_ACE_Markers_PlaceIn", _channel]; - }; + //If localization not found, then don't touch anything (default is RscButtonMenuOK's localized text) + if (_channel != "") then { + _buttonOK ctrlSetTextColor _textColor; + _buttonOK ctrlSetText format [localize "STR_ACE_Markers_PlaceIn", _channel]; + }; + }, 0, [_buttonOK]] call CBA_fnc_addPerFrameHandler; //--- Background _pos = ctrlposition _text; From 9f3a0fe8d49231a70cec116aba17642ab268a524 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 11:18:37 +0100 Subject: [PATCH 139/166] Removed displayInfo and displayMessage functions. --- .../functions/fnc_displayInformation.sqf | 64 ------------------- .../common/functions/fnc_displayMessage.sqf | 44 ------------- 2 files changed, 108 deletions(-) delete mode 100644 addons/common/functions/fnc_displayInformation.sqf delete mode 100644 addons/common/functions/fnc_displayMessage.sqf diff --git a/addons/common/functions/fnc_displayInformation.sqf b/addons/common/functions/fnc_displayInformation.sqf deleted file mode 100644 index 007e1c3e32..0000000000 --- a/addons/common/functions/fnc_displayInformation.sqf +++ /dev/null @@ -1,64 +0,0 @@ -/** - * fn_gui_displayInformation.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -#include "script_component.hpp" - -private["_title", "_content","_type","_display","_headerCtrl","_contentCtrl","_contentAmountOfChars","_pos","_icon","_iconCtrl"]; -_title = [_this, 0, "",[""]] call BIS_fnc_Param; -_content = [_this, 1, [""],[[""]]] call BIS_fnc_Param; -_type = [_this, 2, 0, [0]] call BIS_fnc_Param; -_icon = [_this, 3, "",[""]] call BIS_fnc_Param; - -if (_title != "") then { - ("ACE_RscDisplayInformation" call BIS_fnc_rscLayer) cutRsc ['ACE_RscDisplayInformation',"PLAIN"]; - - disableSerialization; - _display = uiNamespace getvariable 'ACE_RscDisplayInformation'; - if (!isnil "_display") then { - _headerCtrl = _display displayCtrl 1; - _headerCtrl ctrlSetText _title; - _iconCtrl = _display displayCtrl 10; - _iconCtrl ctrlSetText _icon; - - _idc = 2; - { - _text = _x; - if (_text != "") then { - _contentCtrl = _display displayCtrl _idc; - _contentCtrl ctrlSetText _text; - - _contentAmountOfChars = count (toArray _text); - _pos = ctrlPosition _contentCtrl; - _pos set [2, _contentAmountOfChars * ((((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)/ 3.3) max (safeZoneW / 11)]; - _contentCtrl ctrlSetPosition _pos; - _contentCtrl ctrlCommit 0; - - - if (_type >0) then { - if (_type == 1) then { - _contentCtrl ctrlSetBackgroundColor [0.7,0.2,0.2,0.8]; - _contentCtrl ctrlSetTextColor [1,1,1,0.9]; - }; - }; - _idc = _idc + 1; - }; - }foreach _content; - - while {(_idc < 7)} do { - _contentCtrl = _display displayCtrl _idc; - _contentCtrl ctrlSetPosition [0,0,0,0]; - _contentCtrl ctrlCommit 0; - - _idc = _idc + 1; - }; - }; -} else { - ("ACE_RscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; -}; \ No newline at end of file diff --git a/addons/common/functions/fnc_displayMessage.sqf b/addons/common/functions/fnc_displayMessage.sqf deleted file mode 100644 index 7b3274cfc4..0000000000 --- a/addons/common/functions/fnc_displayMessage.sqf +++ /dev/null @@ -1,44 +0,0 @@ -/** - * fn_gui_displayMessage.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -#include "script_component.hpp" - -private["_title", "_content","_type","_display","_headerCtrl","_contentCtrl","_contentAmountOfChars","_pos"]; -_title = [_this, 0, "",[""]] call BIS_fnc_Param; -_content = [_this, 1, "",[""]] call BIS_fnc_Param; -_type = [_this, 2, 0, [0]] call BIS_fnc_Param; - -if (_title != "" && _content != "") then { - ("ACE_RscDisplayMessage" call BIS_fnc_rscLayer) cutRsc ['ACE_RscDisplayMessage',"PLAIN"]; - - disableSerialization; - _display = uiNamespace getvariable 'ACE_RscDisplayMessage'; - if (!isnil "_display") then { - _headerCtrl = _display displayCtrl 1; - _contentCtrl = _display displayCtrl 2; - - _headerCtrl ctrlSetText _title; - _contentCtrl ctrlSetText _content; - - // TODO get a font that has the same width characters for all. Ask Jaynus. - _contentAmountOfChars = count (toArray _content); - _pos = ctrlPosition _contentCtrl; - _pos set [2, _contentAmountOfChars * ((((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)/ 3.3) max (safeZoneW / 11)]; - _contentCtrl ctrlSetPosition _pos; - _contentCtrl ctrlCommit 0; - - if (_type >0) then { - if (_type == 1) then { - _contentCtrl ctrlSetBackgroundColor [0.7,0.2,0.2,0.8]; - _contentCtrl ctrlSetTextColor [1,1,1,0.9]; - }; - }; - }; -}; \ No newline at end of file From a57448716627668463ab1ef7337cb1202ee8f1b0 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 11:19:10 +0100 Subject: [PATCH 140/166] Added localization support for displayText --- .../functions/fnc_displayTextPicture.sqf | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index 060f04f591..4c175b0e27 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -1,30 +1,27 @@ /* - * Author: commy2 + * Author: commy2, Glowbal * * Display a structured text with image. * * Argument: - * 0: Text (Anything) - * 1: Image (String) + * 0: Text + * 1: Image * * Return value: * Nothing */ + #include "script_component.hpp" private ["_text", "_image"]; - _text = _this select 0; _image = _this select 1; if (typeName _text != "TEXT") then { - _text = parseText format ["%1", _text]; + if (typeName _text == "STRING" && {isLocalized _text}) then { + _text = localize _text; + }; + _text = parseText format ["%1", _text]; }; - -_text = composeText [ - parseText format ["", _image], - lineBreak, - _text -]; - -[_text] call FUNC(displayTextStructured); +_text = composeText [parseText format ["", _image], lineBreak, _text]; +[_text, 2] call FUNC(displayTextStructured); From 8393645df911d376c8ec8da8648b024b3585a8d1 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 11:19:32 +0100 Subject: [PATCH 141/166] Changed position to be inline with the weapon selector UI element by default --- addons/common/config.cpp | 2 +- .../functions/fnc_displayTextStructured.sqf | 24 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/addons/common/config.cpp b/addons/common/config.cpp index b86744f0a9..000adc639f 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -125,7 +125,7 @@ class CfgUIGrids { class Presets { class Arma3 { class Variables { - grid_ACE_displayText[] = {{safeZoneW + safeZoneX - 0.175 * safezoneW, safeZoneY + 0.175 * safezoneH, 0.15 * safeZoneW, 0.125 * SafeZoneH}, "(((safezoneW / safezoneH) min 1.2) / 40)","((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"}; + grid_ACE_displayText[] = {{((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40)),safeZoneY + 0.175 * safezoneH, (10 *(((safezoneW / safezoneH) min 1.2) / 40)), (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))}, "(((safezoneW / safezoneH) min 1.2) / 40)","((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"}; }; }; }; diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index e103c904b3..4f5c7737a9 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -1,15 +1,16 @@ /* - * Author: commy2 + * Author: commy2, Glowbal * * Display a structured text. * * Argument: - * 0: Text (Anything) - * 1: Size of the textbox (Number, optional default: 1) + * 0: Text + * 1: Size of the textbox * * Return value: * Nothing */ + #include "script_component.hpp" private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position"]; @@ -34,11 +35,18 @@ disableSerialization; _ctrlHint = uiNamespace getVariable "ACE_ctrlHint"; _ctrlHint ctrlSetBackgroundColor GVAR(displayTextColor); - -_xPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_X", safeZoneW + safeZoneX - 0.175 * safezoneW]; +/* +// This does not function at the moment. Has been disabled until it fixed. +_xPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_X", ((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40))]; _yPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_Y", safeZoneY + 0.175 * safezoneH]; -_wPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_W", 0.15 * safeZoneW]; -_hPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_H", 0.125 * SafeZoneH]; +_wPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_W", (10 *(((safezoneW / safezoneH) min 1.2) / 40))]; +_hPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_H", (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))]; +*/ + +_xPos = ((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40)); +_yPos = safeZoneY + 0.175 * safezoneH; +_wPos = (10 *(((safezoneW / safezoneH) min 1.2) / 40)); +_hPos = (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)); _position = [_xPos, _yPos, _wPos, _size * _hPos]; _ctrlHint ctrlSetPosition _position; @@ -46,4 +54,4 @@ _ctrlHint ctrlCommit 0; _ctrlHint ctrlSetStructuredText _text; _ctrlHint ctrlSetPosition _position; -_ctrlHint ctrlCommit ([0.2, 0] select _isShown); +_ctrlHint ctrlCommit ([0.5, 0] select _isShown); From 1ed50bfe3e5653dfa367a076dfa5c9e2cd33f7e5 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 11:35:52 +0100 Subject: [PATCH 142/166] Fixed font size --- addons/common/HintConfig.hpp | 8 ++++---- addons/common/functions/fnc_displayTextStructured.sqf | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/common/HintConfig.hpp b/addons/common/HintConfig.hpp index 28346c3da3..235b553f53 100644 --- a/addons/common/HintConfig.hpp +++ b/addons/common/HintConfig.hpp @@ -17,8 +17,8 @@ class RscTitles { class HintBox: RscStructuredText { idc = 1; text = ""; - size = "1 / 40 / (getResolution select 5)"; - sizeEx = 1; + //size = "1 / 40 / (getResolution select 5)"; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; colorText[] = {1, 1, 1, 1}; colorBackground[] = {0, 0, 0, 0.5}; x = safeZoneW + safeZoneX - 0 * safezoneW; //safeZoneW + safeZoneX - 0.2 * safezoneW; @@ -41,8 +41,8 @@ class RscTitles { class HintBox: RscStructuredText { idc = 1; text = ""; - size = "1 / 40 / (getResolution select 5)"; - sizeEx = 1; + //size = "1 / 40 / (getResolution select 5)"; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; colorText[] = {1, 1, 1, 1}; colorBackground[] = {0.8, 0, 0, 0.5}; x = 0.3 * safeZoneW + safeZoneX; diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 4f5c7737a9..613f06c1e2 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -18,7 +18,7 @@ private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", " _text = _this select 0; _size = _this select 1; -if (isNil "_size") then {_size = 1}; +if (isNil "_size") then {_size = 1.5}; if (typeName _text != "TEXT") then { if (typeName _text == "STRING" && {isLocalized _text}) then { From 14411a5ef085028470c373db56f788d0f0bfef38 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 11:36:21 +0100 Subject: [PATCH 143/166] Fixed weird fix for getNumber for Array bug in setSettingFromConfig. --- addons/common/functions/fnc_setSettingFromConfig.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/functions/fnc_setSettingFromConfig.sqf b/addons/common/functions/fnc_setSettingFromConfig.sqf index 577f3083e6..27c727acab 100644 --- a/addons/common/functions/fnc_setSettingFromConfig.sqf +++ b/addons/common/functions/fnc_setSettingFromConfig.sqf @@ -18,7 +18,7 @@ _fnc_getValueWithType = { EXPLODE_2_PVT(_this,_optionEntry,_typeName); _valueConfig = (_optionEntry >> "value"); - _value = if (!(isArray _valueConfig) && !(isText _valueConfig)) then { getNumber (_optionEntry >> "value"); } else { 0 }; + _value = if (isNumber (_optionEntry >> "value")) then {getNumber (_optionEntry >> "value")} else {0}; TRACE_3("_fnc_getValueWithType:", configName _optionEntry, _typeName, _value); if (_typeName == "BOOL") exitWith { _value > 0 From 323d673eec05f39897a80009cc1e86ef15a8079c Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 13:20:17 +0100 Subject: [PATCH 144/166] Removed deprecated config entries (DisplayMessage and DisplayInformation) --- addons/common/HintConfig.hpp | 95 ------------------------------------ 1 file changed, 95 deletions(-) diff --git a/addons/common/HintConfig.hpp b/addons/common/HintConfig.hpp index 235b553f53..5dc0e6384a 100644 --- a/addons/common/HintConfig.hpp +++ b/addons/common/HintConfig.hpp @@ -52,101 +52,6 @@ class RscTitles { }; }; }; - class ACE_RscDisplayMessage { - duration = 7; - idd = 86411; - movingenable = 0; - onLoad = "uiNamespace setVariable ['ACE_RscDisplayMessage', _this select 0];"; - fadein = 0; - class controlsBackground { - class header: ACE_gui_staticBase { - idc = 1; - type = CT_STATIC; - x = "safezoneX + (safezoneW / 10)"; - y = "safezoneY + (30 * (safeZoneH / 40))"; - w = "(safeZoneW / 10)"; - h = "(safeZoneH / 40)"; - style = ST_LEFT; - font = FontCSE; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.85, 0.85, 0.85, 1.0}; - colorBackground[] = {0, 0, 0, 0.9}; - text = ""; - }; - class text: header { - idc = 2; - y = "safezoneY + (31 * (safeZoneH / 40))"; - w = "(safeZoneW / 10) * 1.3"; - colorText[] = {0.0, 0.0, 0.0, 1.0}; - colorBackground[] = {1, 1, 1, 0.9}; - text = ""; - }; - }; - }; - - class ACE_RscDisplayInformation { - duration = 15; - idd = 86412; - movingenable = 0; - onLoad = "uiNamespace setVariable ['ACE_RscDisplayInformation', _this select 0];"; - fadein = 0; - class controlsBackground { - class header: ACE_gui_staticBase { - idc = 1; - type = CT_STATIC; - x = "safezoneX + (safezoneW / 10)"; - y = "safezoneY + (6 * (safeZoneH / 40))"; - w = "(safeZoneW / 10)"; - h = "(safeZoneH / 40)"; - style = ST_LEFT; - font = FontCSE; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.85, 0.85, 0.85, 1.0}; - colorBackground[] = {0, 0, 0, 0.9}; - text = ""; - }; - class text: header { - idc = 2; - y = "safezoneY + (7.1 * (safeZoneH / 40))"; - w = "(safeZoneW / 10) * 1.3"; - colorText[] = {0.0, 0.0, 0.0, 1.0}; - colorBackground[] = {1, 1, 1, 0.9}; - text = ""; - }; - class text2: text { - idc = 3; - y = "safezoneY + (8.2 * (safeZoneH / 40))"; - }; - class text3: text { - idc = 4; - y = "safezoneY + (9.3 * (safeZoneH / 40))"; - }; - class text4: text { - idc = 5; - y = "safezoneY + (10.4 * (safeZoneH / 40))"; - }; - class text5: text { - idc = 6; - y = "safezoneY + (11.5 * (safeZoneH / 40))"; - }; - - - class icon: ACE_gui_backgroundBase { - type = CT_STATIC; - idc = 10; - style = ST_PICTURE; - colorBackground[] = {0,0,0,1}; - colorText[] = {1, 1, 1, 1}; - font = FontCSE; - text = ""; - sizeEx = 0.032; - x = "safezoneX + (safezoneW / 10)"; - y = "safezoneY + (4 * (safeZoneH / 40))"; - w = "(safeZoneH / 40)*2"; - h = "(safeZoneH / 40)*2"; - }; - }; - }; class ACE_EventHandlerHelper: ACE_Rsc_Display_Base { idd = -1; From 9d44ec18b861d73d2d4126e4493646e496e4d960 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 13:35:05 +0100 Subject: [PATCH 145/166] Added a default text color setting --- addons/common/config.cpp | 7 +++++++ addons/common/functions/fnc_displayTextStructured.sqf | 1 + addons/common/stringtable.xml | 8 +++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/addons/common/config.cpp b/addons/common/config.cpp index bbce1ae77b..ed1f947db9 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -110,6 +110,13 @@ class ACE_Settings { displayName = "$STR_ACE_Common_SettingDisplayTextColorName"; description = "$STR_ACE_Common_SettingDisplayTextColorDesc"; }; + class GVAR(displayTextFontColor) { + value[] = {1,1,1,1}; + typeName = "COLOR"; + isClientSetable = 1; + displayName = "$STR_ACE_Common_SettingDisplayTextFontColorName"; + description = "$STR_ACE_Common_SettingDisplayTextFontColorDesc"; + }; }; #include "define.hpp" diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 613f06c1e2..054e98de70 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -35,6 +35,7 @@ disableSerialization; _ctrlHint = uiNamespace getVariable "ACE_ctrlHint"; _ctrlHint ctrlSetBackgroundColor GVAR(displayTextColor); +_ctrlHint ctrlSetTextColor GVAR(displayTextFontColor); /* // This does not function at the moment. Has been disabled until it fixed. _xPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_X", ((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40))]; diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 3ece4206d7..7e2920f11c 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -326,7 +326,13 @@ The color of the background from the ACE hints. - + + + Hint text font color + + + The color of the text font from the ACE hints. This color is the default color for all text displayed through the ACE Hint system, if the hint text has no other color specified. + \ No newline at end of file From dd51037c5e7fcb58167df1d95a9b1644de65cba0 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 13:44:17 +0100 Subject: [PATCH 146/166] Added support for image color --- addons/common/functions/fnc_displayTextPicture.sqf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index 4c175b0e27..8472b3d1b6 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -6,6 +6,7 @@ * Argument: * 0: Text * 1: Image + * 2: Image color * * Return value: * Nothing @@ -13,9 +14,11 @@ #include "script_component.hpp" -private ["_text", "_image"]; +private ["_text", "_image", "_imageColor"]; _text = _this select 0; _image = _this select 1; +_imageColor = if (count _this > 2) then {_this select 2} else {[1,1,1]}; +_imageColor resize 3; if (typeName _text != "TEXT") then { if (typeName _text == "STRING" && {isLocalized _text}) then { @@ -23,5 +26,5 @@ if (typeName _text != "TEXT") then { }; _text = parseText format ["%1", _text]; }; -_text = composeText [parseText format ["", _image], lineBreak, _text]; +_text = composeText [parseText format ["", _image, _imageColor call BIS_fnc_colorRGBtoHTML], lineBreak, _text]; [_text, 2] call FUNC(displayTextStructured); From 77666e80978a3ba2b64a8946ee02d7c4a1d37f70 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 13:58:51 +0100 Subject: [PATCH 147/166] Added weapon resting state icon --- addons/resting/data/icons/icon_bipod.paa | Bin 0 -> 5625 bytes addons/resting/functions/fnc_restWeapon.sqf | 3 +++ addons/resting/functions/fnc_unRestWeapon.sqf | 4 ++++ 3 files changed, 7 insertions(+) create mode 100644 addons/resting/data/icons/icon_bipod.paa diff --git a/addons/resting/data/icons/icon_bipod.paa b/addons/resting/data/icons/icon_bipod.paa new file mode 100644 index 0000000000000000000000000000000000000000..c2b6a2fb3e1b92e0b33034dbd7dbffc855baa9e0 GIT binary patch literal 5625 zcmeGg3s6*5^gebU5tF-+Y)U{bilpV3&g7<{?%R~lIx0KGBd0CC*hd+t5= z-1EQZKAuKLTjHif$6K_7kmly*Q4F7DnSnS3Ks?$qJqmFS9>m{>ii#EB|1x;8{0PYo zAY_Aqkkjz=4g?|)0vsMNj3CzBFl(-sQbI&gG-xhLsZR3uK?N5;hQ}L5RhU-hz4}8N z>WfaC(G+-kRR_A4paaOTby8$4VAX)54|Qeh?NvFK%{XrZ0YK4oLpf z5J^E^X+=1b7Zjoq{x%etQoHN7Zdt~0758{z>y*+frQsUdv2N5Wp0f3gEmz4y@-)}ad`^`txhgQnOrn6!cLvS<_BisM-INTQ6Zk>5iE}Tj!2JTpK_*S~YeN(fDyH z{c{qf=W@CcWtMnrXQq78+{N?<^@VsMemH6Q!0|Y16D*d8t+no^dN%BGR8q;|lb@hG z9Js!qvAq!dovF(2e`xs(=Z;jCzqYtI@n(64mRF|NwWf74ZF!zweFj%zyp%wMc%8{%6dVtiO(+3HI(Wa4kNt<;AVag8Xxo>ohn z%N#P(mw>C{L$mlVDwzbnvb4L!?prp-P`|{u^Q3+4Ls?rPu< zz=bxf>pE4a#J``PAcS68y0`k;k8^PUhp#;$11?HQwHI97`4F8v1bjs&rDocEg3{nR zLY^F#2lXi|Ha86AgYtY!yx-H_%{E;v(bwa84)S4O8I{Xua{<}|^?fGm+BWmyv%_&7 zfD2{$xPt8m{Y9_s&A8mPexk_p`jZ!+Iu+3GU9dT<(;mp|D%Z=UihO4W(|kCCSY=+o4E@Rn9@UYrof;>#aQ9Q)<=0ZtGRo)8B?2OW#0Ctn1Z&(E$BoKs)9`Ash%3 zA-2juKA^w*9<KPXDj>g?z5HuGgY|BEO8!GZ^FFsRd$^Puq-ZM|D$cWb zfR{4jzh5tx(>4cUk7GOpPm+?={4+rQjcbA88=vg92V9wI=~aE8yKjaB?47m$r#2EJ zWR=GbfOuLN9J~`A`MZ=_9#hf9(hl-6Yz@@J1+uvs(-xfIe}`lFPW*5$1S33ZX!pcz zE-7_WMjDhsxMsmQL>KZfy(|)s#SL%H*3q*_jmKnuTX?uHG1qVFDjl+PpOO~W6T=8p zx8ski5sdKQJRCzee71@aGiNgL!#02XN9HA_oyxI`2k+3vPruu8FrCc<3r-iW zx9iG?9_ax*1~vk6Kl=~Ql@cT1B*67N^qE77kL($eDIaz76Mzi^BfOE{)QfONo6>8l znS4AyvcY7G{&>*WNblJkXjOXn%fJZl+sUJ8HZ63uHl4>y2y|hbca1~d|80m9udQ$m z@mxFA^?pUBvic^gg43~ zy7HUksAQ+2FDIt#-k#tra$lot*VA03=K`g~AgB~b58E52JM4R_>2U|fgVDrTvzJP* zj`SDKL%e9Md1~7xMmJq^bk{3w6YRzL7w-shW_4Afd_Ax2{k8us`h0#&KLQ4EKaPhs zWp0kAO|D(J3u z4q#ybx97OPy4myJ$(YaNfo7D`k=PaLY1y;;Rrvv121a-zfA7s1X)aR|mdEKX}I1x+y Date: Sun, 22 Feb 2015 14:38:48 +0100 Subject: [PATCH 148/166] Added option to toggle between progressbar top and bottom --- addons/common/ProgressScreen.hpp | 4 ++-- addons/common/config.cpp | 9 +++++++++ addons/common/functions/fnc_progressBar.sqf | 13 +++++++++++++ addons/common/stringtable.xml | 6 ++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/addons/common/ProgressScreen.hpp b/addons/common/ProgressScreen.hpp index d7df49efdf..751d48af9f 100644 --- a/addons/common/ProgressScreen.hpp +++ b/addons/common/ProgressScreen.hpp @@ -17,7 +17,7 @@ class GVAR(ProgressBar_Dialog) { type = 0; style = 0; size = 1; - colorBackground[] = {0, 0, 0, 0.1}; + colorBackground[] = {0, 0, 0, 0.0}; colorText[] = {0, 0, 0, 0}; x = "safezoneX"; y = "safezoneY"; @@ -31,7 +31,7 @@ class GVAR(ProgressBar_Dialog) { y = "0.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; h = ".8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - colorFrame[] = {0,0,0,0.025}; + colorFrame[] = {0,0,0,0.0}; colorBar[] = {0.27,0.5,0.31,0.8}; texture = "#(argb,8,8,3)color(1,1,1,0.7)"; }; diff --git a/addons/common/config.cpp b/addons/common/config.cpp index ed1f947db9..d562d185ec 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -103,6 +103,15 @@ class ACE_Settings { description = "$STR_ACE_Common_SettingFeedbackIconsDesc"; values[] = {"Hide", "Top right, downwards", "Top right, to the left", "Top left, downwards", "Top left, to the right"}; }; + class GVAR(SettingProgressBarLocation) { + value = 0; + typeName = "SCALAR"; + force = 0; + isClientSetable = 1; + displayName = "$STR_ACE_Common_SettingProgressbarLocationName"; + description = "$STR_ACE_Common_SettingProgressbarLocationDesc"; + values[] = {"Top", "Bottom"}; + }; class GVAR(displayTextColor) { value[] = {0,0,0,0.1}; typeName = "COLOR"; diff --git a/addons/common/functions/fnc_progressBar.sqf b/addons/common/functions/fnc_progressBar.sqf index 1d73cccc79..0b8fcc7ac4 100644 --- a/addons/common/functions/fnc_progressBar.sqf +++ b/addons/common/functions/fnc_progressBar.sqf @@ -15,6 +15,9 @@ * * Return value: * Nothing +* +* Example: +* [5, [], {Hint "Finished!"}, {hint "Failure!"}, "My Title"] call ace_common_fnc_progressBar */ #include "script_component.hpp" @@ -32,6 +35,16 @@ closeDialog 0; createDialog QGVAR(ProgressBar_Dialog); (uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlSetText _localizedTitle; +if (GVAR(SettingProgressBarLocation) == 1) then { + private "_ctrlPos"; + _ctrlPos = [1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2), 29 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2), 38 * (((safezoneW / safezoneH) min 1.2) / 40), 0.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)]; + (uiNamespace getVariable QGVAR(ctrlProgressBar)) ctrlSetPosition _ctrlPos; + (uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlSetPosition _ctrlPos; + (uiNamespace getVariable QGVAR(ctrlProgressBar)) ctrlCommit 0; + (uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlCommit 0; +}; + + _perFrameFunction = { PARAMS_2(_parameters,_pfhID); EXPLODE_8_PVT(_parameters,_args,_onFinish,_onFail,_condition,_player,_startTime,_totalTime,_exceptions); diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 7e2920f11c..d1462c1214 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -321,6 +321,12 @@ Select the position of or disable the feedback icons on your screen. These icons will show to provide extra feedback on your character status and actions performed. + + Progress bar location + + + Set the desired location of the progress bar on your screen. + Hint Background color From 82c181cd7c9bd5c1b7dca0ee4ffc84fac9cf0acb Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 14:54:54 +0100 Subject: [PATCH 149/166] Fixed header --- addons/common/functions/fnc_displayIcon.sqf | 31 +++++++++++++-------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/addons/common/functions/fnc_displayIcon.sqf b/addons/common/functions/fnc_displayIcon.sqf index 94fa887da9..1fbc4e89aa 100644 --- a/addons/common/functions/fnc_displayIcon.sqf +++ b/addons/common/functions/fnc_displayIcon.sqf @@ -1,14 +1,23 @@ -/** - * fn_gui_displayIcon.sqf - * @Descr: - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: true - * - * @Example ["myID", true, QUOTE(PATHTOF(data\icon_group.paa)), [1,1,1,1], 0] call ace_gui_fnc_displayIcon; - */ +/* +* Author: Glowbal +* +* Draw progress bar and execute given function if succesful. +* Finish/Failure/Conditional are all passed [_args, _elapsedTime, _totalTime, _errorCode] +* +* Argument: +* 0: icon ID +* 1: show +* 2: Icon Path +* 3: Icon color +* 4: timeAlive. -1 = forever +* +* Return value: +* Nothing +* +* Example: +* ["myID", true, QUOTE(PATHTOF(data\icon_group.paa)), [1,1,1,1], 0] call ace_gui_fnc_displayIcon; +*/ + #include "script_component.hpp" From 6fde2de40f4b7d08eefa5b2aaa6cc851e582b482 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 24 Feb 2015 17:14:19 +0100 Subject: [PATCH 150/166] Improved localization support and sendDisplayText to remote client objects. --- .../functions/fnc_displayTextPicture.sqf | 19 ++++++++++++++++-- .../functions/fnc_displayTextStructured.sqf | 20 +++++++++++++++---- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index 8472b3d1b6..6216adb20e 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -14,14 +14,29 @@ #include "script_component.hpp" -private ["_text", "_image", "_imageColor"]; +private ["_text", "_image", "_imageColor", "_target"]; _text = _this select 0; _image = _this select 1; _imageColor = if (count _this > 2) then {_this select 2} else {[1,1,1]}; _imageColor resize 3; +_target = if (count _this > 3) then {_this select 3} else {ACE_player}; + +if (!local _target && {_target != ACE_player}) exitwith { + [_this, QUOTE(DFUNC(displayTextPicture)), _target] call FUNC(execRemoteFnc); +}; if (typeName _text != "TEXT") then { - if (typeName _text == "STRING" && {isLocalized _text}) then { + if (typeName _text == "ARRAY") then { + if (count _text > 0) then { + { + if (typeName _x == "STRING" && {isLocalized _x}) then { + _text set [_foreachIndex, localize _x]; + }; + }foreach _text; + _text = format _text; + }; + }; + if (typeName _text == "STRING" && {isLocalized _text}) then { _text = localize _text; }; _text = parseText format ["%1", _text]; diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 054e98de70..be3e4b585b 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -13,14 +13,26 @@ #include "script_component.hpp" -private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position"]; - +private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position", "_target"]; _text = _this select 0; -_size = _this select 1; +_size = if (count _this > 1) then {_this select 1} else {0.1;}; +_target = if (count _this > 2) then {_this select 2} else {ACE_player}; -if (isNil "_size") then {_size = 1.5}; +if (!local _target && {_target != ACE_player}) exitwith { + [_this, QUOTE(DFUNC(displayTextStructured)), _target] call FUNC(execRemoteFnc); +}; if (typeName _text != "TEXT") then { + if (typeName _text == "ARRAY") then { + if (count _text > 0) then { + { + if (typeName _x == "STRING" && {isLocalized _x}) then { + _text set [_foreachIndex, localize _x]; + }; + }foreach _text; + _text = format _text; + }; + }; if (typeName _text == "STRING" && {isLocalized _text}) then { _text = localize _text; }; From 85c568a061c4d9ac215fd4d2b2457f8b229dda7b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 24 Feb 2015 10:27:53 -0600 Subject: [PATCH 151/166] Comments --- addons/captives/functions/fnc_handleZeusDisplayChanged.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf index 2299fa7031..84b90e78c2 100644 --- a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf +++ b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf @@ -1,6 +1,6 @@ /* * Author: PabstMirror - * Handles handles ZeusDisplayChanged event + * Handles ZeusDisplayChanged event * Need to reset showHUD after closing zeus * * Arguments: From 278f0ab889cb3e5a19f80d67f97f5478ae1213f4 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 24 Feb 2015 18:02:41 +0100 Subject: [PATCH 152/166] Fixed indentation Added check for AI units --- .../functions/fnc_displayTextPicture.sqf | 27 ++++++++++--------- .../functions/fnc_displayTextStructured.sqf | 23 ++++++++-------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index 6216adb20e..9885524db7 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -22,24 +22,25 @@ _imageColor resize 3; _target = if (count _this > 3) then {_this select 3} else {ACE_player}; if (!local _target && {_target != ACE_player}) exitwith { - [_this, QUOTE(DFUNC(displayTextPicture)), _target] call FUNC(execRemoteFnc); + [_this, QUOTE(DFUNC(displayTextPicture)), _target] call FUNC(execRemoteFnc); }; +if (_target != ACE_player) exitWith {}; if (typeName _text != "TEXT") then { - if (typeName _text == "ARRAY") then { - if (count _text > 0) then { - { - if (typeName _x == "STRING" && {isLocalized _x}) then { - _text set [_foreachIndex, localize _x]; - }; - }foreach _text; - _text = format _text; - }; - }; - if (typeName _text == "STRING" && {isLocalized _text}) then { + if (typeName _text == "ARRAY") then { + if (count _text > 0) then { + { + if (typeName _x == "STRING" && {isLocalized _x}) then { + _text set [_foreachIndex, localize _x]; + }; + }foreach _text; + _text = format _text; + }; + }; + if (typeName _text == "STRING" && {isLocalized _text}) then { _text = localize _text; }; - _text = parseText format ["%1", _text]; + _text = parseText format ["%1", _text]; }; _text = composeText [parseText format ["", _image, _imageColor call BIS_fnc_colorRGBtoHTML], lineBreak, _text]; [_text, 2] call FUNC(displayTextStructured); diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index be3e4b585b..90f066057b 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -19,20 +19,21 @@ _size = if (count _this > 1) then {_this select 1} else {0.1;}; _target = if (count _this > 2) then {_this select 2} else {ACE_player}; if (!local _target && {_target != ACE_player}) exitwith { - [_this, QUOTE(DFUNC(displayTextStructured)), _target] call FUNC(execRemoteFnc); + [_this, QUOTE(DFUNC(displayTextStructured)), _target] call FUNC(execRemoteFnc); }; +if (_target != ACE_player) exitWith {}; if (typeName _text != "TEXT") then { - if (typeName _text == "ARRAY") then { - if (count _text > 0) then { - { - if (typeName _x == "STRING" && {isLocalized _x}) then { - _text set [_foreachIndex, localize _x]; - }; - }foreach _text; - _text = format _text; - }; - }; + if (typeName _text == "ARRAY") then { + if (count _text > 0) then { + { + if (typeName _x == "STRING" && {isLocalized _x}) then { + _text set [_foreachIndex, localize _x]; + }; + }foreach _text; + _text = format _text; + }; + }; if (typeName _text == "STRING" && {isLocalized _text}) then { _text = localize _text; }; From 37031b5002ec9b0630ceb1bcd757f8adf7698b8d Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 24 Feb 2015 18:10:40 +0100 Subject: [PATCH 153/166] Replaced execRemoteFnc by ACE event system --- addons/common/XEH_postInit.sqf | 3 +++ addons/common/functions/fnc_displayTextPicture.sqf | 3 --- addons/common/functions/fnc_displayTextStructured.sqf | 3 --- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index dbb665d446..35b0f5c3fe 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -158,3 +158,6 @@ GVAR(OldPlayerTurret) = [ACE_player] call FUNC(getTurretIndex); PARAMS_2(_vehicle,_fuelLevel); _vehicle setFuel _fuelLevel; }] call FUNC(addEventhandler); + +["displayTextStructured", FUNC(displayTextStructured)] call FUNC(addEventhandler); +["displayTextPicture", FUNC(displayTextPicture)] call FUNC(addEventhandler); diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index 9885524db7..a2c6ec51e1 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -21,9 +21,6 @@ _imageColor = if (count _this > 2) then {_this select 2} else {[1,1,1]}; _imageColor resize 3; _target = if (count _this > 3) then {_this select 3} else {ACE_player}; -if (!local _target && {_target != ACE_player}) exitwith { - [_this, QUOTE(DFUNC(displayTextPicture)), _target] call FUNC(execRemoteFnc); -}; if (_target != ACE_player) exitWith {}; if (typeName _text != "TEXT") then { diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 90f066057b..3953f218d0 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -18,9 +18,6 @@ _text = _this select 0; _size = if (count _this > 1) then {_this select 1} else {0.1;}; _target = if (count _this > 2) then {_this select 2} else {ACE_player}; -if (!local _target && {_target != ACE_player}) exitwith { - [_this, QUOTE(DFUNC(displayTextStructured)), _target] call FUNC(execRemoteFnc); -}; if (_target != ACE_player) exitWith {}; if (typeName _text != "TEXT") then { From 5364980997d49662a57126c17f002d8e590f5b58 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 24 Feb 2015 11:36:49 -0600 Subject: [PATCH 154/166] Zeus Module Hints --- .../functions/fnc_moduleSurrender.sqf | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index 9311c7a1b9..07e7c1b9ad 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -27,24 +27,25 @@ if (local _logic) then { if ((count _bisMouseOver) == 2) then {//check what mouse was over before the module was placed _mouseOverObject = _bisMouseOver select 1; if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then { - systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)]; - - if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then { - ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent); + TRACE_2("Debug - module surrendering %1",_mouseOverObject,(name _mouseOverObject)); + if (alive _mouseOverObject) then { + if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then { + ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent); + } else { + ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent); + }; } else { - ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent); + ["STR_ACE_Captives_Zeus_OnlyAlive"] call EFUNC(commmon,displayTextStructured); }; - } else { - systemChat format ["Only use on dismounted inf"]; + ["STR_ACE_Captives_Zeus_OnlyInfentry"] call EFUNC(commmon,displayTextStructured); }; } else { - systemChat format ["Nothing under mouse"]; + ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(commmon,displayTextStructured); }; } else {//an editor module { - systemChat format ["Debug - module surrendering %1", (name _x)]; - [_x, true] call FUNC(setSurrendered); + ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent); } forEach _units; }; From ae3de331c465b5a3590c5b226ec80c82db6f6dff Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 24 Feb 2015 11:51:37 -0600 Subject: [PATCH 155/166] Module At Mission Start (Issue #148) --- addons/captives/functions/fnc_moduleSurrender.sqf | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index 07e7c1b9ad..1c10779220 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -43,10 +43,15 @@ if (local _logic) then { } else { ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(commmon,displayTextStructured); }; - } else {//an editor module - { - ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent); - } forEach _units; + } else { + //an editor module + //Modules run before postInit can instal the event handler, so we need to wait a little bit + [{ + PARAMS_1(_units); + { + ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent); + } forEach _units; + }, [_units], 0.05, 0.05]call EFUNC(common,waitAndExecute); }; deleteVehicle _logic; From 97d18899716f31d709bd44c72525785cd9a1bb5a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 24 Feb 2015 12:40:22 -0600 Subject: [PATCH 156/166] Shift Display to Right if Zeus Interface is open --- addons/common/functions/fnc_displayTextStructured.sqf | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 3953f218d0..6e8851a099 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -58,6 +58,12 @@ _xPos = ((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40) _yPos = safeZoneY + 0.175 * safezoneH; _wPos = (10 *(((safezoneW / safezoneH) min 1.2) / 40)); _hPos = (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)); + +//Zeus Interface Open and Display would be under the "CREATE" list +if (!isnull curatorCamera) then { + _xPos = _xPos min ((safezoneX + safezoneW - 12.5 * (((safezoneW / safezoneH) min 1.2) / 40)) - _wPos); +}; + _position = [_xPos, _yPos, _wPos, _size * _hPos]; _ctrlHint ctrlSetPosition _position; From 80ac6d83deba2fd2d8327f7e7191665b326890e7 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 24 Feb 2015 12:44:54 -0600 Subject: [PATCH 157/166] Zeus Module Messages --- addons/captives/functions/fnc_moduleSurrender.sqf | 6 +++--- addons/captives/stringtable.xml | 11 ++++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index 1c10779220..1a335131a8 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -35,13 +35,13 @@ if (local _logic) then { ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent); }; } else { - ["STR_ACE_Captives_Zeus_OnlyAlive"] call EFUNC(commmon,displayTextStructured); + ["STR_ACE_Captives_Zeus_OnlyAlive"] call EFUNC(common,displayTextStructured); }; } else { - ["STR_ACE_Captives_Zeus_OnlyInfentry"] call EFUNC(commmon,displayTextStructured); + ["STR_ACE_Captives_Zeus_OnlyInfentry"] call EFUNC(common,displayTextStructured); }; } else { - ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(commmon,displayTextStructured); + ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(common,displayTextStructured); }; } else { //an editor module diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 7d8096b3e6..f03f30a113 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -1,5 +1,5 @@  - + @@ -136,5 +136,14 @@ Stop Surrendering + + Only use on alive units + + + Only use on dismounted inf + + + Nothing under mouse + \ No newline at end of file From e10c907454f12750a8a223653dd17c972f095e7c Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 24 Feb 2015 20:25:34 +0100 Subject: [PATCH 158/166] Added missing header arguments --- addons/common/functions/fnc_displayTextPicture.sqf | 1 + addons/common/functions/fnc_displayTextStructured.sqf | 1 + 2 files changed, 2 insertions(+) diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index a2c6ec51e1..fadf28b480 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -7,6 +7,7 @@ * 0: Text * 1: Image * 2: Image color + * 3: Target Unit. Will only display if target is the player controlled object * * Return value: * Nothing diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 3953f218d0..f1761c39a7 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -6,6 +6,7 @@ * Argument: * 0: Text * 1: Size of the textbox + * 2: Target Unit. Will only display if target is the player controlled object * * Return value: * Nothing From 5b50910ef64df20dff80d75474ae688e6e1e4cb6 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Wed, 25 Feb 2015 11:23:35 +0100 Subject: [PATCH 159/166] Fixed incorrect size --- addons/common/functions/fnc_displayTextStructured.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 1bbb89052e..cfe2feb3cb 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -16,7 +16,7 @@ private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position", "_target"]; _text = _this select 0; -_size = if (count _this > 1) then {_this select 1} else {0.1;}; +_size = if (count _this > 1) then {_this select 1} else {1.5;}; _target = if (count _this > 2) then {_this select 2} else {ACE_player}; if (_target != ACE_player) exitWith {}; From 310710b6e2478d68ffddec1305a00203a2cecd86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Fri, 27 Feb 2015 01:55:16 -0300 Subject: [PATCH 160/166] Major plumbing upgrades on interact_menu: - Store only one compiled menu per class - Actions added through apis for invidual objects stored on the object separately - Replaced the concept of uids by paths. This allows adding/removing actions inside other actions loaded from config seamlessly. - Temporarily removed caching of nearby actions (probe). We may go back to that if needed pretty easily. This allows the player to move freely with the interaction menu opened. --- addons/interact_menu/XEH_clientInit.sqf | 6 - addons/interact_menu/XEH_preInit.sqf | 8 +- .../interact_menu/functions/fnc_addAction.sqf | 49 ++--- .../functions/fnc_compileMenu.sqf | 63 +++--- .../functions/fnc_compileMenuSelfAction.sqf | 53 +++-- addons/interact_menu/functions/fnc_keyUp.sqf | 2 +- .../functions/fnc_keyUpSelfAction.sqf | 2 +- addons/interact_menu/functions/fnc_probe.sqf | 55 ----- .../functions/fnc_removeAction.sqf | 49 ++--- addons/interact_menu/functions/fnc_render.sqf | 182 +++++++++++------ .../functions/fnc_renderIcon.sqf | 2 + .../functions/fnc_renderMenu.sqf | 193 +++++++++++------- .../functions/fnc_updateVecLineMap.sqf | 13 ++ 13 files changed, 361 insertions(+), 316 deletions(-) delete mode 100644 addons/interact_menu/functions/fnc_probe.sqf create mode 100644 addons/interact_menu/functions/fnc_updateVecLineMap.sqf diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index a2ce5ef8a6..c068a15882 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -4,14 +4,8 @@ _fnc = { _this call FUNC(render); }; -// [_fnc, 0, []] call cba_fnc_addPerFrameHandler; addMissionEventHandler ["Draw3D", _fnc]; -_fnc = { - _this call FUNC(probe); -}; -[_fnc, 0.5, []] call cba_fnc_addPerFrameHandler; - ["ACE3", "Interact Key", {_this call FUNC(keyDown)}, diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index d3766cf765..c11453bdd9 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -9,15 +9,13 @@ PREP(keyDown); PREP(keyDownSelfAction); PREP(keyUp); PREP(keyUpSelfAction); -PREP(probe); PREP(removeAction); PREP(render); PREP(renderIcon); PREP(renderMenu); PREP(rotateVectLine); PREP(rotateVectLineGetMap); - -GVAR(toRender) = []; +PREP(updateVecLineMap); GVAR(keyDown) = false; GVAR(keyDownSelfAction) = false; @@ -30,8 +28,6 @@ GVAR(selectedAction) = {}; GVAR(actionSelected) = false; GVAR(selectedTarget) = objNull; -GVAR(filter) = []; - GVAR(menuDepthPath) = []; GVAR(renderDepth) = 0; GVAR(lastRenderDepth) = 0; @@ -49,8 +45,6 @@ GVAR(startHoverTime) = diag_tickTime; GVAR(iconCtrls) = []; GVAR(iconCount) = 0; -GVAR(objectActionsHash) = HASH_CREATE; - GVAR(uidCounter) = 0; ADDON = true; diff --git a/addons/interact_menu/functions/fnc_addAction.sqf b/addons/interact_menu/functions/fnc_addAction.sqf index 3d445a4b13..0315ea564e 100644 --- a/addons/interact_menu/functions/fnc_addAction.sqf +++ b/addons/interact_menu/functions/fnc_addAction.sqf @@ -1,39 +1,37 @@ /* - * Author: commy2 and NouberNou - * Add an ACE action to an object or inside a parent action. Note: This function is NOT global. + * Author: commy2, NouberNou and CAA-Picard + * Add an ACE action to an object, under a certain config path + * Note: This function is NOT global. * * Argument: - * 0: Object the action should be assigned to or parent action or - * 1: Name of the action shown in the menu - * 2: Icon - * 3: Position (Position or Selection Name) or - * 4: Statement - * 5: Condition - * 6: Distance + * 0: Object the action should be assigned to + * 1: Type of action, 0 for actions, 1 for self-actions + * 2: Full path of the new action + * 3: Name of the action shown in the menu + * 4: Icon + * 5: Position (Position or Selection Name) or + * 6: Statement + * 7: Condition + * 8: Distance * * Return value: - * The entry array, which can be used to remove the entry, or add children entries . + * The entry full path, which can be used to remove the entry, or add children entries . * * Public: No */ #include "script_component.hpp" -EXPLODE_7_PVT(_this,_object,_displayName,_icon,_position,_statement,_condition,_distance); +EXPLODE_9_PVT(_this,_object,_typeNum,_fullPath,_displayName,_icon,_position,_statement,_condition,_distance); +private ["_varName","_actions"]; -private ["_actions","_entry"]; -_actions = []; -if(IS_OBJECT(_object)) then { - _actions = _object getVariable [QUOTE(GVAR(actionData)), []]; - if((count _actions) == 0) then { - _object setVariable [QUOTE(GVAR(actionData)), _actions] - }; -} else { - if(IS_ARRAY(_object)) then { - _actions = _object select 6; - }; +_varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum; +_actions = _object getVariable [_varName, []]; +if((count _actions) == 0) then { + _object setVariable [_varName, _actions]; }; +private "_entry"; _entry = [ _displayName, _icon, @@ -42,8 +40,11 @@ _entry = [ _condition, _distance, [], - GVAR(uidCounter) + GVAR(uidCounter), + + _fullPath ]; GVAR(uidCounter) = GVAR(uidCounter) + 1; + _actions pushBack _entry; -_entry; + +_fullPath diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 0bcecf0732..c6e9ec3a8f 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -1,6 +1,6 @@ /* - * Author: NouberNou - * Compile the action menu from config for a given object. + * Author: NouberNou and CAA-Picard + * Compile the action menu from config for an object's class * * Argument: * 0: Object @@ -14,31 +14,21 @@ EXPLODE_1_PVT(_this,_object); -/* -[ - [ - "Launch", - "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", - [0,0,0], - { (_this select 0) setVelocity [0,0,10]; }, - { true }, - 1, - [] - ] -] -*/ - -private ["_objectType","_recurseFnc","_actions"]; +private ["_objectType","_actionsVarName"]; _objectType = typeOf _object; -_actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions"; +_actionsVarName = format [QGVAR(Act_%1), _objectType]; +// Exit if the action menu is already compiled for this class +if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {}; +private "_recurseFnc"; _recurseFnc = { private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", - "_enableInside", "_children", "_entry", "_actionsCfg"]; + "_enableInside", "_children", "_entry", "_entryCfg", "_fullPath"]; + EXPLODE_2_PVT(_this,_actionsCfg,_parentPath); _actions = []; - _actionsCfg = _this select 0; - for "_i" from 0 to (count _actionsCfg)-1 do { + + for "_i" from 0 to (count _actionsCfg) - 1 do { _entryCfg = _actionsCfg select _i; if(isClass _entryCfg) then { _displayName = getText (_entryCfg >> "displayName"); @@ -58,8 +48,12 @@ _recurseFnc = { _showDisabled = getNumber (_entryCfg >> "showDisabled"); _enableInside = getNumber (_entryCfg >> "enableInside"); + _fullPath = (+ _parentPath); + _fullPath pushBack (configName _entryCfg); + _condition = compile _condition; - _children = [_entryCfg] call _recurseFnc; + _children = [_entryCfg, _fullPath] call _recurseFnc; + _entry = [ _displayName, _icon, @@ -68,8 +62,10 @@ _recurseFnc = { _condition, _distance, _children, - GVAR(uidCounter) + GVAR(uidCounter), + _fullPath ]; + GVAR(uidCounter) = GVAR(uidCounter) + 1; _actions pushBack _entry; }; @@ -77,6 +73,23 @@ _recurseFnc = { _actions }; -_actions = [_actionsCfg] call _recurseFnc; +private "_actionsCfg"; +_actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions"; -_object setVariable [QUOTE(GVAR(actionData)), _actions]; +missionNamespace setVariable [_actionsVarName, [_actionsCfg, []] call _recurseFnc]; + +/* +[ + [ + "My Action", + "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", + [0,0,0], + { (_this select 0) setVelocity [0,0,10]; }, + { true }, + 1, + [], + uid, + ["MainActions","TeamManagement","MyAction"] + ] +] +*/ diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index 0135d64eb8..f6bf1a0707 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -1,6 +1,6 @@ /* * Author: NouberNou and CAA-Picard - * Compile the self action menu from config for a given object. + * Compile the self action menu from config for an object's class * * Argument: * 0: Object @@ -14,34 +14,25 @@ EXPLODE_1_PVT(_this,_object); -/* -[ - [ - "Launch", - "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", - [0,0,0], - { (_this select 0) setVelocity [0,0,10]; }, - { true }, - 1, - [] - ] -] -*/ - -private ["_objectType","_recurseFnc","_actions"]; +private ["_objectType","_actionsVarName"]; _objectType = typeOf _object; -_actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions"; +_actionsVarName = format [QGVAR(SelfAct_%1), _objectType]; +// Exit if the action menu is already compiled for this class +if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {}; +private "_recurseFnc"; _recurseFnc = { - private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_condition", "_showDisabled", - "_enableInside", "_children", "_entry", "_actionsCfg"]; + private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", + "_enableInside", "_children", "_entry", "_entryCfg", "_fullPath"]; + EXPLODE_2_PVT(_this,_actionsCfg,_parentPath); _actions = []; - _actionsCfg = _this select 0; - for "_i" from 0 to (count _actionsCfg)-1 do { + + for "_i" from 0 to (count _actionsCfg) - 1 do { _entryCfg = _actionsCfg select _i; if(isClass _entryCfg) then { _displayName = getText (_entryCfg >> "displayName"); + _icon = getText (_entryCfg >> "icon"); _statement = compile (getText (_entryCfg >> "statement")); @@ -54,8 +45,12 @@ _recurseFnc = { _showDisabled = getNumber (_entryCfg >> "showDisabled"); _enableInside = getNumber (_entryCfg >> "enableInside"); + _fullPath = (+ _parentPath); + _fullPath pushBack (configName _entryCfg); + _condition = compile _condition; - _children = [_entryCfg] call _recurseFnc; + _children = [_entryCfg, _fullPath] call _recurseFnc; + _entry = [ _displayName, _icon, @@ -64,8 +59,10 @@ _recurseFnc = { _condition, 10, //distace _children, - GVAR(uidCounter) + GVAR(uidCounter), + _fullPath ]; + GVAR(uidCounter) = GVAR(uidCounter) + 1; _actions pushBack _entry; }; @@ -73,7 +70,8 @@ _recurseFnc = { _actions }; -_actions = [_actionsCfg] call _recurseFnc; +private "_actionsCfg"; +_actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions"; // Create a master action to base on self action _actions = [[ @@ -83,10 +81,11 @@ _actions = [[ { true }, { true }, 10, - _actions, - GVAR(uidCounter) + [_actionsCfg, ["SelfActions"]] call _recurseFnc, + GVAR(uidCounter), + ["SelfActions"] ] ]; GVAR(uidCounter) = GVAR(uidCounter) + 1; -_object setVariable [QUOTE(GVAR(selfActionData)), _actions]; +missionNamespace setVariable [_actionsVarName, _actions]; diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 6a39f40f95..ee98a86f7a 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -17,7 +17,7 @@ if(GVAR(actionSelected)) then { this = GVAR(selectedTarget); _player = ACE_Player; _target = GVAR(selectedTarget); - [GVAR(selectedTarget), player] call GVAR(selectedAction); + [GVAR(selectedTarget), ACE_player] call GVAR(selectedAction); }; GVAR(expanded) = false; GVAR(lastPath) = []; diff --git a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf index 82130c9993..e95c381eb3 100644 --- a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf @@ -17,7 +17,7 @@ if(GVAR(actionSelected)) then { this = GVAR(selectedTarget); _player = ACE_Player; _target = GVAR(selectedTarget); - [GVAR(selectedTarget), player] call GVAR(selectedAction); + [GVAR(selectedTarget), ACE_player] call GVAR(selectedAction); }; GVAR(expanded) = false; GVAR(lastPath) = []; diff --git a/addons/interact_menu/functions/fnc_probe.sqf b/addons/interact_menu/functions/fnc_probe.sqf deleted file mode 100644 index dc1b7e6c87..0000000000 --- a/addons/interact_menu/functions/fnc_probe.sqf +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Author: NouberNou - * Scan de vicinity of the player and collect every interaction available around it on - * the GVAR(toRender) array. - * - * Argument: - * None - * - * Return value: - * None - * - * Public: No - */ -#include "script_component.hpp" - -private ["_nearestObjects", "_actionObject", "_x", "_actionData", "_renderData", "_actionItem", "_active", "_renderItem", "_object", "_forEachIndex"]; -if(!GVAR(keyDown)) then { - _nearestObjects = nearestObjects [(getPos ACE_player), ["All"], 100]; - - GVAR(toRender) = []; - { - _actionObject = _x; - _actionData = _actionObject getVariable [QUOTE(GVAR(actionData)), []]; - - if((count _actionData) > 0) then { - _renderData = []; - { - _actionItem = _x; - this = _actionObject; - _target = _actionObject; - _player = ACE_player; - _active = [_target, ACE_player] call (_actionItem select 4); - systemChat format ["%1 %2 is active %3", _actionObject, _actionItem select 0, _active]; - // player sideChat format["_active: %1 %2", _actionItem select 0, _active]; - if(_active) then { - _renderItem = +_actionItem; - _renderItem set[4, true]; - _renderData set[(count _renderData), _renderItem]; - }; - } forEach _actionData; - if((count _renderData) > 0) then { - GVAR(toRender) set[(count GVAR(toRender)), [_actionObject, _renderData]]; - }; - }; - } forEach _nearestObjects; - // player sideChat format["p: %1", count GVAR(toRender)]; -} else { - GVAR(filter) = []; - { - _object = _x select 0; - if(_object distance ACE_player > 100) then { - GVAR(filter) set[(count GVAR(filter)), _forEachIndex]; - }; - } forEach GVAR(toRender); -}; diff --git a/addons/interact_menu/functions/fnc_removeAction.sqf b/addons/interact_menu/functions/fnc_removeAction.sqf index 3ab4379768..28d2ccbd5e 100644 --- a/addons/interact_menu/functions/fnc_removeAction.sqf +++ b/addons/interact_menu/functions/fnc_removeAction.sqf @@ -1,10 +1,11 @@ /* - * Author: commy2 and NouberNou + * Author: commy2, NouberNou and CAA-Picard * Remove an action from an object * * Argument: - * 0: Object the action should be assigned to - * 1: Entry to remove or + * 0: Object the action is assigned to + * 1: Type of action, 0 for actions, 1 for self-actions + * 2: Full path of the action to remove * * Return value: * None @@ -13,38 +14,14 @@ */ #include "script_component.hpp" -EXPLODE_2_PVT(_this,_object,_entry); +EXPLODE_2_PVT(_this,_object,_fullPath); -private ["_found", "_actions", "_searchFnc"]; +private ["_varName","_actions"]; +_varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum; +_actions = _object getVariable [_varName, []]; - -if(!IS_OBJECT(_object)) exitWith {false}; - -_actions = _object getVariable [QUOTE(GVAR(actionData)), []]; -if(IS_ARRAY(_entry)) then { - _entry = _entry select 7; -}; - -_found = false; -_searchFnc = { - private ["_actions", "_entry", "_childActions"]; - _actions = _this select 0; - _entry = _this select 1; - { - if((_x select 7) == _entry) then { - _actions set[_forEachIndex, "aceactiondelete"]; - _actions = _actions - ["aceactiondelete"]; - _found = true; - } else { - if(!_found && {count (_x select 6) > 0}) then { - _childActions = [(_x select 6), _entry] call _searchFnc; - _x set[6, _childActions]; - }; - }; - } forEach _actions; - _actions; -}; -_actions = [_actions, _entry] call _searchFnc; -_object setVariable [QUOTE(GVAR(actionData)), _actions]; - -_found; +{ + if ((_x select 8) isEqualTo _fullPath) exitWith { + _actions deleteAt _forEachIndex; + }; +} forEach _actions; diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 79d300019a..7c4dc61ce3 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -16,41 +16,95 @@ private ["_cursorPos1", "_cursorPos2", "_cursorVec", "_p1", "_p2", "_p", "_v", " _foundTarget = false; _cursorPos1 = positionCameraToWorld [0, 0, 0]; _cursorPos2 = positionCameraToWorld [0, 0, 2]; + GVAR(currentOptions) = []; -if((count GVAR(toRender)) > 0 && (GVAR(keyDown) || GVAR(keyDownSelfAction))) then { - if((count GVAR(vecLineMap)) == 0 || ((count GVAR(menuDepthPath)) > 0 && (getPosASL player) distance GVAR(lastPos) > 0.01)) then { - GVAR(lastPos) = getPosASL player; - _cursorVec = [_cursorPos2, _cursorPos1] call BIS_fnc_vectorFromXtoY; - _p1 = [0,0,0]; - _p2 = +_cursorVec; - _p = (_cursorVec call CBA_fnc_vect2polar); - _v = [(_p select 0), (_p select 1), (_p select 2)+90] call CBA_fnc_polar2vect; - _cp = [_cursorVec, _v] call BIS_fnc_crossProduct; - GVAR(vecLineMap) = [_cp, _p1, _p2] call FUNC(rotateVectLineGetMap); - }; - if (GVAR(keyDown)) then { - // Render all nearby interaction menus +private ["_actionsVarName","_classActions","_objectActions","_target","_player","_actionItem","_active"]; +if (GVAR(keyDown)) then { + [] call FUNC(updateVecLineMap); + + // Render all nearby interaction menus + _nearestObjects = nearestObjects [(getPos ACE_player), ["All"], 15]; + { + _target = _x; + _player = ACE_player; + + // Iterate through object actions, find base level actions and render them if appropiate + _actionsVarName = format [QGVAR(Act_%1), typeOf _target]; + GVAR(objectActions) = _target getVariable [QGVAR(actions), []]; { - if(!(_forEachIndex in GVAR(filter))) then { - GVAR(renderDepth) = 0; - _renderTargets = _x; - { - [_renderTargets select 0, _x, 0, [180, 360]] call FUNC(renderMenu); - } forEach (_renderTargets select 1); - }; - } forEach GVAR(toRender); - } else { - // Render only the self action menu - _actions = (ACE_player getVariable QGVAR(selfActionData)) select 0; - _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset) vectorAdd [0,0,0.25]; - [ACE_player, _actions, 0, [180, 360], _pos] call FUNC(renderMenu); - }; + _actionItem = _x; + // Only render them directly if they are base level actions + if (count (_actionItem select 8) == 1) then { + _active = [_target, ACE_player] call (_actionItem select 4); - // player sideChat format["c: %1", count GVAR(toRender)]; + if (_active) then { + GVAR(renderDepth) = 0; + [_target, _actionItem, 0, [180, 360]] call FUNC(renderMenu); + }; + }; + } forEach GVAR(objectActions); + + // Iterate through base level class actions and render them if appropiate + _classActions = missionNamespace getVariable [_actionsVarName, []]; + { + _actionItem = _x; + _active = [_target, ACE_player] call (_actionItem select 4); + + if (_active) then { + GVAR(renderDepth) = 0; + [_target, _actionItem, 0, [180, 360]] call FUNC(renderMenu); + }; + } forEach _classActions; + + + + } forEach _nearestObjects; + +} else { + if (GVAR(keyDownSelfAction)) then { + + [] call FUNC(updateVecLineMap); + + // Render only the self action menu + _target = vehicle ACE_player; + _player = ACE_player; + + // Iterate through object actions, find base level actions and render them if appropiate + _actionsVarName = format [QGVAR(SelfAct_%1), typeOf _target]; + GVAR(objectActions) = _target getVariable [QGVAR(selfActions), []]; + { + _actionItem = _x; + // Only render them directly if they are base level actions + if (count (_actionItem select 8) == 1) then { + _active = [_target, ACE_player] call (_actionItem select 4); + + if (_active) then { + GVAR(renderDepth) = 0; + [_target, _actionItem, 0, [180, 360]] call FUNC(renderMenu); + }; + }; + } forEach GVAR(objectActions); + + // Iterate through base level class actions and render them if appropiate + _actionsVarName = format [QGVAR(SelfAct_%1), typeOf _target]; + _classActions = missionNamespace getVariable [_actionsVarName, []]; + { + _actionItem = _x; + _active = [_target, ACE_player] call (_actionItem select 4); + + if (_active) then { + GVAR(renderDepth) = 0; + _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset) vectorAdd [0,0,0.25]; + [ACE_player, _actionItem, 0, [180, 360], _pos] call FUNC(renderMenu); + }; + } forEach _classActions; + }; }; + if(GVAR(keyDown) || GVAR(keyDownSelfAction)) then { + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selected_ca.paa", [1,0,0,1], _cursorPos2, 1, 1, 0, "", 0.5, 0.025, "TahomaB"]; _cursorScreenPos = worldToScreen _cursorPos2; _closestDistance = 1000000; @@ -67,48 +121,50 @@ if(GVAR(keyDown) || GVAR(keyDownSelfAction)) then { }; } forEach GVAR(currentOptions); - if(_closestSelection != -1) then { - _closest = GVAR(currentOptions) select _closestSelection; + if(_closestSelection == -1) exitWith {}; - _pos = _closest select 1; - _cTime = diag_tickTime; - _delta = _cTime - GVAR(lastTime); - GVAR(lastTime) = _cTime; - GVAR(rotationAngle) = GVAR(rotationAngle) + (180*_delta); - if(GVAR(rotationAngle) > 360) then { - GVAR(rotationAngle) = GVAR(rotationAngle) - 360; - }; - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,.75], _pos, 0.6*SafeZoneW, 0.6*SafeZoneW, GVAR(rotationAngle), "", 0.5, 0.025, "TahomaB"]; - _foundTarget = true; - GVAR(actionSelected) = true; - GVAR(selectedTarget) = (_closest select 0) select 0; - GVAR(selectedAction) = ((_closest select 0) select 1) select 3; - _misMatch = false; - _hoverPath = (_closest select 2); - if((count GVAR(lastPath)) != (count _hoverPath)) then { - _misMatch = true; - } else { - { - if(_x != (_hoverPath select _forEachIndex)) exitWith { - _misMatch = true; - }; - } forEach GVAR(lastPath); - }; + _closest = GVAR(currentOptions) select _closestSelection; - if(_misMatch) then { - GVAR(lastPath) = _hoverPath; - GVAR(startHoverTime) = diag_tickTime; - GVAR(expanded) = false; - } else { - if(!GVAR(expanded) && diag_tickTime-GVAR(startHoverTime) > 0.25) then { - GVAR(expanded) = true; - GVAR(menuDepthPath) = +GVAR(lastPath); + _pos = _closest select 1; + _cTime = diag_tickTime; + _delta = _cTime - GVAR(lastTime); + GVAR(lastTime) = _cTime; + GVAR(rotationAngle) = GVAR(rotationAngle) + (180*_delta); + if(GVAR(rotationAngle) > 360) then { + GVAR(rotationAngle) = GVAR(rotationAngle) - 360; + }; + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,.75], _pos, 0.6*SafeZoneW, 0.6*SafeZoneW, GVAR(rotationAngle), "", 0.5, 0.025, "TahomaB"]; + _foundTarget = true; + GVAR(actionSelected) = true; + GVAR(selectedTarget) = (_closest select 0) select 0; + GVAR(selectedAction) = ((_closest select 0) select 1) select 3; + _misMatch = false; + _hoverPath = (_closest select 2); + if((count GVAR(lastPath)) != (count _hoverPath)) then { + _misMatch = true; + } else { + { + if(_x != (_hoverPath select _forEachIndex)) exitWith { + _misMatch = true; }; + } forEach GVAR(lastPath); + }; + + if(_misMatch) then { + GVAR(lastPath) = _hoverPath; + GVAR(startHoverTime) = diag_tickTime; + GVAR(expanded) = false; + } else { + if(!GVAR(expanded) && diag_tickTime-GVAR(startHoverTime) > 0.25) then { + GVAR(expanded) = true; + GVAR(menuDepthPath) = +GVAR(lastPath); }; }; - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selected_ca.paa", [1,0,0,1], _cursorPos2, 1, 1, 0, "", 0.5, 0.025, "TahomaB"]; + //diag_log format ["GVAR(menuDepthPath): %1", GVAR(menuDepthPath)]; + }; + if(!_foundTarget && GVAR(actionSelected)) then { GVAR(actionSelected) = false; GVAR(expanded) = false; diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 4b04ff6909..0d1ce1fd43 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -24,6 +24,8 @@ _color = _this select 1; _pos = _this select 2; _icon = _this select 6; +//systemChat format ["Icon %1 - %2,%3,%4", _text, _pos select 0, _pos select 1, _pos select 2]; + _sPos = worldToScreen _pos; // _sPos = _pos; if(count _sPos > 0) then { diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 4c437aa6f3..0c9ae5e87e 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -1,6 +1,6 @@ /* * Author: NouberNou and CAA-Picard - * Render a interaction menu + * Render a interaction menu and it's children recursively * * Argument: * 0: Object @@ -8,7 +8,6 @@ * 2: ? * 3: Angle range available for rendering * 4: 3D position (Optional) - * 5: Path of UIDs (Optional) * * Return value: * None @@ -17,16 +16,15 @@ */ #include "script_component.hpp" -private ["_object", "_actionData", "_distance", "_uid", "_pos", "_cursorScreenPos", "_path", "_menuDepth", "_opacity", "_currentRenderDepth", "_radialOffset", "_active", "_x", "_offset", "_newPos", "_forEachIndex"]; +private ["_distance", "_uid", "_pos", "_cursorScreenPos", "_path", "_menuDepth", "_opacity", "_currentRenderDepth", "_radialOffset", "_active", "_x", "_offset", "_newPos", "_forEachIndex"]; -_object = _this select 0; -_actionData = _this select 1; -_uid = _actionData select 7;//_this select 2; -_angles = _this select 3; - -_distance = _actionData select 5; +EXPLODE_4_PVT(_this,_object,_actionData,_dummy,_angles); EXPLODE_2_PVT(_angles,_centerAngle,_maxAngleSpan); +_uid = _actionData select 7; +_distance = _actionData select 5; + +// Obtain a 3D position for the action if((count _this) > 4) then { _pos = _this select 4; } else { @@ -36,70 +34,123 @@ if((count _this) > 4) then { _pos = _object modelToWorld (_object selectionPosition (_actionData select 2)); }; }; + _cursorScreenPos = (positionCameraToWorld [0, 0, 0]); -if(_cursorScreenPos distance _pos <= _distance) then { - _path = []; - if((count _this) > 5) then { - _path = +(_this select 5); +// Exit if the action is too far away +if(_cursorScreenPos distance _pos >= _distance) exitWith {}; + +// Exit if the action is behind you +if(_cursorScreenPos select 2 < 0) exitWith {}; + +_menuDepth = (count GVAR(menuDepthPath)) - 1; + +// Store path to action +_path = [_object]; +_path = _path + (_actionData select 8); + +// Check if the menu is on the selected path +private "_menuInSelectedPath"; +_menuInSelectedPath = true; +{ + if (_forEachIndex >= (count GVAR(menuDepthPath))) exitWith { + _menuInSelectedPath = false; }; - _menuDepth = (count GVAR(menuDepthPath)); - - // ARGB Color (First Hex Pair is transparancy) - _color = "#FFFFFFFF"; - if(_menuDepth > 0 && _uid != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { - _color = format ["#%1FFFFFF", [255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25)] call EFUNC(common,toHex)]; + if (_x != (GVAR(menuDepthPath) select _forEachIndex)) exitWith { + _menuInSelectedPath = false; }; - _path set[(count _path), _uid]; - [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); - GVAR(currentOptions) set[(count GVAR(currentOptions)), [_this, _pos, _path]]; - _currentRenderDepth = -1; - _currentRenderDepth = GVAR(renderDepth); - GVAR(renderDepth) = GVAR(renderDepth) + 1; - if(_uid == (GVAR(menuDepthPath) select (GVAR(renderDepth)-1))) then { - // Count how many actions are active - private "_numActions"; - _numActions = 0; - { - this = _object; - _target = _object; - _player = ACE_player; - _active = [_object, ACE_player] call (_x select 4); - if(_active) then { - _numActions = _numActions + 1; - }; - } forEach (_actionData select 6); - systemChat format ["Menu %1, _numActions: %2", _actionData select 0, _numActions]; +} forEach _path; - private "_angleSpan"; - _angleSpan = _maxAngleSpan min (55 * (_numActions - 1)); - - private "_angle"; - _angle = _centerAngle - _angleSpan / 2; - { - this = _object; - _target = _object; - _player = ACE_player; - _active = [_object, ACE_player] call (_x select 4); - // diag_log text format["_active: %1: %2", (_x select 0), _active]; - if(_active) then { - //systemChat format ["_angle: %1", _angle]; - _offset = [GVAR(vecLineMap), _angle] call FUNC(rotateVectLine); - _mod = 0.15 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; - _newPos = [ - (_pos select 0) + ((_offset select 0)*_mod), - (_pos select 1) + ((_offset select 1)*_mod), - (_pos select 2) + ((_offset select 2)*_mod) - ]; - // drawLine3D [_pos, _newPos, [1,0,0,0.5]]; - [_object, _x, _forEachIndex, [_angle, 150], _newPos, _path] call FUNC(renderMenu); - - if (_angle == 360) then { - _angle = _angle + _angleSpan / _numActions; - } else { - _angle = _angle + _angleSpan / ((_numActions-1) max 1); - }; - }; - } forEach (_actionData select 6); - }; - GVAR(renderDepth) = GVAR(renderDepth) - 1; +// Render icon +// ARGB Color (First Hex Pair is transparancy) +_color = "#FFFFFFFF"; +if(_menuDepth > 0 && !_menuInSelectedPath) then { + _color = format ["#%1FFFFFF", [255 min (255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25))] call EFUNC(common,toHex)]; }; +[_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); + +// Add the action to current options +GVAR(currentOptions) pushBack [_this, _pos, _path]; + +_currentRenderDepth = GVAR(renderDepth); +GVAR(renderDepth) = GVAR(renderDepth) + 1; + +//systemChat format ["Menu %1, _menuInSelectedPath: %2", _actionData select 8, _menuInSelectedPath]; + +// Exit without rendering children if it isn't +if !(_menuInSelectedPath) exitWith { + //diag_log text format ["Exiting on _path: %1",_path]; + //diag_log text format ["GVAR(menuDepthPath): %1",GVAR(menuDepthPath)]; +}; + +// Collect all active children actions +private "_activeChildren"; +_activeChildren = []; +// Collect children class actions +{ + _target = _object; + _player = ACE_player; + _active = [_object, ACE_player] call (_x select 4); + if(_active) then { + _activeChildren pushBack _x; + }; +} forEach (_actionData select 6); + +// Collect children object actions +{ + _actionItem = _x; + + /*diag_log text format ["_path: %1",_path]; + diag_log text format ["(_actionItem select 8): %1",(_actionItem select 8)]; + diag_log text format ["(_actionData select 8): %1",(_actionData select 8)];*/ + + // Check if the action is children of the selected menu + if ((count (_actionItem select 8)) == (count _path)) then { + // Compare parent path to see if it's a suitable child + private "_isChild"; + _isChild = true; + for "_i" from 0 to (count (_actionItem select 8)) - 2 do { + if !(((_actionItem select 8) select _i) isEqualTo (_path select (_i + 1))) exitWith { + _isChild = false; + }; + }; + if (_isChild) exitWith { + _target = _object; + _player = ACE_player; + _active = [_target, ACE_player] call (_actionItem select 4); + + if (_active) then { + _activeChildren pushBack _actionItem; + }; + }; + }; +} forEach GVAR(objectActions); + +private ["_angleSpan","_angle"]; +_angleSpan = _maxAngleSpan min (55 * ((count _activeChildren) - 1)); +if (_angleSpan >= 305) then { + _angleSpan = 360; +}; + +_angle = _centerAngle - _angleSpan / 2; + +//systemChat format ["Menu %1, _numA: %2, _aSpan: %3", _actionData select 8, count _activeChildren, _angleSpan]; + +{ + _target = _object; + _player = ACE_player; + + _offset = [GVAR(vecLineMap), _angle] call FUNC(rotateVectLine); + _mod = 0.15 max (0.15 * (_cursorScreenPos distance _pos)); + _newPos = _pos vectorAdd (_offset vectorMultiply _mod); + + // drawLine3D [_pos, _newPos, [1,0,0,0.5]]; + [_object, _x, _forEachIndex, [_angle, 140], _newPos] call FUNC(renderMenu); + + if (_angleSpan == 360) then { + _angle = _angle + _angleSpan / (count _activeChildren); + } else { + _angle = _angle + _angleSpan / (((count _activeChildren)-1) max 1); + }; +} forEach _activeChildren; + +GVAR(renderDepth) = GVAR(renderDepth) - 1; diff --git a/addons/interact_menu/functions/fnc_updateVecLineMap.sqf b/addons/interact_menu/functions/fnc_updateVecLineMap.sqf new file mode 100644 index 0000000000..c5027ffc60 --- /dev/null +++ b/addons/interact_menu/functions/fnc_updateVecLineMap.sqf @@ -0,0 +1,13 @@ +#include "script_component.hpp"; + +if((count GVAR(vecLineMap)) == 0 || ((count GVAR(menuDepthPath)) > 0 && (getPosASL player) distance GVAR(lastPos) > 0.01)) then { + GVAR(lastPos) = getPosASL player; + _cursorVec = [_cursorPos2, _cursorPos1] call BIS_fnc_vectorFromXtoY; + _p1 = [0,0,0]; + _p2 = +_cursorVec; + _p = (_cursorVec call CBA_fnc_vect2polar); + _v = [(_p select 0), (_p select 1), (_p select 2)+90] call CBA_fnc_polar2vect; + _cp = [_cursorVec, _v] call BIS_fnc_crossProduct; + + GVAR(vecLineMap) = [_cp, _p1, _p2] call FUNC(rotateVectLineGetMap); +}; \ No newline at end of file From 3d8854f84afc5afa25c5da736defc9677955a3dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Fri, 27 Feb 2015 02:07:35 -0300 Subject: [PATCH 161/166] Fixed opacity of icons; removed debug traces --- addons/interact_menu/functions/fnc_render.sqf | 2 -- .../functions/fnc_renderMenu.sqf | 21 +++++-------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 7c4dc61ce3..4bb7feda4b 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -161,8 +161,6 @@ if(GVAR(keyDown) || GVAR(keyDownSelfAction)) then { GVAR(menuDepthPath) = +GVAR(lastPath); }; }; - //diag_log format ["GVAR(menuDepthPath): %1", GVAR(menuDepthPath)]; - }; if(!_foundTarget && GVAR(actionSelected)) then { diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 0c9ae5e87e..554a802ca7 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -64,7 +64,7 @@ _menuInSelectedPath = true; // ARGB Color (First Hex Pair is transparancy) _color = "#FFFFFFFF"; if(_menuDepth > 0 && !_menuInSelectedPath) then { - _color = format ["#%1FFFFFF", [255 min (255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25))] call EFUNC(common,toHex)]; + _color = format ["#%1FFFFFF", [255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25)] call EFUNC(common,toHex)]; }; [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); @@ -72,15 +72,9 @@ if(_menuDepth > 0 && !_menuInSelectedPath) then { GVAR(currentOptions) pushBack [_this, _pos, _path]; _currentRenderDepth = GVAR(renderDepth); -GVAR(renderDepth) = GVAR(renderDepth) + 1; - -//systemChat format ["Menu %1, _menuInSelectedPath: %2", _actionData select 8, _menuInSelectedPath]; // Exit without rendering children if it isn't -if !(_menuInSelectedPath) exitWith { - //diag_log text format ["Exiting on _path: %1",_path]; - //diag_log text format ["GVAR(menuDepthPath): %1",GVAR(menuDepthPath)]; -}; +if !(_menuInSelectedPath) exitWith {}; // Collect all active children actions private "_activeChildren"; @@ -99,10 +93,6 @@ _activeChildren = []; { _actionItem = _x; - /*diag_log text format ["_path: %1",_path]; - diag_log text format ["(_actionItem select 8): %1",(_actionItem select 8)]; - diag_log text format ["(_actionData select 8): %1",(_actionData select 8)];*/ - // Check if the action is children of the selected menu if ((count (_actionItem select 8)) == (count _path)) then { // Compare parent path to see if it's a suitable child @@ -133,8 +123,6 @@ if (_angleSpan >= 305) then { _angle = _centerAngle - _angleSpan / 2; -//systemChat format ["Menu %1, _numA: %2, _aSpan: %3", _actionData select 8, count _activeChildren, _angleSpan]; - { _target = _object; _player = ACE_player; @@ -144,7 +132,10 @@ _angle = _centerAngle - _angleSpan / 2; _newPos = _pos vectorAdd (_offset vectorMultiply _mod); // drawLine3D [_pos, _newPos, [1,0,0,0.5]]; + + GVAR(renderDepth) = _currentRenderDepth + 1; [_object, _x, _forEachIndex, [_angle, 140], _newPos] call FUNC(renderMenu); + GVAR(renderDepth) = _currentRenderDepth; if (_angleSpan == 360) then { _angle = _angle + _angleSpan / (count _activeChildren); @@ -152,5 +143,3 @@ _angle = _centerAngle - _angleSpan / 2; _angle = _angle + _angleSpan / (((count _activeChildren)-1) max 1); }; } forEach _activeChildren; - -GVAR(renderDepth) = GVAR(renderDepth) - 1; From 08b15315bf03eab79fc8ae10342a29849eaea4ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Fri, 27 Feb 2015 02:20:28 -0300 Subject: [PATCH 162/166] Fixed removeAction; added trekkie examples --- addons/interact_menu/functions/fnc_addAction.sqf | 3 +++ addons/interact_menu/functions/fnc_removeAction.sqf | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/addons/interact_menu/functions/fnc_addAction.sqf b/addons/interact_menu/functions/fnc_addAction.sqf index 0315ea564e..1a288bd85e 100644 --- a/addons/interact_menu/functions/fnc_addAction.sqf +++ b/addons/interact_menu/functions/fnc_addAction.sqf @@ -17,6 +17,9 @@ * Return value: * The entry full path, which can be used to remove the entry, or add children entries . * + * Example: + * [cursorTarget,0,["ACE_TapShoulderRight","VulcanPinch"],"Vulcan Pinch","",[0,0,0],{_target setDamage 1;},{true},100] call ace_interact_menu_fnc_addAction; + * * Public: No */ #include "script_component.hpp" diff --git a/addons/interact_menu/functions/fnc_removeAction.sqf b/addons/interact_menu/functions/fnc_removeAction.sqf index 28d2ccbd5e..2d66b64627 100644 --- a/addons/interact_menu/functions/fnc_removeAction.sqf +++ b/addons/interact_menu/functions/fnc_removeAction.sqf @@ -10,11 +10,14 @@ * Return value: * None * + * Example: + * [cursorTarget,0,["ACE_TapShoulderRight","VulcanPinch"]] call ace_interact_menu_fnc_removeAction; + * * Public: No */ #include "script_component.hpp" -EXPLODE_2_PVT(_this,_object,_fullPath); +EXPLODE_3_PVT(_this,_object,_typeNum,_fullPath); private ["_varName","_actions"]; _varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum; From 2371bc1bb0518b055d33c2a24ce1ef19a2950b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Fri, 27 Feb 2015 02:35:37 -0300 Subject: [PATCH 163/166] Removed the renderDepth variables --- addons/interact_menu/XEH_preInit.sqf | 3 --- addons/interact_menu/functions/fnc_render.sqf | 4 ---- addons/interact_menu/functions/fnc_renderMenu.sqf | 6 +----- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index c11453bdd9..72e8e7249e 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -29,8 +29,6 @@ GVAR(actionSelected) = false; GVAR(selectedTarget) = objNull; GVAR(menuDepthPath) = []; -GVAR(renderDepth) = 0; -GVAR(lastRenderDepth) = 0; GVAR(vecLineMap) = []; GVAR(lastPos) = [0,0,0]; @@ -40,7 +38,6 @@ GVAR(lastPath) = []; GVAR(expanded) = false; -GVAR(maxRenderDepth) = 0; GVAR(startHoverTime) = diag_tickTime; GVAR(iconCtrls) = []; GVAR(iconCount) = 0; diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 4bb7feda4b..03efb07112 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -39,7 +39,6 @@ if (GVAR(keyDown)) then { _active = [_target, ACE_player] call (_actionItem select 4); if (_active) then { - GVAR(renderDepth) = 0; [_target, _actionItem, 0, [180, 360]] call FUNC(renderMenu); }; }; @@ -52,7 +51,6 @@ if (GVAR(keyDown)) then { _active = [_target, ACE_player] call (_actionItem select 4); if (_active) then { - GVAR(renderDepth) = 0; [_target, _actionItem, 0, [180, 360]] call FUNC(renderMenu); }; } forEach _classActions; @@ -80,7 +78,6 @@ if (GVAR(keyDown)) then { _active = [_target, ACE_player] call (_actionItem select 4); if (_active) then { - GVAR(renderDepth) = 0; [_target, _actionItem, 0, [180, 360]] call FUNC(renderMenu); }; }; @@ -94,7 +91,6 @@ if (GVAR(keyDown)) then { _active = [_target, ACE_player] call (_actionItem select 4); if (_active) then { - GVAR(renderDepth) = 0; _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset) vectorAdd [0,0,0.25]; [ACE_player, _actionItem, 0, [180, 360], _pos] call FUNC(renderMenu); }; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 554a802ca7..c7af6e8839 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -64,15 +64,13 @@ _menuInSelectedPath = true; // ARGB Color (First Hex Pair is transparancy) _color = "#FFFFFFFF"; if(_menuDepth > 0 && !_menuInSelectedPath) then { - _color = format ["#%1FFFFFF", [255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25)] call EFUNC(common,toHex)]; + _color = format ["#%1FFFFFF", [255 * ((((count _path) - 2)/_menuDepth) max 0.25)] call EFUNC(common,toHex)]; }; [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); // Add the action to current options GVAR(currentOptions) pushBack [_this, _pos, _path]; -_currentRenderDepth = GVAR(renderDepth); - // Exit without rendering children if it isn't if !(_menuInSelectedPath) exitWith {}; @@ -133,9 +131,7 @@ _angle = _centerAngle - _angleSpan / 2; // drawLine3D [_pos, _newPos, [1,0,0,0.5]]; - GVAR(renderDepth) = _currentRenderDepth + 1; [_object, _x, _forEachIndex, [_angle, 140], _newPos] call FUNC(renderMenu); - GVAR(renderDepth) = _currentRenderDepth; if (_angleSpan == 360) then { _angle = _angle + _angleSpan / (count _activeChildren); From bf21a8bc917015dd1a650defdd132d4cbd165a6f Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 27 Feb 2015 15:28:48 -0600 Subject: [PATCH 164/166] Pull configSetting from upstream --- addons/common/functions/fnc_setSettingFromConfig.sqf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/common/functions/fnc_setSettingFromConfig.sqf b/addons/common/functions/fnc_setSettingFromConfig.sqf index e68157bfdb..27c727acab 100644 --- a/addons/common/functions/fnc_setSettingFromConfig.sqf +++ b/addons/common/functions/fnc_setSettingFromConfig.sqf @@ -16,7 +16,9 @@ EXPLODE_1_PVT(_this,_optionEntry); _fnc_getValueWithType = { EXPLODE_2_PVT(_this,_optionEntry,_typeName); - _value = if (isNumber (_optionEntry >> "value")) then {getNumber (_optionEntry >> "value")} else {0}; //getNumber on an array throws a warning + + _valueConfig = (_optionEntry >> "value"); + _value = if (isNumber (_optionEntry >> "value")) then {getNumber (_optionEntry >> "value")} else {0}; TRACE_3("_fnc_getValueWithType:", configName _optionEntry, _typeName, _value); if (_typeName == "BOOL") exitWith { _value > 0 From 114718e8ae226a9f2350b9429646dbf86251228c Mon Sep 17 00:00:00 2001 From: KoffeinFlummi Date: Sat, 28 Feb 2015 15:22:21 +0100 Subject: [PATCH 165/166] Fix line ending in .editorconf --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index f6f23b8d1b..0deca3d2ab 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,7 +1,7 @@ root = true [*] -end_of_line = lf +end_of_line = crlf insert_final_newline = true charset = utf-8 indent_style = space From dfdee62732d28ca22f97df065a4b49cc159edd09 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 27 Feb 2015 23:12:54 -0600 Subject: [PATCH 166/166] Movement Comments/Formating --- addons/movement/functions/fnc_canClimb.sqf | 18 +++++++++++-- addons/movement/functions/fnc_climb.sqf | 26 ++++++++++++++----- addons/movement/functions/fnc_getWeight.sqf | 16 +++++++++++- addons/movement/functions/fnc_handleClimb.sqf | 17 +++++++++++- 4 files changed, 67 insertions(+), 10 deletions(-) diff --git a/addons/movement/functions/fnc_canClimb.sqf b/addons/movement/functions/fnc_canClimb.sqf index bd62bfb768..27753d8a12 100644 --- a/addons/movement/functions/fnc_canClimb.sqf +++ b/addons/movement/functions/fnc_canClimb.sqf @@ -1,4 +1,18 @@ -// by commy2 +/* + * Author: commy2 + * Tests the the player can climb. + * + * Arguments: + * 0: The Unit (usually the player) + * + * Return Value: + * The return value + * + * Example: + * _bool = [player] call ace_movement_fnc_canClimb + * + * Public: No + */ #include "script_component.hpp" private ["_unit", "_pos", "_dir"]; @@ -20,6 +34,6 @@ _checkPos1end = _checkPos1beg vectorAdd _dir; /* drawLine3D [ASLToATL _checkPos0beg, ASLToATL _checkPos0end, [1,0,0,1]]; drawLine3D [ASLToATL _checkPos1beg, ASLToATL _checkPos1end, [1,0,0,1]]; -*/ + */ lineIntersects [_checkPos0beg, _checkPos0end] && {!(lineIntersects [_checkPos1beg, _checkPos1end])} diff --git a/addons/movement/functions/fnc_climb.sqf b/addons/movement/functions/fnc_climb.sqf index 3f09b82a15..aff27ffe9d 100644 --- a/addons/movement/functions/fnc_climb.sqf +++ b/addons/movement/functions/fnc_climb.sqf @@ -1,4 +1,18 @@ -// by commy2 +/* + * Author: commy2 + * Make the player climb over short walls. + * + * Arguments: + * 0: The Unit (usually the player) + * + * Return Value: + * Nothing + * + * Example: + * [player] call ace_movement_fnc_climb + * + * Public: No + */ #include "script_component.hpp" private "_unit"; @@ -6,15 +20,15 @@ private "_unit"; _unit = _this select 0; if !([_unit] call FUNC(canClimb)) exitWith { - [localize "STR_ACE_Movement_CanNotClimb"] call EFUNC(common,displayTextStructured); + [localize "STR_ACE_Movement_CanNotClimb"] call EFUNC(common,displayTextStructured); }; if !(_unit getVariable [QGVAR(isClimbInit), false]) then { - _unit addEventHandler ["AnimDone", { - if (local (_this select 0) && {_this select 1 == "ACE_Climb"}) then {_this call FUNC(handleClimb)}; - }]; + _unit addEventHandler ["AnimDone", { + if (local (_this select 0) && {_this select 1 == "ACE_Climb"}) then {_this call FUNC(handleClimb)}; + }]; - _unit setVariable [QGVAR(isClimbInit), true]; + _unit setVariable [QGVAR(isClimbInit), true]; }; [_unit] call EFUNC(common,fixLoweredRifleAnimation); diff --git a/addons/movement/functions/fnc_getWeight.sqf b/addons/movement/functions/fnc_getWeight.sqf index 254b706d56..955be1a215 100644 --- a/addons/movement/functions/fnc_getWeight.sqf +++ b/addons/movement/functions/fnc_getWeight.sqf @@ -1,4 +1,18 @@ -// by commy2 +/* + * Author: commy2 + * Returns the weight (from the loadAbs command) in lbs/kg (based on user option) + * + * Arguments: + * 0: The Unit (usually the player) + * + * Return Value: + * The return value + * + * Example: + * _bool = [player] call ace_movement_fnc_getWeight + * + * Public: No + */ #include "script_component.hpp" private ["_unit", "_weight"]; diff --git a/addons/movement/functions/fnc_handleClimb.sqf b/addons/movement/functions/fnc_handleClimb.sqf index a96beccc2c..da0f8e0224 100644 --- a/addons/movement/functions/fnc_handleClimb.sqf +++ b/addons/movement/functions/fnc_handleClimb.sqf @@ -1,4 +1,19 @@ -// by commy2 +/* + * Author: commy2 + * Handles the climb animation finishing. Called from "AnimDone" event handler. + * + * Arguments: + * 0: The Unit (usually the player) + * 1: The finisehd animation + * + * Return Value: + * Nothing + * + * Example: + * [player, "ACE_climb"] call ace_movement_fnc_handleClimb + * + * Public: No + */ #include "script_component.hpp" private ["_unit", "_anim", "_pos"];