vtable
vtable copied to clipboard
Incorrect virtual offsets for CBaseObject in TF2 on Windows
As requested, here's the vtable dumper mismatch that was initially reported on Discord:
CBaseObject::CanBeUpgraded(CTFPlayer*)is offset 375, dumper reports 374CBaseObject::StartUpgrading()is offset 376, dumper reports 375CBaseObject::GetMaxUpgradeLevel()is offset 380, dumper reports 379
[2:24 PM] nosoop: curious what's different between win/linux for the CBaseObject table, windows offsets are off by one there [...] [2:25 PM] nosoop: I mean the windows offset is off by one from actual (CBaseObject::CanBeUpgraded(CTFPlayer) is 375, not 376 as the webapp reports) [...] [3:21 PM] asherkin: ah, multiple inheritance [3:26 PM] asherkin: I suspect the problem is it thinking that FindObjectOnBuildPoint should be skipped on Windows [3:28 PM] asherkin: the confusion seems to be because that is both on the actual CBaseObject vtable and one of the MI classes [3:29 PM] asherkin: in fact I think that case is one of the main ones that led to the "This class uses C++ features which can not be accounted for by this tool." as there doesn't seem to be a way to tell them apart
edit: mixed up the dumper results because of a copy/paste error, my bad
Confus. The dumper-reported values were actually off by -2. These should be correct now.
Same issue as #7; FindObjectOnBuildPoint is indeed skipped on Windows (the dumper is correct on this one), but CanBeUpgraded is overloaded, and there is a CBaseObject::CanBeUpgraded(void) inserted at offset 374 (all the other entries are shifted one to the right).
Have to watch out for subclasses, though; CTFPlayer::ChangeTeam(int) exists as an override for CBaseEntity, but CTFPlayer also implements its own CTFPlayer::ChangeTeam(int, bool, bool, bool) exclusive to it and its subclasses. Can't make those contiguous.