Вроде бы разобрался на основе 14333 с Jam и Auth опкодами, с ними все прозрачно.
Использовал Opcode Calculator от Chameleon.
Но не понятно, что делать с regular opcodes, согласно его гайду
Цитата:
So to find a client handler for a particular SMSG opcode you can convert it to an offset using tools and
then search full decompile for ‘+ 8080’ (replaced by correct offset).
|
Получены оффсет 4844 (0x12EC) и converted 867 на примере опкода SMSG_NOTIFICATION 30375.
Текстовый поиск по + 4844 или + 0x12EC ничего не дает, кроме
Код:
void __usercall ClientDestroyGame(int a1<ebx>, double a2<st6>, double a3<st5>, double a4<st4>, double a5<st3>, double a6<st2>, double a7<st1>, double a8<st0>, int a9, int a10, int a11)
{
int v11; // eax@2
int v12; // eax@2
int v13; // eax@2
int v14; // eax@2
int v15; // eax@2
int v16; // eax@2
int v17; // eax@2
int v18; // eax@2
void *v19; // edi@3
int v20; // ecx@4
void *v21; // edi@9
if ( dword_CFA6A4 )
{
EventUnregister(5, (int)ClientIdle);
v11 = g_clientConnection;
*(_DWORD *)(g_clientConnection + 4844) = 0;
*(_DWORD *)(v11 + 13036) = 0;
v12 = g_clientConnection;
*(_DWORD *)(g_clientConnection + 2272) = 0;
*(_DWORD *)(v12 + 10464) = 0;
v13 = g_clientConnection;
*(_DWORD *)(g_clientConnection + 1840) = 0;
*(_DWORD *)(v13 + 10032) = 0;
v14 = g_clientConnection;
*(_DWORD *)(g_clientConnection + 3836) = 0;
*(_DWORD *)(v14 + 12028) = 0;
v15 = g_clientConnection;
*(_DWORD *)(g_clientConnection + 1800) = 0;
*(_DWORD *)(v15 + 9992) = 0;
v16 = g_clientConnection;
*(_DWORD *)(g_clientConnection + 5324) = 0;
*(_DWORD *)(v16 + 13516) = 0;
v17 = g_clientConnection;
*(_DWORD *)(g_clientConnection + 7116) = 0;
*(_DWORD *)(v17 + 15308) = 0;
v18 = g_clientConnection;
*(_DWORD *)(g_clientConnection + 6024) = 0;
*(_DWORD *)(v18 + 14216) = 0;
dword_E0C6CC = 0;
dword_E0C650 = 0;
dword_E0C600 = 0;
dword_E0C864 = 0;
if ( dword_CFA754 )
{
v19 = dword_CFA754;
sub_4011F0((int)dword_CFA754);
SMemFree(v19, (int)"delete", -1, 0);
dword_CFA754 = 0;
}
FriendList__Destroy();
AreaListShutdown();
CGItem_C__Shutdown();
CGPlayer_C__Shutdown();
PlayerClientShutdown();
LootDestroy();
CGUnit_C__Shutdown(a2, a3, a4, a5, a6, a7, a8);
CGGameObject_C__Shutdown();
CGObject_C__Shutdown();
MovementDestroy(v20, a2, a3, a4, a5, a6, a7, a8);
LootRollDestroy();
EventUnregister(5, (int)MovementIdleMoveUnits);
Spell_C_StopTargeting(a2, a3, a4, a5, a6, a7, a8);
ClntObjMgrDestroyStd(a2, a3, a4, a5, a6, a7, a8);
CGUnit_C__PostShutdown();
CGObject_C__PostShutdown();
SpellVisualsClear(a2, a3, a4, a5, a6, a7, a8);
CEffect__Destroy(a2, a3, a4, a5, a6, a7, a8);
CGWorldFrame__SetScreenEffect(a7, a8, 0);
if ( dword_E96728 )
CGWorldFrame__UnitClear((void *)dword_E96728);
World__UnloadMap();
WeaponTrailsShutdown();
PlayerNameShutdown();
WorldTextShutdown();
CGGameUI__ShutdownGame();
ClientDestroyGameTime();
SI3__ShutDownAmbienceFlavor();
SI3__ShutdownZoneSoundsHandler();
SI3__FreeZoneIntros();
SE3__StopAllSounds(-2, 0);
dword_DE74F0 = 0;
ClntObjMgrDestroyShared();
AccountDataDestroy(0);
dword_CFA6A4 = 0;
LoadingScreenDisable();
if ( dword_CFA6B0 )
{
dword_CFA6B0 = 0;
dword_CFA6AC = 0;
}
BattlenetUI_LeaveRealm();
CAnimKitManager__UninitSystem();
CAnimReplacementSetDef__UninitSystem();
if ( dword_CFC8D0 )
{
v21 = dword_CFC8D0;
CCameraManager___CCameraManager((int)dword_CFC8D0);
SMemFree(v21, (int)"delete", -1, 0);
dword_CFC8D0 = 0;
}
if ( !a9 )
ClientDBDisconnect();
if ( a10 )
{
CGlueMgr__Resume(a1, a9);
if ( a11 )
dword_E7A798 = 11;
CGlueMgr__SetScreen();
}
}
}
Что я не так делаю?