Не могу понять, как реверсить функу на вызов комманд (ордеров). Я сумел найти ентити лист (которая лежит в классе Sim (Simulation)), и находить сущности CUnit. Я рылся по хрефам, и вроде как нашел что-то что вызывается когда отдаю приказ, но походу это функа на диспатчкомманд а не создать(вызов):
C++:
// #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;
}