Usersettings.con (found in My Documents/Battlefield 2/Profiles)
This file is found under your \\Program Files\\EA Games\\Battlefield 2\\mods\\bf2\\Settings directory. There are two particular settings of interest here which are reported to help reduce the inaccurate feel /hit detection of weapons fire in BF2:
SettingsManager.floatSet GSDefaultLatencyCompensation 0.100000
This setting controls latency (or 'lag') compensation, which involves the game attempting to offset the delay between information being sent from your machine to the server and back again (as measured in milliseconds by your Ping). In games without client-side latency compensation, you have to lead your target by a certain amount, since whenever you fire a weapon your bullets will actually register in the game world with a delay equal to your Ping. In BF2, whenever you fire a weapon, whatever appears in your crosshairs at that particular moment is registered as being hit, regardless of where they actually are at that point in time. This removes the need to predict where your target will be based on ping delay, and makes the game feel more responsive. However it can also introduce quirks like ducking behind a wall and still being hit.
In any case, this setting controls the default latency compensation applied, and the normal value is 0.100000 = 100ms. Some people claim that by adjusting this value to match your average ping in the servers you play, it can improve hit detection. For example, if you typically have a 50ms Ping, setting this to 0.050000 should improve the feeling of accuracy in the game. To be honest having experimented with this setting in isolation I didn't notice much difference either way. I believe the latency compensation is actually dynamic, only starting at the default value given in this setting, and adjusting to match your average ping over time. However even if it isn't, in general you can try to match your Ping with this setting to see the results. Note that lowering this setting well below or above your average Ping will only add to lag and may decrease your accuracy at best, so stick with keeping it equal to the Ping you get on most servers.
SettingsManager.U32Set GSInterpolationTime 100
Interpolation is a technique used to increase the smoothness of an online game. Basically interpolation is the prediction of where a particular moving object or character is currently located in the game world, based on data received on where they were and where they are. For example if an enemy soldier is running across the screen, interpolation allows their movement to appear fluid, calculating their predicted movement across the screen even though your computer is receiving only periodic updates of where they actually are. So instead of seeing a person jerkily warping from point to point, you see smooth animated motion all the way along. This especially helps to keep things smooth if/when packets are momentarily lost between the server and you; the game knows where the player currently is, where they were a moment ago, and calculates and displays the movements in between.
By default, Battlefield 2 appears to have a 100 millisecond buffer for interpolation. The problem with this is that while making things appear smoother, it also means that when firing upon a fast-moving object you may miss where they actually are as you're effectively facing an additional 100ms delay. At least that's the theory, and in general in my experimentation I found slightly improved hit detection results (and no noticeable increase in jerkiness) by using a lower value of 50 or even 30 for this setting. Note however that this variable should not be set too low (and certainly not a value of 0) as it will result in increased warping/jerky movements, and if you generally have a ping higher than 100 you shouldn't lower this setting. For those who do try this, also remember that the improvement from lowering this setting is not dramatic, since we're talking a difference of say 50ms (1/20th of a second). However particularly in situations where your opponent(s) are moving fast and/or erratically your accuracy should be noticeably improved.
It is important to understand that the generally inaccurate feel of most weapons in BF2 is intentional, as realism has been sacrificed for the sake of gameplay. Techniques to steady your aim such as going prone and using short bursts can help improve hit rates. Furthermore it appears that much of the time the lack of hit registration is due to lost packets. I've noticed the Battlefield series suffers quite a bit from packet loss, often manifesting as serious warping or jerkiness, getting caught against walls or other barriers, and incidents where you can appear to be firing at an unmoving target at point blank range and still somehow miss with most bullets; information is being lost to/from the server.
The key thing to note about both settings above is that unfortunately neither I nor anyone else knows for sure what the real story is - only EA/DICE know the truth about how their netcode works, and they've stated nothing to clarify these settings. What I've written above is based on my own experimentation, understanding and research about these settings. For the most part I haven't found any problems with PunkBuster by using the recommended settings above, though some servers may be very strict and not allow these values to be changed. If altering these values seems to make things worse for you, or you experience more jerkiness, lag or disconnections, reset them to the defaults shown above and leave them be.