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/125] 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/125] 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/125] 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/125] 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 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 005/125] 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 006/125] 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 007/125] 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 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 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 008/125] 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 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 009/125] 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 010/125] 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 011/125] 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 67b3442d17dda3bfbff7d27c2c9a9496228a746c Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 11 Feb 2015 23:49:41 +0100 Subject: [PATCH 012/125] 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 013/125] 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 014/125] 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 015/125] 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 016/125] 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 017/125] 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 018/125] 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 019/125] 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 d4163223a95816efb4eda07604300fbf0d8b6c80 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 05:05:02 +0100 Subject: [PATCH 020/125] 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 021/125] 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 022/125] 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 023/125] 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 024/125] 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 025/125] 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 026/125] 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 027/125] 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 028/125] 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 029/125] 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 030/125] 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 031/125] 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 032/125] 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 033/125] 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 034/125] 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 035/125] 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 036/125] 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 037/125] 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 038/125] 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 039/125] 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 df23b44df55e19f7f1b5bed04ce7ea37df89c9f4 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 Feb 2015 23:13:43 +0100 Subject: [PATCH 040/125] 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 041/125] 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 042/125] 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 043/125] 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 044/125] 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 045/125] 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 046/125] 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 047/125] 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 048/125] 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 049/125] 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 050/125] 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 051/125] 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 052/125] 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 053/125] 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 054/125] 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 055/125] 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 056/125] 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 057/125] 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 058/125] 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 059/125] 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 060/125] 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 061/125] 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 062/125] 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 063/125] 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 064/125] 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 065/125] 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 066/125] 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 067/125] 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 068/125] 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 069/125] 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 070/125] 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 071/125] 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 072/125] 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 073/125] 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 074/125] 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 075/125] 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 076/125] 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 077/125] 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 078/125] 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 079/125] 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 080/125] 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 081/125] 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 082/125] 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 083/125] 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 084/125] 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 085/125] 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 086/125] 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 087/125] 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 088/125] 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 089/125] 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 090/125] 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 091/125] 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 092/125] 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 093/125] 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 094/125] 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 a8e269bc18d46f65d77599123194dc336d56277b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 19 Feb 2015 14:34:08 -0600 Subject: [PATCH 095/125] 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 096/125] 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 097/125] 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 098/125] 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 099/125] 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 100/125] 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 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 101/125] 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 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 102/125] 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 103/125] 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 104/125] 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 105/125] 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 106/125] 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 107/125] 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 108/125] 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 109/125] 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 110/125] 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 111/125] 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 112/125] 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 113/125] 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 114/125] 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 115/125] 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 116/125] 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 117/125] 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 118/125] 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 119/125] 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 120/125] 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 121/125] 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 122/125] 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 123/125] 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 124/125] 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 125/125] 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 {};