Possible fix to XP per kill rounding/truncation issue #740
+2
−2
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The multiplication steps
return nBaseExp * (1.0f + (0.05f * nLevelDiff));
andreturn nBaseExp * (1.0f - (float(nLevelDiff) / ZD));
producefloat
values, but since the return type ofBaseGain
isuint32
, the compiler implicitly truncates the XP value when converting fromfloat
touint32
.By changing the return type of
BaseGain
fromuint32
tofloat
, this preserves the fractional XP value until the very end, when the XP value is converted to an integer usingstd:nearbyint()
.I did very limited testing, but, for example, killing a Level 3 mob as Level 2 player did, in fact, yield
58
rather than57
XP after this change, as intended (I observed on official Blizzard realms that XP per kill is always 8000 rounded up rather than truncated/rounded down).This conversation was originally had over in VMaNGOS, where I proposed a similar change. I observed the same behaviour in CMaNGOS.
I, in no way, pretend to be an expert, and I'm happy to be educated in a different direction if this change is flawed in some way.