AHA!!

Found the missing boundary values, the firer values sometimes arent the same as the receivers values by 1 point.

It is now obvious that the receiver damage calculations are done in a different way to the shooter calculation, however I would guess its still rounding differences, shooter being floor rounded with the receiver rounded to the nearest integer

I tested firing vs receiving damage stats at different distances. The first figure of the pair is the firer, the second figure is the receiver. Stand off barrel was fitted.

@10M 24/24 23/23 21/21 24/25 22/22 22/22 21/21 23/24 24/24 23/23 21/21 20/20 21/22

@20M 20/20 21/22 20/21 22/22 21/21 20/20 22/22 21/21 21/21 19/20 23/23 21/21 19/19

@51M 14/14 15/15 16/17 13/13 13/14 13/14 13/13 13/14 13/13 13/14 13/13 16/17

Taking into account this difference that explains the missing +1 on the upper boundary, however it does not account for the slippage over distance, nor does it account for the barrel range inconsistency (seen here 51M should be medium distance, 35+20M for the stand off barrel, but we see ingame long range values at both firer and receiver ends)

The slippage seems to be a function of distance vs how far it is from the next range divider. I would maybe start to point a finger at pythons Vector Distance calculations for the MP5 +3 and again I would maybe look to rounding differences in the math to see why values are being eroded the farther they get from the divider value (altho this part is pure conjecture, it could be some different reason entirely).

The triangulation function getVectorDistance uses absolute values but I cant seem to find the core math library yet .... anyone? EDIT: ah perhaps its in dice_py.dll, anyone got any dll decompilers set up?