A few weeks ago I ran into another incident where backwards compatibility and bug fixes just couldn’t coincide. The problem was in a SourceMod function:
int FindSendPropOffs(string property);
The purpose of this function was to find the memory offset of a property in a Half-Life 2 entity. It worked fine for months, until a user reported it broke on a specific entity’s property. The entity property layout looked like this:
CEntity -- ParentProperty (offset X) -- ChildProperty (offset Y)
In this sense, ChildProperty‘s memory offset of Y was relative to X, and thus its actual offset was X+Y. However, FindSendPropOffs was only returning Y. This prevented lots of utility code from working with that specific property.
Unfortunately, this is the sort of bug you can’t fix — it would break backwards compatibility. Consider the following use:
new offset = FindSendPropOffs("ParentProperty") + FindSendPropOffs("ChildProperty");
The above usage is written with an understanding of how FindSendPropOffs malfunctions, and corrects for it. But if we were to change how it resolved its offsets, that demonstration would no longer work.
The only thing to do is add new, separate functionality, and to document the difference in detail.