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...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock