From fbcf196402788337ca59030a94992ea6f9e323dc Mon Sep 17 00:00:00 2001 From: lambdatiger Date: Sat, 13 Jan 2024 00:35:22 -0600 Subject: [PATCH] Attempt to clean up formatting onall files --- addons/frag/XEH_postInit.sqf | 8 ++- addons/frag/config.cpp | 2 +- addons/frag/functions/fnc_dev_addRound.sqf | 4 +- addons/frag/functions/fnc_dev_debugAmmo.sqf | 9 +-- addons/frag/functions/fnc_dev_drawTrace.sqf | 10 ++-- addons/frag/functions/fnc_dev_fired.sqf | 2 +- .../frag/functions/fnc_dev_fragCalcDump.sqf | 10 ++-- addons/frag/functions/fnc_dev_sphereDraw.sqf | 6 +- .../functions/fnc_dev_switchUnitHandle.sqf | 4 +- addons/frag/functions/fnc_dev_trackHitBox.sqf | 22 +++---- addons/frag/functions/fnc_dev_trackObj.sqf | 11 ++-- addons/frag/functions/fnc_doFrag.sqf | 20 +++---- addons/frag/functions/fnc_doFragRandom.sqf | 14 ++--- addons/frag/functions/fnc_doFragTargeted.sqf | 59 +++++++++---------- addons/frag/functions/fnc_doSpall.sqf | 28 +++++---- addons/frag/functions/fnc_getFragInfo.sqf | 14 ++--- addons/frag/functions/fnc_getMaterialInfo.sqf | 18 +++--- addons/frag/functions/fnc_initBlackList.sqf | 5 +- .../frag/functions/fnc_initMaterialCache.sqf | 7 ++- addons/frag/functions/fnc_initRound.sqf | 9 ++- addons/frag/functions/fnc_shouldFrag.sqf | 12 ++-- addons/frag/functions/fnc_shouldSpall.sqf | 8 +-- addons/frag/initSettings.inc.sqf | 4 +- addons/frag/script_component.hpp | 2 +- addons/frag/stringtable.xml | 4 +- 25 files changed, 149 insertions(+), 143 deletions(-) diff --git a/addons/frag/XEH_postInit.sqf b/addons/frag/XEH_postInit.sqf index 92708f0e05..1d2b3af267 100644 --- a/addons/frag/XEH_postInit.sqf +++ b/addons/frag/XEH_postInit.sqf @@ -1,11 +1,12 @@ #include "script_component.hpp" -["CBA_settingsInitialized", { +[ + "CBA_settingsInitialized", + { if (isServer) then { [] call FUNC(initBlackList); [] call FUNC(initMaterialCache); }; - #ifdef DEBUG_MODE_DRAW if (hasInterface && GVAR(debugOptions)) then { @@ -15,7 +16,8 @@ [objNull, ace_player] call FUNC(dev_switchUnitHandle); }; #endif -}] call CBA_fnc_addEventHandler; + } +] call CBA_fnc_addEventHandler; #ifdef LOG_FRAG_INFO diff --git a/addons/frag/config.cpp b/addons/frag/config.cpp index f3b409dbd0..0a36ad8d17 100644 --- a/addons/frag/config.cpp +++ b/addons/frag/config.cpp @@ -16,4 +16,4 @@ class CfgPatches { #include "CfgEventhandlers.hpp" #include "CfgAmmo.hpp" -#include "ACE_Settings.hpp" +#include "ACE_Settings.hpp" \ No newline at end of file diff --git a/addons/frag/functions/fnc_dev_addRound.sqf b/addons/frag/functions/fnc_dev_addRound.sqf index b8d7a27b23..235a9903d8 100644 --- a/addons/frag/functions/fnc_dev_addRound.sqf +++ b/addons/frag/functions/fnc_dev_addRound.sqf @@ -1,7 +1,7 @@ #include "..\script_component.hpp" /* * Author: Lambda.Tiger - * This function adds a round to be traced + * This function adds a round to be traced * * Arguments: * 0: Projectile @@ -55,7 +55,7 @@ if (_sidePlayer) then if (!_addEHs) exitWith {}; -// Add hitpart eventHandler +// Add hitpart eventHandler _proj addEventHandler [ "HitPart", { diff --git a/addons/frag/functions/fnc_dev_debugAmmo.sqf b/addons/frag/functions/fnc_dev_debugAmmo.sqf index e4124b467f..90f26f1922 100644 --- a/addons/frag/functions/fnc_dev_debugAmmo.sqf +++ b/addons/frag/functions/fnc_dev_debugAmmo.sqf @@ -2,12 +2,12 @@ #include "..\script_component.hpp" /* * Author: ACE-Team, Lambda.Tiger - * This function will dump every ammo config that would generate ace_frag + * This function will dump every ammo config that would generate ace_frag * fragements that could be fired from a weapon * * Arguments: * 0: Log ammo types that wouldn't normall frag - * 1: Only export ammo classes of classes referenced in cfgAmmo + * 1: Only export ammo classes of classes referenced in cfgAmmo * and their submunitions. * 2: Force a CSV format * @@ -30,6 +30,7 @@ if (_csvFormat) then { diag_log text format ["ammo,gurney_c,gurney_m,gurney_k,gurney_gC,fragTypes,fragCount,Inheritance"]; }; +// Gather all configs, either those that could be created from firing or all classes private _allAmmoConfigs = []; if (_onlyShotAmmoTypes) then { private _searchFunc = { @@ -61,7 +62,7 @@ if (_onlyShotAmmoTypes) then { private _processedCfgAmmos = []; private _printCount = 0; -{ +{ // Begin forEach to check each ammo type private _ammo = _x; if (_ammo != "" && {!(_ammo in _processedCfgAmmos)}) then { _processedCfgAmmos pushBack _ammo; @@ -84,7 +85,7 @@ private _printCount = 0; if (_gC == 0) then {_warn = true;}; private _fragCount = getNumber (_ammoConfig >> QGVAR(fragCount)); if (_fragCount == 0) then {_fragCount = 200; _warn = true;}; - + if (_warn) then { INC(_printCount); if (_csvFormat) then { diff --git a/addons/frag/functions/fnc_dev_drawTrace.sqf b/addons/frag/functions/fnc_dev_drawTrace.sqf index f2500e89ad..2dcea81256 100644 --- a/addons/frag/functions/fnc_dev_drawTrace.sqf +++ b/addons/frag/functions/fnc_dev_drawTrace.sqf @@ -1,7 +1,8 @@ #include "..\script_component.hpp" +#define HB_DRAW_ARRS [[3 , 2 , 1 , 5 , 6 , 7 , 3 , 0 , 4 , 5], [0, 1], [2, 6], [7, 4]] /* * Author: Lambda.Tiger - * Per frame function to draw all dev traces + * Per frame function to draw all dev traces * * Arguments: * none @@ -16,7 +17,6 @@ private _deleteArr = []; { - // leave if trace is not to be drawn if (count (_y#1) > 1) then { for "_j" from 1 to count (_y#1) - 1 do @@ -27,8 +27,6 @@ private _deleteArr = []; } forEach GVAR(dev_trackLines); if (GVAR(drawHitBox)) then { - - #define HB_DRAW_ARRS [[3,2,1,5,6,7,3,0,4,5],[0,1],[2,6],[7,4]] _deleteArr = []; { _y params ["_obj", "_pts", "_color"]; @@ -37,7 +35,7 @@ if (GVAR(drawHitBox)) then { _deleteArr pushBack _x; continue; }; - + { for "_i" from 1 to count _x -1 do { @@ -46,7 +44,7 @@ if (GVAR(drawHitBox)) then { } forEach HB_DRAW_ARRS; } forEach GVAR(dev_hitBoxes); - + for "_i" from 0 to count _deleteArr - 1 do { GVAR(dev_hitBoxes) deleteAt (_deleteArr#_i); diff --git a/addons/frag/functions/fnc_dev_fired.sqf b/addons/frag/functions/fnc_dev_fired.sqf index 842ba0a1e2..b04b07ea6b 100644 --- a/addons/frag/functions/fnc_dev_fired.sqf +++ b/addons/frag/functions/fnc_dev_fired.sqf @@ -2,7 +2,7 @@ /* * Author: Lambda.Tiger * Add fired rounds to dev track. - * + * * Arguments: * None. Parameters inherited from EFUNC(common,firedEH) * diff --git a/addons/frag/functions/fnc_dev_fragCalcDump.sqf b/addons/frag/functions/fnc_dev_fragCalcDump.sqf index 2ccc1fbab7..7b382fa073 100644 --- a/addons/frag/functions/fnc_dev_fragCalcDump.sqf +++ b/addons/frag/functions/fnc_dev_fragCalcDump.sqf @@ -8,7 +8,7 @@ * Arguments: * 0: _dispAll - Display rounds that will never frag (power < 5). * Default value false - * 1: _minFrgPowRng - minimum range for sqrt power calculation + * 1: _minFrgPowRng - minimum range for sqrt power calculation * * Return Value: * None @@ -34,13 +34,13 @@ diag_log text "//****************** fragCalcDump Beg ******************//"; // Processing ammo types { private _ammo = toLower configName _x; - + if (_ammo == "" || {_ammo in _processedCfgAmmos} ) then {continue}; // calculating hit range _shouldFrag = [_ammo] call FUNC(shouldFrag); - + // Gunery equation private _c = getNumber (configFile >> "cfgAmmo" >> _ammo >> QGVAR(CHARGE)); if (_c == 0) then {_c = 1;}; @@ -52,7 +52,7 @@ diag_log text "//****************** fragCalcDump Beg ******************//"; if (_gC == 0) then {_gC = 2440;}; private _fragCount = getNumber (configFile >> "cfgAmmo" >> _ammo >> QGVAR(fragCount)); if (_fragCount == 0) then {_fragCount = 200;}; - + private _velocity = 0.8 * _gC * sqrt (_c /(_m + _c * _k)); // number of shrapnel to send a direction private _count = ceil (random (sqrt (_m / 1000))); @@ -68,7 +68,7 @@ diag_log text "//****************** fragCalcDump Beg ******************//"; diag_log text format [" Number frags: %1", _count]; INC(_nPrinted); }; - + _processedCfgAmmos pushBack _ammo; } forEach _allAmmoConfigs; diff --git a/addons/frag/functions/fnc_dev_sphereDraw.sqf b/addons/frag/functions/fnc_dev_sphereDraw.sqf index 0484f0ff8d..c56716f20d 100644 --- a/addons/frag/functions/fnc_dev_sphereDraw.sqf +++ b/addons/frag/functions/fnc_dev_sphereDraw.sqf @@ -16,7 +16,7 @@ * Public: No */ params [ - ["_posASL", [0,0,0], [[]], [2,3]], + ["_posASL", [0, 0, 0], [[]], [2,3]], ["_color", "(1,0,0,0.5)", [""]] ]; @@ -30,7 +30,7 @@ if (count _posASL < 3) then if (_color select [0,1] != "(") then { - switch (toLower _color) do + switch (toLower _color) do { case "blue": { _color = "(0,0,0.8,0.5)"; }; case "black": { _color = "(1,1,1,0.5)"; }; @@ -46,7 +46,7 @@ private _clrStr = "#(argb,8,8,3)color" + _color; private _sphere = "Sign_Sphere25cm_F" createVehicle [1,2,34]; _sphere setObjectTexture [0, _clrStr]; -_sphere setPosASL _posASL; +_sphere setPosASL _posASL; GVAR(dev_eventSpheres) pushBack _sphere; _sphere; \ No newline at end of file diff --git a/addons/frag/functions/fnc_dev_switchUnitHandle.sqf b/addons/frag/functions/fnc_dev_switchUnitHandle.sqf index 2c73a3b8c0..510e5b02e5 100644 --- a/addons/frag/functions/fnc_dev_switchUnitHandle.sqf +++ b/addons/frag/functions/fnc_dev_switchUnitHandle.sqf @@ -1,7 +1,7 @@ #include "..\script_component.hpp" /* * Author: Lambda.Tiger - * Handle for debug actions when switching units + * Handle for debug actions when switching units * * Arguments: * 0: Last unit @@ -37,7 +37,7 @@ _aID = _cVic addAction false, // hideOnUse "", // shortcut "true", // condition - 8 + 8 ]; missionNamespace getVariable [QGVAR(dev_clearTraceAction), _aID]; \ No newline at end of file diff --git a/addons/frag/functions/fnc_dev_trackHitBox.sqf b/addons/frag/functions/fnc_dev_trackHitBox.sqf index 51df83d6e0..a4522d771e 100644 --- a/addons/frag/functions/fnc_dev_trackHitBox.sqf +++ b/addons/frag/functions/fnc_dev_trackHitBox.sqf @@ -22,18 +22,20 @@ params [ if (isNull _obj) exitWith {}; +// Grab the right hitBox private _box = []; if (_obj isKindOf "CAManBase") then { if (vehicle _obj == _obj) then { - _box = 0 boundingBox _obj; + _box = 0 boundingBox _obj; } else { - _box = boundingBoxReal [_obj, "Geometry"]; + _box = boundingBoxReal [_obj, "Geometry"]; }; } else { _box = boundingBoxReal [_obj, "FireGeometry"]; }; _box params ["_lowP","_upP"]; +// adjust with stance private _stance = stance _obj; switch (true) do { case (_stance isEqualTo "STAND"): {_upP set [2, 1.9];}; @@ -47,18 +49,19 @@ if (GVAR(dbgSphere) && {_addSphere && {vehicle _obj isEqualTo _obj}}) then { _centerSphere disableCollisionWith vehicle _obj; _centerSphere attachTo [_obj, _obj worldToModel _centerPoint]; }; + +// create an optimized outline private _p1 = _upP; private _p7 = _lowP; - private _points =[ _upP, - [_p1#0,_p7#1,_p1#2], - [_p7#0,_p7#1,_p1#2], - [_p7#0,_p1#1,_p1#2], - [_p1#0,_p1#1,_p7#2], - [_p1#0,_p7#1,_p7#2], + [_p1#0, _p7#1, _p1#2], + [_p7#0, _p7#1, _p1#2], + [_p7#0, _p1#1, _p1#2], + [_p1#0, _p1#1, _p7#2], + [_p1#0, _p7#1, _p7#2], _lowP, - [_p7#0,_p1#1,_p7#2] + [_p7#0, _p1#1, _p7#2] ]; _color = switch (side _obj) do { @@ -66,6 +69,5 @@ _color = switch (side _obj) do { case resistance: {[0, 1, 0, 1]}; default {[0, 0, 1, 1]}; }; -//TRACE_3("box params", _obj, _points, _color); GVAR(dev_hitBoxes) set [getObjectID _obj, [_obj, _points, _color]]; \ No newline at end of file diff --git a/addons/frag/functions/fnc_dev_trackObj.sqf b/addons/frag/functions/fnc_dev_trackObj.sqf index 8221067ec1..80a70f222b 100644 --- a/addons/frag/functions/fnc_dev_trackObj.sqf +++ b/addons/frag/functions/fnc_dev_trackObj.sqf @@ -22,8 +22,8 @@ params [ ["_isProj", false, [false]] ]; TRACE_4("devDraw",_this,_obj,_color,_isProj); -// track round on each frame -// Create entry in position array from hashmap + +// pick color and add it to the array private _colorArray = switch (toLower _color) do { case "purple": {[0.8, 0, 0.8, 1]}; case "blue": {[0, 0, 0.8, 1]}; @@ -47,7 +47,7 @@ GVAR(dev_trackLines) set [getObjectID _obj, [1, [getposATL _obj], _colorArray]]; [_h] call CBA_fnc_removePerFrameHandler; }; private _arr = GVAR(dev_trackLines) getOrDefault [(getObjectID _obj), -1]; - + if (typeName _arr isEqualTo "SCALAR") exitWith { [_h] call CBA_fnc_removePerFrameHandler; }; @@ -61,10 +61,9 @@ GVAR(dev_trackLines) set [getObjectID _obj, [1, [getposATL _obj], _colorArray]]; [_obj] ] call CBA_fnc_addPerFrameHandler; +// Projectile eventhandlers that add spheres and points for more accurate round tracking if (!_isProj) exitWith {}; - -// Add hitpart eventHandler _obj addEventHandler [ "HitPart", { @@ -78,7 +77,6 @@ _obj addEventHandler [ } ]; -// Add explode eventHandler _obj addEventHandler [ "Explode", { @@ -92,7 +90,6 @@ _obj addEventHandler [ } ]; -// Add deflected eventHandler _obj addEventHandler [ "Deflected", { diff --git a/addons/frag/functions/fnc_doFrag.sqf b/addons/frag/functions/fnc_doFrag.sqf index fb255d2097..e9d10c6b2f 100644 --- a/addons/frag/functions/fnc_doFrag.sqf +++ b/addons/frag/functions/fnc_doFrag.sqf @@ -10,7 +10,7 @@ * 2: velocity of projectile * 3: projectile cfgAmmo classname * 4: getShotParents of projectile at EH - * + * * Return Value: * None * @@ -21,21 +21,23 @@ */ TRACE_1("",_this); params [ - ["_proj", objNull, [objNull]], - ["_posASL", [0,0,0], [[]], [3]], - ["_vel", [0,0,0] , [[]], [3]], + ["_proj", objNull, [objNull]], + ["_posASL", [0, 0, 0], [[]], [3]], + ["_vel", [0, 0, 0] , [[]], [3]], ["_ammo", "", [""]], ["_shotParents", [objNull, objNull], [[]]] ]; +// Check for vehicle holdoff timeout private _shotParentVic = _shotParents#0; if (_shotParentVic getVariable [QGVAR(nextFragTime), -1] > CBA_missionTime) exitWith { TRACE_1("vehicleTimeExit",_shotParentVic); }; _shotParentVic setVariable [QGVAR(nextFragTime), CBA_missionTime + ACE_FRAG_HOLDOFF_VEHICLE]; +// Check normal round timeout and adjust _max frags private _timeSince = CBA_missionTime - GVAR(lastFragTime); -if (_ammo isEqualTo "" || {_posASL isEqualTo [0,0,0] || _timeSince < ACE_FRAG_HOLDOFF}) exitWith { +if (_ammo isEqualTo "" || {_posASL isEqualTo [0, 0, 0] || _timeSince < ACE_FRAG_HOLDOFF}) exitWith { TRACE_3("timeExit",_timeSince,CBA_missionTime,GVAR(lastFragTime)); }; private _maxFrags = round linearConversion [0.1, 1.5, _timeSince, ACE_FRAG_COUNT_MIN, ACE_FRAG_COUNT_MAX, true]; @@ -44,14 +46,14 @@ TRACE_3("",_timeSince,CBA_missionTime,_maxFrags); private _ammoArr = [_ammo] call FUNC(getFragInfo); _ammoArr params ["_fragRange", "_fragVel", "_fragTypes", "_modFragCount"]; - +// For low frag rounds limit the # of frags if (_modFragCount < 10) then { _maxFrags = _modFragCount*4; GVAR(lastFragTime) = CBA_missionTime - 0.1; } else { GVAR(lastFragTime) = CBA_missionTime; }; - +// Offset for ground clearance private _heightAGL = (ASLToAGL _posASL)#2; if (_heightAGL < 0.25) then { _posASL = _posASL vectorAdd [0, 0, 0.25]; @@ -64,8 +66,4 @@ if (_fragRange > 3 && _timeSince > ACE_FRAG_HOLDOFF*1.5 && GVAR(fragSimComplexit if (_timeSince > 0.2 && {GVAR(fragSimComplexity) > 0}) then { [_posASL, _vel, _heightAGL, _fragTypes, _maxFrags, _shotParents] call FUNC(doFragRandom); -}; - -if (GVAR(reflectionsEnabled)) then { - [_posASL, _shellType] call FUNC(doReflections); }; \ No newline at end of file diff --git a/addons/frag/functions/fnc_doFragRandom.sqf b/addons/frag/functions/fnc_doFragRandom.sqf index 5d9405e08f..2f5b53ff80 100644 --- a/addons/frag/functions/fnc_doFragRandom.sqf +++ b/addons/frag/functions/fnc_doFragRandom.sqf @@ -3,7 +3,7 @@ * Author: Jaynus, NouberNou, Lambda.Tiger * This function creates fragments randomly spreading out from an explosion to * a maximum of 15 - * + * * Arguments: * 0: Position of fragmenting projectile ASL * 1: Velocity of the fragmenting projectile @@ -11,7 +11,7 @@ * 3: Type of fragments to generate * 4: Remaining fragment budget * 5: Shot parent - * + * * Return Value: * None * @@ -22,10 +22,10 @@ */ params [ - "_posASL", - ["_projVel", [0,0,0]], + "_posASL", + ["_projVel", [0,0,0]], ["_heightAGL", 2, [123]], - ["_fragType", [], [[]]], + ["_fragType", [], [[]]], ["_fragCnt", 10, [123]], ["_shotPrnt", [objNull, objNull], [[]], [2]] ]; @@ -38,7 +38,7 @@ private _hMode = switch (true) do { default {"_mid"}; }; -private _type = if (count _fragType > 0 && +private _type = if (count _fragType > 0 && {"ace_frag_tiny" isEqualTo (_fragType#0)}) then { QGVAR(def_tiny_) } else { @@ -71,4 +71,4 @@ _fragSpawner addEventHandler [ if (GVAR(dbgSphere)) then { [_posASL] call FUNC(dev_sphereDraw); }; -#endif \ No newline at end of file +#endif \ No newline at end of file diff --git a/addons/frag/functions/fnc_doFragTargeted.sqf b/addons/frag/functions/fnc_doFragTargeted.sqf index 1c5ec735d5..29241f469f 100644 --- a/addons/frag/functions/fnc_doFragTargeted.sqf +++ b/addons/frag/functions/fnc_doFragTargeted.sqf @@ -1,9 +1,9 @@ #include "..\script_component.hpp" /* * Author: Jaynus, NouberNou, Lambda.Tiger - * This function creates fragments targeted at specific entities, up to - * a configured maximum - * + * This function creates fragments targeted at specific entities, up to + * a configured maximum + * * Arguments: * 0: Position of fragmenting projectile ASL * 1: Velocity of the fragmenting projectile @@ -12,9 +12,9 @@ * 4: Types of fragments * 5: A modified parameter used to calulate whether a framgent hits * 6: Shot parent - * + * * Return Value: - * None + * Number of fragments created * * Example: * [getPosASL _proj, velocity _proj, 50, 50, [], 1, [player, player]] call ace_frag_fnc_doFragTargeted; @@ -53,7 +53,7 @@ if (_objects isEqualTo []) exitWith { // grab crews and add them in so that targets stay approx. sorted by distance { private _crew = (crew _x); - if (count _crew > 1) then { + if (count _crew > 1) then { private _arr = [_x]; { _arr pushBackUnique _x; @@ -62,23 +62,22 @@ if (_objects isEqualTo []) exitWith { _objects set [_forEachIndex, _arr]; }; } forEach _objects; -_objects = flatten _objects; // flatten out sub arrays +_objects = flatten _objects; TRACE_3("Targets found", _posASL, _fragRange, count _objects); // limit number of fragments per direction (2D) to 10 using _fragArcs private _fragArcs = createHashMap; -private _fragCount = 0; // limit of # of fragments to _maxFrags -{ +private _fragCount = 0; +{ // Begin of forEach iterating on _objects if (!alive _x) then {continue}; private _target = _x; #ifdef DEBUG_MODE_DRAWFRAG [_target, false] call FUNC(dev_trackHitBox); #endif - - // Calculate volume and height of target - private _vol = 1.5; - private _height = 0; + + // Estimate volume and height of target + private _height = 0.5; private _crossSectionArea = 1; private _isPerson = _target isKindOf "CAManBase"; if (_isPerson) then { @@ -86,24 +85,24 @@ private _fragCount = 0; // limit of # of fragments to _maxFrags switch (true) do { case (_stance isEqualTo "STAND"): {_height = 1.9; _crossSectionArea = 1.5;}; case (_stance isEqualTo "CROUCH"): {_height = 1.2; _crossSectionArea = 1;}; - default {_height = 0.5; _crossSectionArea = 0.75;}; + default {_crossSectionArea = 0.75;}; }; } else { private _boxParams = boundingBoxReal [_target, "FireGeometry"]; _boxParams params ["_pointA", "_pointB"]; private _dims = _pointB vectorDiff _pointA; - _vol = (_dims#0) * (_dims#1) * (_dims#2); - _crossSectionArea = (_dims#1)*(_dims#2); + if (_dims#0 * _dims#1 * _dims#2 <= 0.5) then {continue}; + _crossSectionArea = _dims#1 * _dims#2; _height = _dims#2; }; - - if (_vol <= 0.5) then {continue}; // too small => exit + + private _distance = _target distance _posASL; - + // calculate chance to be hit by a fragment - private _fragChance = _crossSectionArea*_modFragCount/(_distance^2); + private _fragChance = _crossSectionArea * _modFragCount / _distance^2; private _count = if (_fragChance > 1) then { 3 min (floor _fragChance); } else { @@ -111,12 +110,11 @@ private _fragCount = 0; // limit of # of fragments to _maxFrags }; if (_count == 0) then {TRACE_2("fragments",_fragChance,_count); continue}; - // Approximate offset to hit including speed & gravity + // Approximate offset to hit including speed & gravity private _locFragVel = _fragVel * (1 - random 0.5); private _tof = _distance / _locFragVel; - private _targetPos = (velocity _target vectorMultiply _tof) vectorAdd [0, 0, 9.81 / 2 * _tof ^ 2]; - - // handle limiting fragments per dewgree arc + + // handle limiting fragments per degree arc private _dir = floor (_posASL getDir _target); private _fragPerArc = _fragArcs getOrDefault [_dir, 0]; if (_fragPerArc > 10) then { @@ -125,13 +123,14 @@ private _fragCount = 0; // limit of # of fragments to _maxFrags _fragArcs set [_dir, _fragPerArc + _count]; }; - // actual target pos for fragment to hit + // target pos for fragment to hit + private _targetPos = (velocity _target vectorMultiply _tof) vectorAdd [0, 0, 9.81 / 2 * _tof ^ 2]; if _isPerson then { private _hitPoint = selectRandom ACE_FRAG_HITPOINTS; private _hitPointPos = _target selectionPosition [_hitPoint, "HitPoints", "AveragePoint"]; - _targetPos = _target modelToWorldWorld _hitPointPos; + _targetPos = _target modelToWorldWorld _hitPointPos vectorAdd _targetPos; } else { - _targetPos = getPosASL _target vectorAdd [ + _targetPos = _targetPos vectorAdd getPosASL _target vectorAdd [ -0.5 + random 1, -0.5 + random 1, (0.1 + random 0.4) * _height @@ -147,9 +146,8 @@ private _fragCount = 0; // limit of # of fragments to _maxFrags default {"_far"}; }); }; - TRACE_4("fragments",_fragSpawner,_fragChance,_distance,_locFragVel); - + // Create fragment private _vecDir = _posASL vectorFromTo _targetPos; private _fragObj = createVehicle [_fragSpawner, ASLtoATL _posASL, [], 0, "CAN_COLLIDE"]; @@ -169,8 +167,9 @@ private _fragCount = 0; // limit of # of fragments to _maxFrags break }; } forEach _objects; + #ifdef DEBUG_MODE_FULL systemChat ("fragCount cnt: " + str _fragCount); -#endif TRACE_1("fragCount",_fragCount); +#endif _fragCount \ No newline at end of file diff --git a/addons/frag/functions/fnc_doSpall.sqf b/addons/frag/functions/fnc_doSpall.sqf index f77e072f67..1bdf13e7a4 100644 --- a/addons/frag/functions/fnc_doSpall.sqf +++ b/addons/frag/functions/fnc_doSpall.sqf @@ -2,11 +2,11 @@ /* * Author: Jaynus, NouberNou, Lambda.Tiger, * This function creates spalling if the hit slowed the speed down enough. - * + * * Arguments: * Arguments are the same as BI's "HitPart" EH: * https://community.bistudio.com/wiki/Arma_3:_Event_Handlers#HitPart - * + * * Return Value: * None * @@ -30,7 +30,7 @@ params [ if (CBA_missionTime - GVAR(lastSpallTime) < ACE_FRAG_SPALL_HOLDOFF || _lPosASL isEqualTo [0,0,0] || - {isNull _hitObj || {_hitObj isKindOf "man" || + {isNull _hitObj || {_hitObj isKindOf "man" || {_ammo isEqualTo ""}}}) exitWith { TRACE_4("time/invldHit",CBA_missionTime,GVAR(lastSpallTime),_hitObj,_lPosASL); }; @@ -38,12 +38,12 @@ if (CBA_missionTime - GVAR(lastSpallTime) < ACE_FRAG_SPALL_HOLDOFF || private _material = [_surfaceType] call FUNC(getMaterialInfo); if (_material isEqualTo "ground") then { #ifdef DEBUG_MODE_FULL - systemChat "ground spall"; // really shouldn't happen + systemChat "ground spall"; #endif }; private _vel = if (alive _projectile) then { - velocity _projectile; + velocity _projectile; } else { [0, 0, 0] }; @@ -52,7 +52,7 @@ private _vel = if (alive _projectile) then { private _dV = vectorMagnitude _lVel - vectorMagnitude _vel; private _caliber = getNumber (configFile >> "cfgAmmo" >> _ammo >> "caliber"); // scaled momentum change made on caliber-mass assumption ~sqrt(2)/20 * caliber ~= mass -private _deltaMomentum = 0.0707 * _caliber * sqrt( _dV ) * GVAR(SpallIntensity); +private _deltaMomentum = 0.0707 * _caliber * sqrt( _dV ) * GVAR(SpallIntensity); TRACE_3("found speed",_dV,_caliber,_deltaMomentum); if (_deltaMomentum < 2) exitWith { @@ -62,20 +62,22 @@ if (_deltaMomentum < 2) exitWith { private _lVelUnit = vectorNormalized _lVel; private _unitStep = _lVelUnit vectorMultiply 0.05; -private _spallPos = +_lPosASL; if (terrainIntersectASL [_lPosASL vectorAdd _unitStep, _lPosASL]) exitWith { TRACE_3("terrainIntersect",_lPosASL,_unitStep,_lPosASL); -}; +}; // Passed all exitWiths GVAR(lastSpallTime) = CBA_missionTime; -// check for less than 30 between norm and projectile (120 of 90 deg offset) -if (120 > acos ((vectorNormalized _lVelUnit) vectorDotProduct _sNorm)) then { +/* + * Improve performance of finding otherside of object on shallow angle + * impacts. 120 degrees due to 90 degree offset with _lVelUnit into object. + */ +private _spallPos = +_lPosASL; +if (120 > acos ( _lVelUnit vectorDotProduct _sNorm)) then { _spallPos = _spallPos vectorAdd (_unitStep vectorMultiply 5); }; - -for "_i" from 1 to 20 do +for "_i" from 1 to 20 do { private _nPos = _spallPos vectorAdd _unitStep; if (!lineIntersects [_spallPos, _nPos]) then { @@ -93,7 +95,7 @@ if GVAR(dbgSphere) then { }; #endif -private _spawnSize = switch (true) do +private _spawnSize = switch (true) do { case (_deltaMomentum < 3): { "_spall_tiny" }; case (_deltaMomentum < 5): { "_spall_small" }; diff --git a/addons/frag/functions/fnc_getFragInfo.sqf b/addons/frag/functions/fnc_getFragInfo.sqf index 0f04208b7c..6bcde43713 100644 --- a/addons/frag/functions/fnc_getFragInfo.sqf +++ b/addons/frag/functions/fnc_getFragInfo.sqf @@ -3,16 +3,16 @@ * Author: Jaynus, NouberNou, Lambda.Tiger * This function returns fragmentation parameters for a specific * ammo type. - * + * * Arguments: * 0: _ammo - cfgAmmo type of ammo to check - * + * * Return Value: * _ammoInfo * 0: _fragRange - search range for fragments * 1: _fragVel - gurney equation calculated velocity * 2: _fragTypes - array of fragment types - * 3: _fragCount - modified frag count used under assumptions + * 3: _fragCount - modified frag count used under assumptions * of spherical fragmentation * * Example: @@ -25,7 +25,7 @@ params ["_ammo"]; private _ammoInfo = GVAR(fragInfoCache) get _ammo; -if !(isNil "_ammoInfo") exitWith {_ammoInfo}; +if (!isNil "_ammoInfo") exitWith {_ammoInfo}; private _fragTypes = []; private _warn = false; @@ -37,7 +37,7 @@ if (isArray (configFile >> "cfgAmmo" >> _ammo >> QGVAR(CLASSES))) then { /************ Gurney equation notes *****************//* * see https://en.wikipedia.org/wiki/Gurney_equations - * + * * GURNEY_K is the constant added to _m/_c * GURNEY_C = sqrt(2E) * @@ -71,11 +71,11 @@ if (_warn) then { }; /********************** _ammoInfo format *************************//* - * 0: _fragRange - search range for fragments, calculated with + * 0: _fragRange - search range for fragments, calculated with * a 0.5% chance to hit as the minimum * 1: _fragVel - gurney equation calculated velocity * 2: _fragTypes - array of fragment types - * 3: _fragCount - modified frag count used under assumptions + * 3: _fragCount - modified frag count used under assumptions * of spherical fragmentation */ _ammoInfo = [ diff --git a/addons/frag/functions/fnc_getMaterialInfo.sqf b/addons/frag/functions/fnc_getMaterialInfo.sqf index e670b79159..9f954bba48 100644 --- a/addons/frag/functions/fnc_getMaterialInfo.sqf +++ b/addons/frag/functions/fnc_getMaterialInfo.sqf @@ -1,14 +1,14 @@ #include "..\script_component.hpp" /* * Author: Lambda.Tiger - * This function returns a classification of material type based + * This function returns a classification of material type based * on the surface hit. - * + * * Arguments: - * 0: surfacetype - either a cfgSurfaces path .bisurf filepath - * + * 0: surfacetype - either a cfgSurfaces path .bisurf filepath + * * Return Value: - * _material - Material categories as expanded on in line 43 below + * _material - Material categories as expanded on in line 44 below * * Example: * [_surfaceType] call ace_frag_fnc_getFragInfo; @@ -21,12 +21,15 @@ params ["_surfType"]; private _material = GVAR(spallMaterialCache) get _surfType; TRACE_2("materialCache",_surfType,_material); -if !(isNil "_material") exitWith { +if (!isNil "_material") exitWith { _material }; - +// Use 'soundEnviron' or 'soundHit' to extract approx material if (isClass (configFile >> "CfgSurfaces" >> _surfType)) then { _material = getText (configFile >> "CfgSurfaces" >> _surfType >> "soundEnviron"); + if (_material isEqualTo "" || {_material isEqualTo "empty"}) then { + _material = getText (configFile >> "CfgSurfaces" >> _surfType >> "soundhit"); + }; } else { // Messy way when a surface isn't added to cfgSurfaces private _surfFileText = tolower preprocessFile _surfType; _surfFileText = _surfFileText regexReplace ["[^a-z0-9]", ""]; @@ -38,7 +41,6 @@ if (isClass (configFile >> "CfgSurfaces" >> _surfType)) then { }; TRACE_1("materialSubString",_material); - _material = switch (true) do { case ("dirt" in _material); case ("grass" in _material): { "ground" }; diff --git a/addons/frag/functions/fnc_initBlackList.sqf b/addons/frag/functions/fnc_initBlackList.sqf index 92b3f760d3..a79ed223ae 100644 --- a/addons/frag/functions/fnc_initBlackList.sqf +++ b/addons/frag/functions/fnc_initBlackList.sqf @@ -1,7 +1,7 @@ #include "..\script_component.hpp" /* * Author: Lambda.Tiger - * Adds setting defined blacklisted rounds to blacklist + * Adds setting defined blacklisted rounds to blacklist * * Arguments: * Mne @@ -21,13 +21,14 @@ if (!ADDON) then { [FUNC(initBlackList), [], 1] call CBA_fnc_waitAndExecute; }; -// could improve text parsing +// could improve text parsing of CBA setting string private _convArray = parseSimpleArray GVAR(BlackList); if (count _convArray == 0 ) exitWith { TRACE_1("Empty blacklist", _convArray); }; +// Add CBA setting blacklist to blacklist and log errors private _errors = 0; private _items = count _convArray; for "_i" from 0 to _items - 1 do { diff --git a/addons/frag/functions/fnc_initMaterialCache.sqf b/addons/frag/functions/fnc_initMaterialCache.sqf index 4aae38d7c3..9e56b3daff 100644 --- a/addons/frag/functions/fnc_initMaterialCache.sqf +++ b/addons/frag/functions/fnc_initMaterialCache.sqf @@ -1,11 +1,12 @@ #include "..\script_component.hpp" /* * Author: Lambda.Tiger - * For performance, we load a bunch of vanilla materials preemptively - * + * For performance, we load a bunch of vanilla materials preemptively into + * the spall material cache + * * Arguments: * none - * + * * Return Value: * none * diff --git a/addons/frag/functions/fnc_initRound.sqf b/addons/frag/functions/fnc_initRound.sqf index 2431431b1c..caa5bd2dda 100644 --- a/addons/frag/functions/fnc_initRound.sqf +++ b/addons/frag/functions/fnc_initRound.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: _projectile - The object created - * + * * Return Value: * None * @@ -30,7 +30,7 @@ if (_shouldFrag && GVAR(enabled)) then { _projectile addEventHandler [ "Explode", { - params ["_proj"]; + params ["_proj", "_posASL"]; private _shotParents = getShotParents _proj; private _ammo = typeOf _proj; // wait for frag damage to kill units before spawning fragments @@ -38,13 +38,16 @@ if (_shouldFrag && GVAR(enabled)) then { FUNC(doFrag), _this + [_ammo, _shotParents] ] call CBA_fnc_execNextFrame; + if (GVAR(reflectionsEnabled)) then { + [_posASL, _ammo] call FUNC(doReflections); + }; } ]; }; private _shouldSpall = _ammo call FUNC(shouldSpall); -if (GVAR(spallEnabled) && {_shouldSpall}) then +if (GVAR(spallEnabled) && {_shouldSpall}) then { _projectile addEventHandler [ "HitPart", diff --git a/addons/frag/functions/fnc_shouldFrag.sqf b/addons/frag/functions/fnc_shouldFrag.sqf index f40d94bb9f..de9e04b092 100644 --- a/addons/frag/functions/fnc_shouldFrag.sqf +++ b/addons/frag/functions/fnc_shouldFrag.sqf @@ -3,10 +3,10 @@ * Author: Lambda.Tiger * This function checks whether an ammunition type should cause fragmentation * and whether any submunitions exist - * + * * Arguments: * 0: _ammo - cfgAmmo type of ammo to check - * + * * Return Value: * _shouldFrag Should the specific round fragment * @@ -20,17 +20,17 @@ params ["_ammo"]; private _shouldFrag = GVAR(shouldFragCache) get _ammo; -if !(isNil "_shouldFrag") exitWith {_shouldFrag}; +if (!isNil "_shouldFrag") exitWith {_shouldFrag}; _shouldFrag = true; private _skip = getNumber (configFile >> "cfgAmmo" >> _ammo >> QGVAR(skip)); private _force = getNumber (configFile >> "cfgAmmo" >> _ammo >> QGVAR(force)); private _explosive = getNumber (configFile >> "cfgAmmo" >> _ammo >> "explosive"); -private _indirectHit = getNumber(configFile >> "cfgAmmo" >> _ammo >> "indirectHit"); -private _indirectRange = getNumber(configFile >> "cfgAmmo" >> _ammo >> "indirectHitRange"); +private _indirectHit = getNumber (configFile >> "cfgAmmo" >> _ammo >> "indirectHit"); +private _indirectRange = getNumber (configFile >> "cfgAmmo" >> _ammo >> "indirectHitRange"); -if (_skip == 1 || (_force == 0 && {_explosive < 0.5 || {_indirectHit < 3 +if (_skip == 1 || (_force == 0 && {_explosive < 0.5 || {_indirectHit < 3 || {_indirectRange < 5 && _indirectHit < _indirectRange}}})) then { TRACE_5("No frag",_ammo,_skip, _explosive, _indirectRange, _indirectHit); _shouldFrag = false; diff --git a/addons/frag/functions/fnc_shouldSpall.sqf b/addons/frag/functions/fnc_shouldSpall.sqf index 9813481b1f..393e2984c8 100644 --- a/addons/frag/functions/fnc_shouldSpall.sqf +++ b/addons/frag/functions/fnc_shouldSpall.sqf @@ -2,13 +2,13 @@ /* * Author: Lambda.Tiger * This function checks whether an ammunition type should cause spalling - * + * * * Arguments: * 0: _ammo - cfgAmmo type of ammo to check - * + * * Return Value: - * Whether the round type would spall when hitting an object + * Whether the round type would spall when hitting an object * * Example: * ["B_556x45_Ball"] call ace_frag_fnc_shouldSpall; @@ -20,7 +20,7 @@ params ["_ammo"]; private _shouldSpall = GVAR(spallRoundCache) get _ammo; -if !(isNil "_shouldSpall") exitWith {_shouldSpall}; +if (!isNil "_shouldSpall") exitWith {_shouldSpall}; private _caliber = getNumber (configFile >> "CfgAmmo" >> _ammo >> "caliber"); private _explosive = getNumber (configFile >> "CfgAmmo" >> _ammo >> "explosive"); diff --git a/addons/frag/initSettings.inc.sqf b/addons/frag/initSettings.inc.sqf index cf8f533ccc..c45702130b 100644 --- a/addons/frag/initSettings.inc.sqf +++ b/addons/frag/initSettings.inc.sqf @@ -26,7 +26,7 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)]; ] call CBA_fnc_addSetting; [ - QGVAR(fragSimComplexity), "LIST", + QGVAR(fragSimComplexity), "LIST", [LSTRING(FragMode), LSTRING(FragMode_Desc)], [_category, LSTRING(Frag)], [[2, 1, 0], [LSTRING(FragMode_Opt2),LSTRING(FragMode_Opt1),LSTRING(FragMode_Opt0)], 2], @@ -34,7 +34,7 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)]; ] call CBA_fnc_addSetting; [ - QGVAR(atLeastOne), "CHECKBOX", + QGVAR(atLeastOne), "CHECKBOX", [LSTRING(MinFrag), LSTRING(MinFrag_Desc)], [_category, LSTRING(Frag)], false, diff --git a/addons/frag/script_component.hpp b/addons/frag/script_component.hpp index 50e248fac6..63cc715fae 100644 --- a/addons/frag/script_component.hpp +++ b/addons/frag/script_component.hpp @@ -24,7 +24,7 @@ #define ACE_FRAG_COUNT_MIN 5 #define ACE_FRAG_COUNT_MAX 50 #define ACE_FRAG_HITPOINTS ["spine1","spine2","spine3","head","leftarm","leftarmroll","leftforearm","rightarm","rightarmroll","rightforearm","pelvis","leftupleg","leftuplegroll","leftlegroll","leftfoot","rightupleg","rightuplegroll","rightleg","rightlegroll","rightfoot"] -#define ACE_FRAG_HITPOINTS_WEIGHTS +#define ACE_FRAG_HITPOINTS_WEIGHTS #ifdef DEBUG_MODE_FULL #define __FADE_TIME 1 diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index 2ccec34118..1eac8bcfe8 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -253,7 +253,7 @@ (SP 전용) 임무 / 편집자가 다시 시작해야합니다. SP 게임 모드에서만 파편화 및 탄환파편의 시각적 추적을 가능하게 합니다. - (Local only) Frag/Spall Debug Tracing + (SP only) Frag/Spall Debug Tracing (Solo SP) Seguimiento de depuración de Fragmentación/Astillamiento (Tylko SP) Wizualny debug odł./odpr. (Pouze SP) Debug sledování Frag/Úlomků @@ -269,7 +269,7 @@ (僅在單人模式) 碎片/剝落除錯追蹤 - (Local only) Requires a mission/editor restart. Enables visual tracing of fragmentation and spalling rounds in SP game mode only. + (SP only) Requires a mission/editor restart. Enables visual tracing of fragmentation and spalling rounds in SP game mode only. (Solo SP) Requiere un reinicio misión/editor. Permite el seguimiento visual de la fragmentación y astillamientos de los proyectiles en modo SP. (Tylko SP) Wymaga restartu misji/edytora. Aktywuje wizualne śledzenie odłamków oraz odprysków w trybie gry Single Player. (nur SP) Splitter-/Explosions-Debugging