Veteran Member
Join Date: Nov 2015
Location: Chocolate Factory
|
03-17-2022
, 07:51
Re: [L4D2] Crash on CNavArea::Contains(Vector const&) const + 0x13
|
#13
|
Updated my post!
Code:
+ Fixed the return value of the function
In case anyone's wondering what the main difference between mine and Dragokas, it's how the mid-function detour does its job:
Dragokas' version:
PHP Code:
ChargerReturnToNavMesh *__stdcall ChargerReturnToNavMesh::Update(ChargerReturnToNavMesh *this, Charger *a2, float a3)
{
CNavArea *v3; // edi
ChargerReturnToNavMesh *result; // eax
int v5; // eax
int v6; // eax
int v7[9]; // [esp+24h] [ebp-24h] BYREF
v3 = (CNavArea *)(*(int (__cdecl **)(_DWORD))(*(_DWORD *)LODWORD(a3) + 1324))(LODWORD(a3));
if ( (*(_BYTE *)(LODWORD(a3) + 333) & 8) != 0 )
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)LODWORD(a3)); // gets called for no reason if the last known nav was NULL (out-of-bounds)
if ( v3 )
{
if ( (unsigned __int8)CNavArea::Contains(v3, LODWORD(a3) + 736) )
{
*(_DWORD *)this = 3;
*((_DWORD *)this + 1) = 0;
*((_DWORD *)this + 2) = 0;
return this;
}
v7[0] = *((_DWORD *)v3 + 11);
v7[1] = *((_DWORD *)v3 + 12);
v7[2] = *((_DWORD *)v3 + 13);
v5 = (*(int (__cdecl **)(_DWORD))(*(_DWORD *)LODWORD(a3) + 2484))(LODWORD(a3));
(*(void (__cdecl **)(int, int *, int, _DWORD, _DWORD, _DWORD, int, int))(*(_DWORD *)v5 + 192))(
v5,
v7,
2,
0,
0,
0,
1,
1048576000);
v6 = (*(int (__cdecl **)(_DWORD))(*(_DWORD *)LODWORD(a3) + 2480))(LODWORD(a3));
(*(void (__cdecl **)(int, int *, int))(*(_DWORD *)v6 + 180))(v6, v7, 1065353216);
*(_DWORD *)this = 0;
*((_DWORD *)this + 1) = 0;
*((_DWORD *)this + 2) = 0;
return this;
}
return v3;
// I don't get why it should have a CNavArea address as the return value
// may make the Charger remain in stuck state even if he was teleported
// from an inaccessible area to an accessible one by a plug-in
}
My version:
PHP Code:
ChargerReturnToNavMesh *__stdcall ChargerReturnToNavMesh::Update(ChargerReturnToNavMesh *this, Charger *a2, float a3)
{
CNavArea *v3; // edi
ChargerReturnToNavMesh *result; // eax
int v5; // eax
int v6; // eax
int v7[9]; // [esp+24h] [ebp-24h] BYREF
v3 = (CNavArea *)(*(int (__cdecl **)(_DWORD))(*(_DWORD *)LODWORD(a3) + 1324))(LODWORD(a3));
if ( v3 ) // do nothing as soon as the area is inaccessible
{
if ( (*(_BYTE *)(LODWORD(a3) + 333) & 8) != 0 )
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)LODWORD(a3));
if ( (unsigned __int8)CNavArea::Contains(v3, LODWORD(a3) + 736) )
{
*(_DWORD *)this = 3;
*((_DWORD *)this + 1) = 0;
*((_DWORD *)this + 2) = 0;
return this;
}
v7[0] = *((_DWORD *)v3 + 11);
v7[1] = *((_DWORD *)v3 + 12);
v7[2] = *((_DWORD *)v3 + 13);
v5 = (*(int (__cdecl **)(_DWORD))(*(_DWORD *)LODWORD(a3) + 2484))(LODWORD(a3));
(*(void (__cdecl **)(int, int *, int, _DWORD, _DWORD, _DWORD, int, int))(*(_DWORD *)v5 + 192))(
v5,
v7,
2,
0,
0,
0,
1,
1048576000);
v6 = (*(int (__cdecl **)(_DWORD))(*(_DWORD *)LODWORD(a3) + 2480))(LODWORD(a3));
(*(void (__cdecl **)(int, int *, int))(*(_DWORD *)v6 + 180))(v6, v7, 1065353216);
}
*(_DWORD *)this = 0;
*((_DWORD *)this + 1) = 0;
*((_DWORD *)this + 2) = 0;
return this;
// make sure the action event keeps updating until the Charger in question
// is back to an accessible area by external means
}
Last edited by cravenge; 03-17-2022 at 07:58.
|
|