Jump to content

Recommended Posts

Posted

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.

 

 

  • Like 1
  • Thanks 2
  • Upvote 1

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...