From f3a94f03ed94059840c8c67287ca2ece5c17d38e Mon Sep 17 00:00:00 2001 From: commy2 <commy-2@gmx.de> Date: Sun, 15 Feb 2015 17:14:09 +0100 Subject: [PATCH] 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]);