/* * Author: Glowbal, Ruthberg * Handles wind deflection for projectiles. * * Arguments: * 0: bullet - Object the event handler is assigned to * 1: airFriction - air friction of the bullet * * Return Value: * Nothing * * Example: * * Public: No */ // #define ENABLE_PERFORMANCE_COUNTERS #include "script_component.hpp" [{ // BEGIN_COUNTER(pfeh); params ["_args"]; _args params ["_lastTime"]; private _deltaT = CBA_missionTime - _lastTime; _args set [0, CBA_missionTime]; private _isWind = (vectorMagnitude ACE_wind > 0); { _x params ["_bullet", "_airFriction"]; private _bulletVelocity = velocity _bullet; private _bulletSpeed = vectorMagnitude _bulletVelocity; if ((!alive _bullet) || {(_bullet isKindOf "BulletBase") && {_bulletSpeed < 100}}) then { GVAR(trackedBullets) deleteAt (GVAR(trackedBullets) find _x); } else { if (_isWind) then { private _trueVelocity = _bulletVelocity vectorDiff ACE_wind; private _trueSpeed = vectorMagnitude _trueVelocity; private _dragRef = _deltaT * _airFriction * _bulletSpeed * _bulletSpeed; private _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); _bulletVelocity = _bulletVelocity vectorDiff _accelRef; private _drag = _deltaT * _airFriction * _trueSpeed; private _accel = _trueVelocity vectorMultiply (_drag); _bulletVelocity = _bulletVelocity vectorAdd _accel; }; _bullet setVelocity _bulletVelocity; }; nil } count +GVAR(trackedBullets); // END_COUNTER(pfeh); }, GVAR(simulationInterval), [CBA_missionTime]] call CBA_fnc_addPerFrameHandler;