Rootware Posted April 21, 2021 Posted April 21, 2021 Follows UEngine::Exec decompiled function from Engine.dll i posted here all available builder's client commands. Maybe it will useful for someone. ///flush ///stat [anim|default|reset|fps|render|hardware|game|histograph|xboxmem|matinee|audio|net|packetcount|expacketcount|all|none|console|l2|mem|thread|script|scriptr] ///crackurl ///packetcountstart ///packetcountstop ///expacketcountstart ///expacketcountstop ///reload ///replaysave [start|end] ///replayload [replay name, e.g. Rep00000] ///buildlevel ///releaselevel ///fakeitem Raw (C language) function for the most curious: int __userpurge UEngine::Exec@<eax>(UEngine *this@<ecx>, double a2@<st0>, const wchar_t *a3, struct FOutputDevice *a4) { UEngine *v4; // esi struct FOutputDevice *v5; // edi int v6; // ecx int v7; // eax int v8; // ecx int result; // eax BOOL v10; // eax int v11; // ecx _DWORD *v12; // esi _DWORD *v13; // eax int v14; // eax int v15; // eax int i; // ebx int v17; // eax int v18; // eax void *v19; // eax int v20; // eax int v21; // ecx int v22; // ecx int v23; // ecx int v24; // ecx int v25; // esi int v26; // eax int *v27; // esi int v28; // edx FL2ReplayManager *v29; // ecx int v30; // eax int v31; // eax int v32; // [esp-Ch] [ebp-A8h] int v33; // [esp-8h] [ebp-A4h] int *v34; // [esp-4h] [ebp-A0h] int v35; // [esp+0h] [ebp-9Ch] int v36; // [esp+Ch] [ebp-90h] int v37; // [esp+18h] [ebp-84h] int v38; // [esp+24h] [ebp-78h] int v39; // [esp+28h] [ebp-74h] int v40; // [esp+34h] [ebp-68h] int v41; // [esp+38h] [ebp-64h] int v42; // [esp+40h] [ebp-5Ch] int v43; // [esp+4Ch] [ebp-50h] int v44; // [esp+50h] [ebp-4Ch] char v45; // [esp+68h] [ebp-34h] int v46; // [esp+74h] [ebp-28h] char v47; // [esp+78h] [ebp-24h] int v48; // [esp+7Ch] [ebp-20h] int v49; // [esp+88h] [ebp-14h] int *v50; // [esp+8Ch] [ebp-10h] int v51; // [esp+98h] [ebp-4h] v50 = &v35; v4 = this; v51 = 0; v5 = a4; if ( *(_DWORD *)GSys && (**(int (__stdcall ***)(const wchar_t *, struct FOutputDevice *))(*(_DWORD *)GSys + 52))(a3, a4) ) { return 1; } if ( UObject::StaticExec(a3, v5) || FMemCache::Exec(&GCache, a3, v5) || *(_DWORD *)GExec && (***(int (__stdcall ****)(const wchar_t *, struct FOutputDevice *))GExec)(a3, v5) ) { return 1; } v6 = *((_DWORD *)v4 + 9); if ( v6 ) { if ( (*(int (__stdcall **)(const wchar_t *, struct FOutputDevice *))(*(_DWORD *)v6 + 136))(a3, v5) ) return 1; } v7 = *((_DWORD *)v4 + 10); if ( v7 ) { if ( (**(int (__stdcall ***)(const wchar_t *, struct FOutputDevice *))(v7 + 52))(a3, v5) ) return 1; } if ( dword_2077ED44 && sub_20414540((int)a3) ) return 1; v8 = *((_DWORD *)v4 + 15); if ( v8 ) { if ( (*(int (__stdcall **)(const wchar_t *))(*(_DWORD *)v8 + 1588))(a3) ) return 1; } if ( ParseCommand(&a3, L"FLUSH") ) { (*(void (__stdcall **)(signed int))(*((_DWORD *)v4 - 13) + 120))(1); FOutputDevice::Log(v5, L"Flushed engine caches"); return 1; } if ( ParseCommand(&a3, L"STAT") ) { if ( ParseCommand(&a3, L"ANIM") ) { *((_DWORD *)v4 + 24) = *((_DWORD *)v4 + 24) == 0; return 1; } if ( ParseCommand(&a3, L"DEFAULT") || ParseCommand(&a3, L"RESET") ) { *((_DWORD *)v4 + 24) = 0; *((_DWORD *)v4 + 20) = 0; *((_DWORD *)v4 + 21) = 0; *((_DWORD *)v4 + 27) = 0; *((_DWORD *)v4 + 22) = 0; *((_DWORD *)v4 + 28) = 0; *((_DWORD *)v4 + 23) = 0; *((_DWORD *)v4 + 25) = 0; *((_DWORD *)v4 + 30) = 0; *((_DWORD *)v4 + 31) = 0; *((_DWORD *)v4 + 32) = 0; *((_DWORD *)v4 + 33) = 0; *((_DWORD *)v4 + 34) = 0; *((_DWORD *)v4 + 35) = 0; *((_DWORD *)v4 + 36) = 0; return 1; } if ( ParseCommand(&a3, L"FPS") ) { *((_DWORD *)v4 + 19) = *((_DWORD *)v4 + 19) == 0; return 1; } if ( ParseCommand(&a3, L"RENDER") ) { *((_DWORD *)v4 + 20) = *((_DWORD *)v4 + 20) == 0; return 1; } if ( ParseCommand(&a3, L"HARDWARE") ) { *((_DWORD *)v4 + 21) = *((_DWORD *)v4 + 21) == 0; return 1; } if ( ParseCommand(&a3, L"GAME") ) { *((_DWORD *)v4 + 22) = *((_DWORD *)v4 + 22) == 0; return 1; } if ( ParseCommand(&a3, L"HISTOGRAPH") ) { *((_DWORD *)v4 + 25) = *((_DWORD *)v4 + 25) == 0; return 1; } if ( ParseCommand(&a3, L"XBOXMEM") ) { *((_DWORD *)v4 + 26) = *((_DWORD *)v4 + 26) == 0; return 1; } if ( ParseCommand(&a3, L"MATINEE") ) { *((_DWORD *)v4 + 27) = *((_DWORD *)v4 + 27) == 0; return 1; } if ( ParseCommand(&a3, L"AUDIO") ) { *((_DWORD *)v4 + 28) = *((_DWORD *)v4 + 28) == 0; return 1; } if ( ParseCommand(&a3, L"NET") ) { *((_DWORD *)v4 + 23) = *((_DWORD *)v4 + 23) == 0; return 1; } if ( ParseCommand(&a3, L"PACKETCOUNT") ) { *((_DWORD *)v4 + 32) = *((_DWORD *)v4 + 32) == 0; return 1; } if ( ParseCommand(&a3, L"EXPACKETCOUNT") ) { *((_DWORD *)v4 + 33) = *((_DWORD *)v4 + 33) == 0; return 1; } if ( ParseCommand(&a3, L"ALL") ) { result = 1; *((_DWORD *)v4 + 19) = 1; *((_DWORD *)v4 + 20) = 1; *((_DWORD *)v4 + 21) = 1; *((_DWORD *)v4 + 27) = 1; *((_DWORD *)v4 + 22) = 1; *((_DWORD *)v4 + 28) = 1; *((_DWORD *)v4 + 23) = 1; *((_DWORD *)v4 + 30) = 1; *((_DWORD *)v4 + 31) = 1; *((_DWORD *)v4 + 34) = 1; *((_DWORD *)v4 + 35) = 1; return result; } if ( ParseCommand(&a3, L"NONE") ) { v10 = 0; *((_DWORD *)v4 + 24) = 0; *((_DWORD *)v4 + 19) = 0; *((_DWORD *)v4 + 20) = 0; *((_DWORD *)v4 + 21) = 0; *((_DWORD *)v4 + 27) = 0; *((_DWORD *)v4 + 22) = 0; *((_DWORD *)v4 + 28) = 0; *((_DWORD *)v4 + 23) = 0; *((_DWORD *)v4 + 30) = 0; *((_DWORD *)v4 + 31) = 0; *((_DWORD *)v4 + 32) = 0; *((_DWORD *)v4 + 33) = 0; *((_DWORD *)v4 + 34) = 0; LABEL_48: *((_DWORD *)v4 + 35) = v10; return 1; } if ( ParseCommand(&a3, L"CONSOLE") ) { *((_DWORD *)v4 + 49) = *((_DWORD *)v4 + 49) == 0; return 1; } if ( ParseCommand(&a3, L"L2") ) { *((_DWORD *)v4 + 30) = *((_DWORD *)v4 + 30) == 0; return 1; } if ( ParseCommand(&a3, L"MEM") ) { *((_DWORD *)v4 + 31) = *((_DWORD *)v4 + 31) == 0; return 1; } if ( ParseCommand(&a3, L"Thread") ) { *((_DWORD *)v4 + 34) = *((_DWORD *)v4 + 34) == 0; return 1; } if ( ParseCommand(&a3, L"Script") ) { v10 = *((_DWORD *)v4 + 35) == 0; goto LABEL_48; } if ( ParseCommand(&a3, L"ScriptR") ) { sub_200DE330(&v45); LOBYTE(v51) = 1; sub_200DE3C0(v11, (int *)&v47); v12 = UObject::GObjObjects; while ( v48 < v12[1] ) { v13 = *(_DWORD **)(*v12 + 4 * v48); if ( v13 ) { v13[40] = 0; v13[41] = 0; v13[42] = 0; v13[43] = 0; v12 = UObject::GObjObjects; } sub_20005C90(0, (int *)&v47); } LOBYTE(v51) = 0; sub_200DE370((int)&v45); return 1; } } else { if ( ParseCommand(&a3, L"CRACKURL") ) { FURL::FURL((FURL *)&v36, 0, (int)a3, 0); LOBYTE(v51) = 2; if ( v43 ) { v14 = FString::operator*(&v36); FOutputDevice::Logf(v5, (const char *)L" Protocol: %s", v14); v15 = FString::operator*(&v37); FOutputDevice::Logf(v5, (const char *)L" Host: %s", v15); FOutputDevice::Logf(v5, (const char *)L" Port: %i", v38); v34 = (int *)FString::operator*(&v39); FOutputDevice::Logf(v5, (const char *)L" Map: %s", v34); FOutputDevice::Logf(v5, (const char *)L" NumOptions: %i", v41); for ( i = 0; ; ++i ) { v49 = i; if ( i >= v41 ) break; v17 = FString::operator*(v40 + 12 * i); FOutputDevice::Logf(v5, (const char *)L" Option %i: %s", i, v17); } v18 = FString::operator*(&v42); FOutputDevice::Logf(v5, (const char *)L" Portal: %s", v18); v19 = FURL::String(&v36, &v45, 0); LOBYTE(v51) = 3; v20 = FString::operator*(v19); FOutputDevice::Logf(v5, (const char *)L" String: '%s'", v20); LOBYTE(v51) = 2; FString::~FString(&v45); LOBYTE(v51) = 0; FURL::~FURL((FURL *)&v36); } else { FOutputDevice::Logf(v5, L"BAD URL"); LOBYTE(v51) = 0; FURL::~FURL((FURL *)&v36); } return 1; } if ( ParseCommand(&a3, L"PACKETCOUNTSTART") ) { v21 = *((_DWORD *)v4 + 13); if ( v21 ) { (*(void (**)(void))(*(_DWORD *)v21 + 116))(); *((_DWORD *)v4 + 32) = 1; } return 1; } if ( ParseCommand(&a3, L"PACKETCOUNTSTOP") ) { v22 = *((_DWORD *)v4 + 13); if ( v22 ) { (*(void (**)(void))(*(_DWORD *)v22 + 120))(); *((_DWORD *)v4 + 32) = 0; } return 1; } if ( ParseCommand(&a3, L"EXPACKETCOUNTSTART") ) { v23 = *((_DWORD *)v4 + 13); if ( v23 ) { (*(void (**)(void))(*(_DWORD *)v23 + 124))(); *((_DWORD *)v4 + 33) = 1; } return 1; } if ( ParseCommand(&a3, L"EXPACKETCOUNTSTOP") ) { v24 = *((_DWORD *)v4 + 13); if ( v24 ) { (*(void (**)(void))(*(_DWORD *)v24 + 128))(); *((_DWORD *)v4 + 33) = 0; } return 1; } if ( ParseCommand(&a3, L"RELOAD") ) { v25 = *((_DWORD *)v4 + 13); if ( v25 ) (*(void (__thiscall **)(int))(*(_DWORD *)v25 + 1180))(v25); return 1; } if ( ParseCommand(&a3, L"REPLAYSAVE") ) { if ( *((_DWORD *)v4 + 13) && *((_DWORD *)v4 + 92) ) { if ( ParseCommand(&a3, L"START") ) { if ( !*(_DWORD *)(*((_DWORD *)v4 + 92) + 23904) ) { FString::FString(&v46); LOBYTE(v51) = 4; v26 = ParseToken(&v45, &a3, 0); LOBYTE(v51) = 5; FString::operator=(&v46, v26); LOBYTE(v51) = 4; FString::~FString(&v45); *(_DWORD *)(*((_DWORD *)v4 + 92) + 24020) = 0; a4 = (struct FOutputDevice *)&v32; FString::FString(&v32, &v46); LOBYTE(v51) = 4; FL2ReplayManager::PrepareSave(*((_DWORD **)v4 + 92), v32, v33, (int)v34); L2ParamStack::L2ParamStack(&v44, 10); LOBYTE(v51) = 7; L2ParamStack::PushBack(&v44, L"reload", (signed int)L"reload" >> 31); v27 = (int *)*((_DWORD *)v4 + 13); v28 = *v27; v34 = &v44; (*(void (__thiscall **)(int *, int *))(v28 + 688))(v27, &v44); LOBYTE(v51) = 4; L2ParamStack::~L2ParamStack(&v44); LOBYTE(v51) = 0; FString::~FString(&v46); return 1; } } else if ( ParseCommand(&a3, L"END") ) { v29 = (FL2ReplayManager *)*((_DWORD *)v4 + 92); if ( *((_DWORD *)v29 + 5976) == 2 ) { FL2ReplayManager::Save(v29, (int)ParseCommand, a2); FL2ReplayManager::Clear(*((FL2ReplayManager **)v4 + 92), -1); result = 1; *(_DWORD *)(*((_DWORD *)v4 + 92) + 24020) = 1; return result; } } } } else if ( ParseCommand(&a3, L"REPLAYLOAD") ) { if ( *((_DWORD *)v4 + 13) ) { v30 = *((_DWORD *)v4 + 92); if ( v30 ) { if ( !*(_DWORD *)(v30 + 23904) ) { FString::FString(&v46); LOBYTE(v51) = 8; v31 = ParseToken(&v45, &a3, 0); LOBYTE(v51) = 9; FString::operator=(&v46, v31); LOBYTE(v51) = 8; FString::~FString(&v45); if ( FL2ReplayManager::SetSceneName(*((FL2ReplayManager **)v4 + 92), (const struct FString *)&v46) ) { FL2ReplayManager::SetState(*((FL2ReplayManager **)v4 + 92), 3); LOBYTE(v51) = 0; FString::~FString(&v46); return 1; } LOBYTE(v51) = 0; FString::~FString(&v46); } } } } else { if ( ParseCommand(&a3, L"BuildLevel") || ParseCommand(&a3, L"ReleaseLevel") ) { v34 = (int *)9; debugf(L"L2 Release Level = %d"); return 1; } if ( ParseCommand(&a3, L"FAKEITEM") ) { *(_DWORD *)GL2CheckFakeItem = *(_DWORD *)GL2CheckFakeItem == 0; return 1; } } } return 0; } This is the small list of client commands. The full list you can find inside UInput::Exec function. https://pastebin.com/Uu1ayPW3 P.S. Some funny commands: ///bighead - enable big head for self; ///firecracker - make a firework for target; ///observer [on|off] - show hide the player texture and names. 1 2 1 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.