Похоже что копать надо FWorldBuilder::TestMove
Еще есть интересные функции
UGameEngien::GetSWMapXY
UMasterLevel::GetLevelInfo
CheckWithTerrain
ULevel::MultiLineCheck
Все они вызываются в FWorldBuilder::TestMove
Добавлено через 24 минуты
Или же ошибка тут
PHP код:
int __userpurge sub_201D49C0<eax>(int a1<esi>, int a2, int a3, signed int a4, int a5, int a6)
{
signed int v6; // ebp@1
int v7; // edi@1
int v8; // ebx@1
int result; // eax@2
signed int v10; // eax@6
int v11; // eax@7
signed int v12; // ecx@7
int v13; // eax@17
int v14; // ebx@18
int v15; // eax@21
int v16; // ebp@22
int v17; // [sp+28h] [bp+Ch]@13
v6 = a4;
v7 = (a2 << 11) + a3;
v8 = *(_DWORD *)(a1 + 4 * v7 + 16);
if ( v8 )
{
v10 = *(_WORD *)v8;
if ( v10 >= a4 )
{
if ( v10 == a4 )
{
debugf(L"x=%d,y=%d,FAIL!!!", a2);
result = 0;
}
else
{
while ( 1 )
{
v17 = v8;
v8 = *(_DWORD *)(v8 + 32);
if ( !v8 )
break;
if ( v6 >= *(_WORD *)v8 )
{
if ( *(_WORD *)v8 == v6 )
{
debugf(L"x=%d,y=%d,FAIL????", a2);
result = 0;
}
else
{
v15 = sub_20099B70(44);
if ( v15 )
v16 = sub_2012B820(v15, a5, v6, a6);
else
v16 = 0;
*(_DWORD *)(v16 + 32) = v8;
*(_DWORD *)(v17 + 32) = v16;
++*(_DWORD *)(a1 + 25165844);
++*(_WORD *)(a1 + 2 * v7 + 16777232);
debugf(L"4-x=%d,y=%d,story=%d", a2);
result = v16;
}
return result;
}
}
v13 = (***(int (__stdcall ****)(_DWORD, _DWORD))GMalloc)(44, L"new");
if ( v13 )
v14 = sub_2012B820(v13, a5, v6, a6);
else
v14 = 0;
*(_DWORD *)(v14 + 32) = 0;
*(_DWORD *)(v17 + 32) = v14;
++*(_DWORD *)(a1 + 25165844);
++*(_WORD *)(a1 + 2 * v7 + 16777232);
debugf(L"3-x=%d,y=%d,story=%d", a2);
result = v14;
}
}
else
{
v11 = (***(int (__stdcall ****)(_DWORD, _DWORD))GMalloc)(44, L"new");
v12 = 1;
if ( v11 )
{
result = sub_2012B820(v11, a5, a4, a6);
v12 = 1;
}
else
{
result = 0;
}
*(_DWORD *)(a1 + 4 * v7 + 16) = result;
*(_DWORD *)(result + 32) = v8;
*(_DWORD *)(a1 + 25165844) += v12;
*(_WORD *)(a1 + 2 * v7 + 16777232) += v12;
}
}
else
{
result = (***(int (__stdcall ****)(_DWORD, _DWORD))GMalloc)(44, L"new");
if ( result )
{
*(_WORD *)result = a4;
*(_DWORD *)(result + 4) = *(_DWORD *)a5;
*(_DWORD *)(result + 8) = *(_DWORD *)(a5 + 4);
*(_DWORD *)(result + 12) = *(_DWORD *)(a5 + 8);
*(_DWORD *)(result + 32) = 0;
*(_DWORD *)(result + 36) = 0;
*(_DWORD *)(result + 40) = a6;
*(_WORD *)(result + 22) = 0;
*(_WORD *)(result + 20) = 0;
*(_WORD *)(result + 18) = 0;
*(_WORD *)(result + 16) = 0;
}
else
{
result = 0;
}
*(_DWORD *)(a1 + 4 * v7 + 16) = result;
++*(_DWORD *)(a1 + 25165840);
++*(_DWORD *)(a1 + 25165844);
++*(_WORD *)(a1 + 2 * v7 + 16777232);
}
return result;
}
Ибо СИП в этой функции сразу выходит с неё....
После проверки
PHP код:
v8 = *(_DWORD *)(a1 + 4 * v7 + 16);
if ( v8 )
{
то есть у нас v8 = false
А не, v8 у нас может быть в true только когда эта же функция вызывается с FindRich.... в СИПе у нас она всегда фелс, не зависимо от того есть какие то точки или нету.....