не знаю ты ли этот коммент писал или ты его скопипастил, но для общего развития(не тебе так другим) пишу
// The compiler did some weird shit here to morph 2 vtables into one.
// Just need to decrease thisptr by 0x10 to get to bigger vtable. (IGameSystem + CVScriptGameSystem) instead of just (CVScriptGameSystem).
это не "weird shit". это называется multiple inheritance. и это не просто "bigger vtable" это совершенно другая втейбла(втейбла IGameSystem. ну и там еще лежат дополнительные новые вфунки которые есть в дочерних классах(CVscriptGameSystem, CDOTAVScriptGameSystem) если таковые имеются). во второй же вмт лежат вфунки IVScriptGameSystem.
первая вмт наследована от первой базы(IGameSystem. и также наследованы ее члены), после этого уже вторая вмт наследована от второй базы(и члены второй базы. я так понимаю их нет судя по названию IVScriptGameSystem ибо I это префикс для интерфейса а интерфейс это тупо вмт и больше ничего как правило).
ну если быть супер точным то ващето наследование вот такое:
CDOTAVScriptGameSystem extends CVScriptGameSystem;
CVScriptGameSystem implements IGameSystem, IVScriptGameSystem;
Посмотреть вложение 208172
вот твоя сига это как раз указатель на порцию второго родителя, IVScriptGameSystem( = static_cast<IVScriptGameSystem*>(vscript_system)).
-0x10 это уже будет указатель на порцию первого родителя IGameSystem(и заодно на CDOTAVScriptGameSystem т.к. это самый первый родитель а объект начинается с первого родителя.)
также все геймсистемы можно получать чисто по названию(в этом дампе как раз я так и дампил все геймсистемы пачкой
https://yougame.biz/threads/139802/page-4#post-2582709) сделав сигу на линкед лист геймсистем(в сурс1 движке то же самое токо там не таблица а массив), голова этого листа называется CBaseGameSystemFactory::sm_pFirst(дилибы в помощь)
вот прога с примером multiple inheritance
Посмотреть вложение 208185
Посмотреть вложение 208186
тут в первой вмт(вмт от Base1 + виртуалки от MITest) лежат
Base1::test1(наследована от Base1, без изменений)
MITest::test3(новая вфунка)
во второй вмт(вмт от Base2) лежат
MITest::test2(наследована от Base2 и заоверрайжена)
#include <iostream>
struct Base1
{
const char* test = "shit";
virtual const char* test1() { return "test1"; }
};
struct Base2
{
virtual const char* test2() { return "test2"; }
};
struct MITest : Base1, Base2
{
virtual const char* test3() { return "test3"; }
const char* test2() override { return "test2 override"; }
};
int main()
{
MITest test{};
std::cout << "derived object ptr:" << &test << std::endl;
std::cout << "base1 object ptr:" << &static_cast<Base1&>(test) << std::endl;
std::cout << "base2 object ptr:" << &static_cast<Base2&>(test) << std::endl;
system("pause");
}
derived object ptr:0000004125EFF638
base1 object ptr:0000004125EFF638
base2 object ptr:0000004125EFF648