This is a fairly simple script I began writing to after being a bit curious about how ARMA's bullet physics worked, particularly the ricocheting. Recently there was a post on /r/ARMA about bullet penetration, so I cleaned it a bit up to get what you see below. This'll basically trace the movements of projectiles, so you can very clearly see their flight path, arc, and interaction with cover. It's not perfect, but it does what it needs to pretty well. Plus it's surprisingly addicting to just run around and shoot stuff just to see what happens to the bullets. UPDATE 10/26/2013: As some of you may have seen, Dslyecxi recently made a video that featured a modified version of this script, where the color of the line was reflective of the velocity of the bullet at that moment. He posted his modifications, which are now implemented in the main script! To activate it, pass true as the seventh parameter, like so: [player, nil, nil, nil, nil, nil, true] call hyp_fnc_traceFire; Note that as it stands, enabling the velocity-based coloring will override whatever color you specify in the second parameter. I have an idea or two of ways to fix it, but wanted to get this update out there first. Also, I completely forgot that the Steam Workshop was a thing, so I published a very simple mission with this script, and Tonic's Virtual Ammobox System and Virtual Vehicle Spawner enabled here: http://steamcommunity.com/sharedfiles/filedetails/?id=189421090 If there are any problems with the Steam Workshop mission, please mention them to me, as I very rarely actually publish missions, just scripts. The code: Download the raw code: https://raw.github.com/hypnomatic/ARMA_Examples/master/Tracers%20Script/Tracer_v0-2-1.sqf Link to Steam Workshop page for a simple mission featuring this script: http://steamcommunity.com/sharedfiles/filedetails/?id=189421090 How to use: For basic use on just yourself, assuming you don't want to deal use the Steam Workshop mission, all you need to do is create a new mission, and paste the linked code into your init.sqf. After all that code in your init.sqf, add the line: [] call hyp_fnc_traceFire; Save the file, restart your mission, and you should be good to go! With no extra parameters, this code is functionally equivalent to the original: it creates red lines behind projectiles fired by the player that are super smooth and persist forever. You can specify more parameters within the square brackets if you want a more specific outcome, as in the following examples. [] call hyp_fnc_traceFire; Save the file, restart your mission, and you should be good to go! With no extra parameters, this code is functionally equivalent to the original: it creates red lines behind projectiles fired by the player that are super smooth and persist forever. You can specify more parameters within the square brackets if you want a more specific outcome, as in the following examples. The syntax and expected parameters are as follows: (Note that all 7 parameters have default values, so you don't need to specify all of them if you don't want that specific feature.) [_unit, _color, _lifetime, _interval, _maxDistance, _maxDuration, trackVel] call hyp_fnc_traceFire; 0: _unit - Unit or vehicle to trace the projectiles of. Defaults to the player if no other parameter is specified.
1: _color - Color array for all lines fired by this unit. This is an array formatted as [r,g,b,a], with each value being between 0 and 1. (BIS wiki page)
2: _lifetime - Maximum number of seconds the projectile's line should linger after firing. Note that this timer starts at the same time as maxDuration, but is not checked until after the script finishes drawing a line. This can be thought of as a lower bound for how long a line will exist, as all lines will persist AT LEAST for lifetime's duration.
3: _interval - Number of frames to skip between each adding segment of the line. Defaults to skipping no frames, so the lines are updated every frame.
4: _maxDistance - Maximum distance from the initial position a projectile's line should be updated. Defaults to no maximum.
5: _maxDuration - Maximum number of seconds from firing a projectile's line should be updated. Defaults to no maximum.
6: _trackVel: If true, _color is overridden by the a color indicative of velocity at that moment. Thanks to Dslyecxi for this one! (Default false)
All of these options may be a bit confusing, so let me offer an example or two: [player, [1,0,0,1], 3, 2, nil, 3] call hyp_fnc_traceFire; Can be thought of as saying: Track every projectile of: the player, with a red line, that will last for at least 3 seconds, that is updated every third frame (ie 2 frames skipped between each update), with no limit on distance, but will not be updated for more than 2 seconds. Now, if you want to completely omit a parameter so the default value is used, you have two options. You can either pass nil in place of that parameter, as in the example, which is ARMA's equivalent of "nothing". If you only want to pass specify a unit, and use the defaults for everything else, simply omitting all unwanted parameters like so: [player] call hyp_fnc_traceFire; However note that this only works if you want to leave out all parameters after the ones you specify. So if I wanted to specify a player and a max duration, I would need to pass: [player, nil, nil, nil, nil, 5] call hyp_fnc_traceFire; If you don't really mess with scripts much, this may be a bit tough to wrap your head around, so I'll be happy to answer any questions you may have. To get a bit more fancy, you can create a few units/vehicles in the editor, name them, and follow the example near the top of this post to specify your own parameters! Just put whatever you named your unit in the editor in the first parameter, and you're good to go! Just as an example: [player] call hyp_fnc_traceFire; [heli1] call hyp_fnc_traceFire; [car1] call hyp_fnc_traceFire; Would cause bullets fired by the player's unit, heli1, and car1 to be traced with default options. To give you yet another idea for what you can do, the following code will cause all units on the map to have their projectiles traced with team-specific colors that disappear after 3 seconds: { if (faction _x == "OPF_F") then { [_x, [1,0,0,1], 3, 2, nil, 3] call hyp_fnc_traceFire; }; if (faction _x == "BLU_F") then { [_x, [0,0,1,1], 3, 2, nil, 3] call hyp_fnc_traceFire; }; if (faction _x in ["IND_F", "IND_G_F", "CIV_F"]) then { [_x, [0,1,0,1], 3, 2, nil, 3] call hyp_fnc_traceFire; }; } forEach allUnits; In Use: Here's Dslyecxi's recent video featuring this script with his now-implemented modifications:

And here's a snazzy video by Jester814 that makes fairly heavy use of the original version of this script:

Notes/Known Bugs: - Many optics, and some vehicle interiors (Pawnee comes to mind) do not play nicely with the drawn lines. A chunk of space floating in front of the sight will block out the lines behind them, so I recommend testing without optics. The Pawnee, for whetever reason, does not show any drawn lines at all in first person, so you need to enter third person to see lines from it. - Water *mostly* works. Try it and you'll see what I mean. My guess is that it's getting the position relative to the sea level fine, but then has the height of the wave below it added, causing some mildly bendy lines. - You may notice that the "fired" eventHandler has a seemingly redundant parameter added on. This actually is an interesting consequence of having the code spawned, as it seemed the scheduler put just enough of a delay between the event firing and the code within the spawn executing that the first gotten position of the bullet would be a few meters away. So this gets the first position before the spawn, and passes it in, and all seems to work well. Note that I don't actually have much scientific evidence to backup my theory, just that the first gotten position within the spawn was certainly late, while outside the spawn it was just fine.