Skip to content

Commit

Permalink
Frag - Implement Arma v2.18 changes from acemod#10157 (acemod#10313)
Browse files Browse the repository at this point in the history
* removed old parameter changed in acemod@f28d5d2

* compacted text a bit

* formatting whitespace

* Grammatical erros

* Changes as discussed here acemod#9728 (comment)

* Few quick optimizations of == to isEqualTo

* Debug updated to be easier to control

* Changed how spall hold off is calculated to avoid repeated unneeded computations

* clarified a hold off variable

* Better approach to ACE_FRAG_RM_EH macro

* Git rid of superfulous stringtable entries

Co-authored-by: johnb432 <[email protected]>

* unneeded parens

Co-authored-by: johnb432 <[email protected]>

* Clarified arguments

Co-authored-by: johnb432 <[email protected]>

* getposATL to getPosATL

Co-authored-by: johnb432 <[email protected]>

* Update addons/frag/functions/fnc_dev_addRound.sqf

Co-authored-by: johnb432 <[email protected]>

* Function header changes

Co-authored-by: johnb432 <[email protected]>

* another great isNotEqualTo opportunity

Co-authored-by: johnb432 <[email protected]>

* formatting changes

Co-authored-by: johnb432 <[email protected]>

* unneeded parens

Co-authored-by: johnb432 <[email protected]>

* Declared _ammoInfo twice

* optimized around checking if systems are active and moved debug arguments to an ifdef

* Removed white space from removing an if statement in a previous commit

* Removed superfulous parenthese

Co-authored-by: johnb432 <[email protected]>

* clarified function description and removed unneeded comments

* Moved "isServer" check to initRound function

* acemod#9728 (comment)

* changed params statement, function header, and propigated doFrag argument changes

* capitization from cfg to Cfg in config lookups

* changed default arguments, check isKindOf to "CAManBase"

* Updated function headers

* white space and define placement changes

* removed 2 argument option and removed some defaults

* removed spurious commas

* removed unused debug GVAR

* Switched debug clear traces from addAction to ACE self interact

* variable names weren't verbose enough

* Mactched format acemod#9728 (comment)

* Updated debug settings

* Shot parent possible fix acemod#1

* Removed extra text from CfgAmmoFragParameters

* Makes sure spall power square root is positive and also we don't produce fragments when for some reason the round accelerates.

* white space for clarity

Co-authored-by: johnb432 <[email protected]>

* Optimize dev_hitbox deleting

Co-authored-by: johnb432 <[email protected]>

* saving people from their own bad testing setup

* Since the functions always exist, I guess these variables should too

* Fixe bad search function

* optimization, see acemod#9728 (comment)

* changed SPG-9 Fragments

* removed unneeded toLower

* Changed case output to match config

* Increased relative chance to hit torso/pelvis when fragemnt should hit.

* Removed double space

* updated some round types

* Added commented 2.18 commands and updated script component

* added print incomplete only option to fnc_debugAmmo

* removed all spaces from macros

* removd unneeded define

* a Brett (HEMTT) suggested change I miss

* Apply suggestions from code review

Small formatting changes and small errors

Co-authored-by: johnb432 <[email protected]>

* Removed doublespace

Co-authored-by: johnb432 <[email protected]>

* Update addons/frag/functions/fnc_dev_addRound.sqf

If the round isn't in the hashmap anymore, we have to stop the PFH.
Brought code up to same standard as used in FUNC(dev_trackObj). - johnb432

Co-authored-by: johnb432 <[email protected]>

* Update addons/frag/functions/fnc_dev_drawTrace.sqf

Co-authored-by: johnb432 <[email protected]>

* variable name changes

* magic number clean up and white space

* white space, function headers and variable names

* small Should spall optimization

Co-authored-by: johnb432 <[email protected]>

* Removed blacklist functions and settings

* reformatted function headers, removed value type checking, and changed lazy eval.

* fixed missing underscore in change from review

* function header, lazy eval,  and params list simplifications

* function header and variable name readability

* changed defaults to make them more clear they're just a default value

* Updated wiki to be clearer in a few areas, and add some other information I've found working on this

* added MP debug compatability

* Possible shouldFrag legibility improvement

* added changes to stringtable

* Grammar sweep on the wiki, and added some clarifications to config values

* optimized dev_trackHitbox and made variables more explicit

* Cleaned up documentation and documentation

* reorganized postInit CBA_settingInitialized EH

* missing underscore in fnc_dev_trackObj

Co-authored-by: johnb432 <[email protected]>

* stopped adding unneeded extra points

Co-authored-by: johnb432 <[email protected]>

* cleaned un-updated stringtable entries

* reworked some function headers and deleted whitespace in doFragTargeted

* Removed outdated code

* Formatting and header fixes

* Ignore curators and spectators

* Made clear traces global again, added interaction condition

* Change stringtable entries

* Removed unused stringtable entries & fixed hitbox description

* Small coding standard changes (missing semicolons on  non-return values, extra parenthesis)

* Changed sphere size and added return based on usage in dev_trackHitBox

* removed "_lo" random fragment entries as they are unused

* doFragRandom was always being called and spawning at least 5 fragments even when the fragment budget of 50 was reached. Fixed variable name (AGL instead of ATL).

* removed unnceassary "disableCollisionWith"

* Clarified trace statements and corrected format and spelling

* Do spall exits for time 90% of the time (round hits multiple walls) and should exit on "hitting ground since no spalling is generated

* Fixed ordering in which frag hold off variables are set to not skip when unneeded

* initRound ordering and fixed define names

* Fixed function header

* reformatted comments and some v2.18 remakrs comments

* Removed unneeded ground offset

* Expanded TRACE

* Fix typo

* Moved event to preInit

* Updated default fallback frag distance to be less extreme and changed fixed a magic number

* Randomized random frag directions

* removed some magic numbers, and cached numbers from shouldSpall

* removed magic numbers and cached values preemptively (normally spallInfoCache is called later, but we pull the right config parameters so we might as well store them)

* Unify example formatting

Co-authored-by: Grim <[email protected]>

* cleaned up function examples

* removed excess square brackets

* Final function example reformat

* Update addons/frag/script_component.hpp

* Corrected docs

* Use `getOrDefaultCall`

* Removed unused classes, redefined using macros to minimize error and make review easier

* updated debugging output and fixed velocity error

* Reformatted for legibility and debug output

* caught calc error while answer johnb's question

* Almost finished with compats and I had some changes to align vanilla as well

* Missed variable when updating

* Added unneeded class details to make PBOproject happy

* Forgot to update doFragRandom docs with previous changes

* and the debug context

* Readd blacklist

* Fixed an issue with fragments being created above water for explosions below the surface

* Exposed projectile event handlers for both blacklist use and other shenanigans.

* Revert "Exposed projectile event handlers for both blacklist use and other shenanigans."

This reverts commit eaff498.

* added debug information and folded if statements

* fixed error (if statement with no argument)

* Only send blacklist updates to the server

* Added default fragCount fallback value based on current ACE frag range calculation

* Converted all positions for doFrag to AGL since we're converting to that now

* removed feet hitpoints & tightened multishot submunitions.
Feet hitpoitns aren't used since calculation for trajectory doesn't account for drag, fragments aimed at feet won't hit

* Merge branch 'acemod:master' into master

* Revert to 60a0dae, merge conflict wasn't resolved properly

* Removed event handlers

* Changed blacklist to acting on local projectiles to match initial performance

* added fired EH and moved projectile tracking to be local to projectile

* updated initialization and should frag to check for submunitions since we no longer rely on init EH

* Fixed calls for shouldFrag and got rid of old initRound.sfq (maybe back after 2.18)

* fixed small mistakes in names and function calls

* fixed frame offset to avoid hitting dead targets

* Fixed config path in shouldFrag

* Didn't know that PBO project needed trailing {} on class inheritance structures

* fixed more useless trailing {}

* Initial rollback to old frag simulation and spalling simulation. Updated spall to function and helpter functions as well

* missed comma

* remove fragCount from config

* made addBlackList remove projectile EHs

* updated config path to be relevant to post-EH version

* All spalling in current version is local

* updated search pattern to one discussed in PR acemod#9728

* updated defines to match implementation

* removed commented out debug information from nouber

* removed magic numbers and code with no effect

* removed more magic numbers

* unfucked a comma

* fixed debug def names

* updated documentation

* changed debug colors

* mass must be in grams in this version I guess

* fixed errors in frag with downgrade

* fixed timing and other spall issues

* updated some defne names and usages

* increased code legiblity and optimized some randomizations

* clarified parts of the spall event chain

* Optimized loop to find spall position using larger steps and fewer operations per loop

* fixed small errors

* removed unused variables & EHs and set defaults in the case debug mode draw isn't used

* removed "class eventhandler" references

* removed _fragCount reference in newly backported debug functions

