Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Вопрос Supreme commander forged alliance

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
368
Реакции
26
Не могу понять, как реверсить функу на вызов комманд (ордеров). Я сумел найти ентити лист (которая лежит в классе Sim (Simulation)), и находить сущности CUnit. Я рылся по хрефам, и вроде как нашел что-то что вызывается когда отдаю приказ, но походу это функа на диспатчкомманд а не создать(вызов):

C++:
Expand Collapse Copy
// #STR: "IssueCommand"
int *__thiscall sub_750650(_DWORD *SIM, _DWORD *a2, _DWORD *a3, char flag)
{
  _DWORD *Sim; // ebx
  int *result; // eax
  int EntityID; // eax
  int v7; // ecx
  int entityList; // edi
  _DWORD *Unit; // ebx
  int Army; // edx
  unsigned int commandSource; // eax
  unsigned int v12; // edi
  int IUnit; // eax
  int v14; // ecx
  int v15; // eax
  int entityID; // [esp+14h] [ebp-54h] BYREF
  int *entityPtr; // [esp+18h] [ebp-50h] BYREF
  int EntID; // [esp+2Ch] [ebp-3Ch]
  int *v20; // [esp+30h] [ebp-38h] BYREF
  int *v21; // [esp+34h] [ebp-34h]
  char *v22; // [esp+38h] [ebp-30h]
  char *v23; // [esp+3Ch] [ebp-2Ch]
  char *v24; // [esp+40h] [ebp-28h]
  char *v25; // [esp+44h] [ebp-24h]
  char v26[16]; // [esp+48h] [ebp-20h] BYREF
  char v27; // [esp+58h] [ebp-10h] BYREF
  int v28; // [esp+64h] [ebp-4h]

  Sim = SIM;
  result = (IsValidCommand)(*a3, "IssueCommand");
  if ( result )
  {
    v21 = &v20;
    v20 = &v20;
    v22 = v26;
    v23 = v26;
    v24 = &v27;
    v25 = v26;
    v28 = 0;
    EntityID = (sub_4017B0)();                  // v6 is 0x00100000
    v7 = a2[5] - a2[4];                         // v7 is 0x00000004
    EntID = EntityID;
    if ( EntityID != 0x20 * (a2[2] + (v7 >> 2)) )
    {
      do
      {
        entityList = Sim[609];                  // v8 is 0x151BFB90
        entityID = EntID;                       // v17 is 0x00100000
        GetEntityByID(&entityPtr, entityList, &entityID);
        if ( entityPtr == *(entityList + 4) )
          goto LABEL_13;
        Unit = entityPtr[4];
        if ( !Unit )
          goto LABEL_13;
        Army = Unit[83];
        if ( Army )
        {
          if ( *(Army + 0x1C0) )
            goto LABEL_13;
          commandSource = SIM[587];
          if ( commandSource != 255 )
          {
            v12 = (commandSource >> 5) - *(Army + 0x130);// v12 is 0
            if ( v12 < (*(Army + 0x13C) - *(Army + 0x138)) >> 2
              && ((*(*(Army + 0x138) + 4 * v12) >> (commandSource & 0x1F)) & 1) != 0 )
            {
LABEL_11:
              IUnit = (*(*Unit + 0x10))(Unit);  // is called  (sub ecx,08) will lead to vmt of Unit vmtable
              if ( IUnit )
                (sub_5848A0)(IUnit);
              goto LABEL_13;
            }
          }
        }
        if ( sub_74E4E0(SIM) )
          goto LABEL_11;
LABEL_13:
        Sim = SIM;
        v14 = (sub_4017B0)();                   // v14 is 0x00100020
        v15 = a2[5] - a2[4];
        EntID = v14;
      }
      while ( v14 != 0x20 * (a2[2] + (v15 >> 2)) );
    }
    if ( a3[3] != 31 || sub_74E4E0(Sim) )
    {
      (sub_6F7D40)(Sim, a3, flag); //// чат жпт мне подсказывает что вот эта функа отвечает за реализацию функи, тоесть сервак прислал команду или её данные и её нужно отобразить в игре.
      if ( v22 != v25 )
        sub_AC134D(v22);
      result = v21;
      v20[1] = v21;
      *v21 = v20;
    }
    else
    {
      if ( v22 != v25 )
        sub_AC134D(v22);
      v20[1] = v21;
      result = v20;
      *v21 = v20;
    }
  }
  return result;
}
 
Назад
Сверху Снизу