* fragmenting projectile velocity isn't used anywhere

* removed unused variables, implemented fixes from full rewrite PR, and fixed math errors

* added debug draw mode to DEBUG_ENABLED_FRAG define check

* fix documentation to make units clear on metal and filler quanities

* command capitalization

* added target point debug spheres

* fixed target sphere visability

* Jank fix so that the unit firing can get hit with it's own fragments

* accidentally committed script_component.hpp w/ debug enabled

* Alternative way to address shot parent self-harm issue

* missed comma, going to bed, sorry

* add newline and fix blacklist

* legability formatting

* removed extra newlines and double spaces

* Updated function documentation

* Removed unused stringtable items

* Debug sphere conditional was missing in frago

* Completed suggested changed by johnb432

* restored 40mm grenade fragmentation

* Apply suggestions from code review

Fixed a number of config errors

Co-authored-by: PabstMirror <[email protected]>

* Fixed firefist inheritance and order of 125mm shell

* Wrong order on reflections variables, but it's not like anyone uses that

* Added projectile locality

* Added proper projectile locality checks

* left some locality debug text

* This isn't worthy of a warning as most of the time _objectHit is null is due to the projectile hitting the ground

* Removed a newlines for code brackets in arrays

* updated debug functions with some minor optimizations

* Apply suggestions from code review

Grammar and spelling corrections

Co-authored-by: Jouni Järvinen <[email protected]>

* didn't consider someone might use explosion reflections but not frag

* addressed future arma v2.18 changes more aptly

* Fixed authors line on fired function. Used to make sense different when it was an init function based on ammunition extended eventhandlers, missed the revert.

* switch all hash fallbacks to getOrDefaultCall and turned default fragments array into a define

* Transitioned frag system from fired to ace explode event system

* decreased chance to hit / fragment inaccuracy.

* fixing setShotParents only sometimes setting first argument, not instigator

* cleanup

* Slight optimization of "_vecVar" calculation

* removed dev_addRound function

* Command changes for Arma 2.18

* Fixed debug setting changes

* missed exit condition

* removed shot parents due to local creation of spall

* simplified comment

* Adjusted whitespace for readability

* Reformatted comments per Johnb432's suggestions

Co-authored-by: johnb432 <[email protected]>

* one more indent fix

---------

Co-authored-by: johnb432 <[email protected]>
Co-authored-by: Grim <[email protected]>
Co-authored-by: PabstMirror <[email protected]>
Co-authored-by: Jouni Järvinen <[email protected]>
  • Loading branch information
5 people authored Oct 25, 2024
1 parent 56eaac9 commit cd72fab
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 103 deletions.
4 changes: 1 addition & 3 deletions addons/frag/functions/fnc_fired.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,7 @@ private _hitPartEventHandler = _projectile addEventHandler ["HitPart", {
private _ammo = typeOf _projectile;
private _vectorUp = vectorUp _projectile;

/*
* Wait a frame to see what happens to the round
*/
// Wait a frame to see what happens to the round
[LINKFUNC(doSpallHitPart), [_projectile, _objectHit, _posASL, _velocity, _surfNorm, _surfType, _ammo, _vectorUp]] call CBA_fnc_execNextFrame;
}];
private _penetratedEventHandler = _projectile addEventHandler ["Penetrated",LINKFUNC(doSpallPenetrate)];
Expand Down
189 changes: 89 additions & 100 deletions addons/frag/functions/fnc_frago.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -39,120 +39,109 @@ _shellType call FUNC(getFragInfo) params ["_fragRange", "_fragVelocity", "_fragT

private _fragPosAGL = ASLToAGL _fragPosASL;
TRACE_5("fragValues",_fragPosASL,_fragPosAGL,_fragRange,_fragVelocity,_metalMassModifier);
// Post 2.18 change - uncomment line 43, modify lines 45, and remove lines 44, 51-57, 64-66
// private _targets = [ASLToAGL _fragPosAGL, _fragRange, _fragRange, 0, false, _fragRange] nearEntities [["Car", "Motorcycle", "Tank", "StaticWeapon", "CAManBase", "Air", "Ship"], false, true, true];
private _objects = _fragPosAGL nearEntities [["Car", "Motorcycle", "Tank", "StaticWeapon", "CAManBase", "Air", "Ship"], _fragRange];
if (_objects isEqualTo []) exitWith {

// Compile possible targets including units, vehicles, and crews
private _targets = [_fragPosAGL, _fragRange, _fragRange, 0, false, _fragRange] nearEntities [["Car", "Motorcycle", "Tank", "StaticWeapon", "CAManBase", "Air", "Ship"], false, true, true];
if (_targets isEqualTo []) exitWith {
TRACE_2("No nearby targets",_fragPosAGL,_fragRange);
0
0 // return
};

// grab crews and add them in so that targets stay approx. sorted by distance
TRACE_1("",_objects);
private _targets = [];
{
private _crew = crew _x;
_crew pushBackUnique _x;
_targets append _crew;
} forEach _objects;
TRACE_2("",_fragRange,count _targets);
TRACE_3("",_fragRange,count _targets,_targets);

private _fragCount = 0;

private _fragArcs = [];
_fragArcs set [360, 0];

if (_targets isNotEqualTo []) then {
if (GVAR(reflectionsEnabled)) then {
[_fragPosASL, _shellType] call FUNC(doReflections);
};
{
private _target = _x;
if (alive _target && {getNumber ((configOf _target) >> "isPlayableLogic") == 0}) then {
(boundingBox _target) params ["_boundingBoxA", "_boundingBoxB"];

private _cubic = ((abs (_boundingBoxA select 0)) + (_boundingBoxB select 0)) * ((abs (_boundingBoxA select 1)) + (_boundingBoxB select 1)) * ((abs (_boundingBoxA select 2)) + (_boundingBoxB select 2));

if (_cubic <= 1) exitWith {};

private _targetVel = velocity _target;
private _targetPos = getPosASL _target;
private _distance = _target distance _fragPosAGL;
private _add = ((_boundingBoxB select 2) / 2) + ((((_distance - (_fragVelocity / 8)) max 0) / _fragVelocity) * 10);

_targetPos = _targetPos vectorAdd [
(_targetVel select 0) * (_distance / _fragVelocity),
(_targetVel select 1) * (_distance / _fragVelocity),
_add
];

private _baseVec = _fragPosASL vectorFromTo _targetPos;

private _dir = floor (_baseVec call CBA_fnc_vectDir);
private _currentCount = RETDEF(_fragArcs select _dir,0);
if (_currentCount < 10) then {
private _count = ceil (random _metalMassModifier);
private _vecVar = FRAG_VEC_VAR;
if !(_target isKindOf "CAManBase") then {
ADD(_vecVar,(sqrt _cubic) / 2000);
if ((crew _target) isEqualTo [] && {_count > 0}) then {
_count = 0 max (_count / 2);
};
if (GVAR(reflectionsEnabled)) then {
[_fragPosASL, _shellType] call FUNC(doReflections);
};
{
private _target = _x;
if (getNumber ((configOf _target) >> "isPlayableLogic") == 0) then {
(boundingBox _target) params ["_boundingBoxA", "_boundingBoxB"];

private _cubic = ((abs (_boundingBoxA select 0)) + (_boundingBoxB select 0)) * ((abs (_boundingBoxA select 1)) + (_boundingBoxB select 1)) * ((abs (_boundingBoxA select 2)) + (_boundingBoxB select 2));

if (_cubic <= 1) exitWith {};

private _targetVel = velocity _target;
private _targetPos = getPosASL _target;
private _distance = _target distance _fragPosAGL;
private _add = ((_boundingBoxB select 2) / 2) + ((((_distance - (_fragVelocity / 8)) max 0) / _fragVelocity) * 10);

_targetPos = _targetPos vectorAdd [
(_targetVel select 0) * (_distance / _fragVelocity),
(_targetVel select 1) * (_distance / _fragVelocity),
_add
];

private _baseVec = _fragPosASL vectorFromTo _targetPos;

private _dir = floor (_baseVec call CBA_fnc_vectDir);
private _currentCount = RETDEF(_fragArcs select _dir,0);
if (_currentCount < 10) then {
private _count = ceil (random _metalMassModifier);
private _vecVar = FRAG_VEC_VAR;
if !(_target isKindOf "CAManBase") then {
ADD(_vecVar,(sqrt _cubic) / 2000);
if ((crew _target) isEqualTo [] && {_count > 0}) then {
_count = 0 max (_count / 2);
};
private _vecVarHalf = _vecVar / 2;
for "_i" from 1 to _count do {
private _vectorDir = _baseVec vectorDiff [
_vecVarHalf - (random _vecVar),
_vecVarHalf - (random _vecVar),
_vecVarHalf - (random _vecVar)
];

private _fragObjSpeed = _fragVelocity * (1 - random 0.5);
private _fragObjVelocity = _vectorDir vectorMultiply _fragObjSpeed;

private _fragObj = createVehicleLocal [selectRandom _fragTypes, _fragPosAGL, [], 0, "CAN_COLLIDE"];
_fragObj setVectorDir _vectorDir;
_fragObj setVelocity _fragObjVelocity;
#ifdef DEBUG_MODE_DRAW
[_fragObj, "green", true] call FUNC(dev_trackObj);
if (GVAR(dbgSphere)) then {
[_targetPos, "(0.88,0.36,0.92,0.8)"] call FUNC(dev_sphereDraw);
};
#endif
INC(_fragCount);
INC(_currentCount);
};
private _vecVarHalf = _vecVar / 2;
for "_i" from 1 to _count do {
private _vectorDir = _baseVec vectorDiff [
_vecVarHalf - (random _vecVar),
_vecVarHalf - (random _vecVar),
_vecVarHalf - (random _vecVar)
];

private _fragObjSpeed = _fragVelocity * (1 - random 0.5);
private _fragObjVelocity = _vectorDir vectorMultiply _fragObjSpeed;

private _fragObj = createVehicleLocal [selectRandom _fragTypes, _fragPosAGL, [], 0, "CAN_COLLIDE"];
_fragObj setVectorDir _vectorDir;
_fragObj setVelocity _fragObjVelocity;
#ifdef DEBUG_MODE_DRAW
[_fragObj, "green", true] call FUNC(dev_trackObj);
if (GVAR(dbgSphere)) then {
[_targetPos, "(0.88,0.36,0.92,0.8)"] call FUNC(dev_sphereDraw);
};
_fragArcs set [_dir, _currentCount];
#endif
INC(_fragCount);
INC(_currentCount);
};
_fragArcs set [_dir, _currentCount];
};
if (_fragCount > _maxFrags) exitWith {};
} forEach _targets;
TRACE_1("targeted",_fragCount);
if (_fragCount > _maxFrags) exitWith {};
private _randomCount = ceil ((_maxFrags - _fragCount) * 0.35);
TRACE_1("",_randomCount);
private _sectorSize = 360 / (_randomCount max 1);

for "_i" from 1 to _randomCount do {
// Distribute evenly
private _sectorOffset = 360 * (_i - 1) / (_randomCount max 1);
private _randomDir = random (_sectorSize);
private _vectorDir = [cos (_sectorOffset + _randomDir), sin (_sectorOffset + _randomDir), sin (30 - (random 45))];

private _fragObjSpeed = _fragVelocity * (1 - random 0.5);
private _fragObjVelocity = _vectorDir vectorMultiply _fragObjSpeed;

private _fragObj = createVehicleLocal [selectRandom _fragTypes, _fragPosAGL, [], 0, "CAN_COLLIDE"];
_fragObj setVectorDir _vectorDir;
_fragObj setVelocity _fragObjVelocity;

#ifdef DEBUG_MODE_DRAW
[_fragObj, "blue", true] call FUNC(dev_trackObj);
#endif
INC(_fragCount);
};
if (_fragCount > _maxFrags) exitWith {};
} forEach _targets;
TRACE_1("targeted",_fragCount);
if (_fragCount > _maxFrags) exitWith {};
private _randomCount = ceil ((_maxFrags - _fragCount) * 0.35);
TRACE_1("",_randomCount);
private _sectorSize = 360 / (_randomCount max 1);

for "_i" from 1 to _randomCount do {
// Distribute evenly
private _sectorOffset = 360 * (_i - 1) / (_randomCount max 1);
private _randomDir = random (_sectorSize);
private _vectorDir = [cos (_sectorOffset + _randomDir), sin (_sectorOffset + _randomDir), sin (30 - (random 45))];

private _fragObjSpeed = _fragVelocity * (1 - random 0.5);
private _fragObjVelocity = _vectorDir vectorMultiply _fragObjSpeed;

private _fragObj = createVehicleLocal [selectRandom _fragTypes, _fragPosAGL, [], 0, "CAN_COLLIDE"];
_fragObj setVectorDir _vectorDir;
_fragObj setVelocity _fragObjVelocity;

#ifdef DEBUG_MODE_DRAW
[_fragObj, "blue", true] call FUNC(dev_trackObj);
#endif
INC(_fragCount);
};

TRACE_1("total created",_fragCount);

END_COUNTER(frago);
_fragCount // return

0 comments on commit cd72fab

Please sign in to comment.