Начинающий
- Статус
- Оффлайн
- Регистрация
- 20 Дек 2025
- Сообщения
- 13
- Реакции
- 0
Всем привет, сегодня задался вопросом по получении PlayerPawn.Я делаю это так:
и это работает. Я понимаю что это не правильно, потому что я использую линейную память, но как я думаю единственный -, это тут
Так скажите мне, можно ли использовать этот способ, или все же использовать как это делает движок?
Вот как у меня это выглядит в дизассемблере:
Код:
CPlayerController* pController = *(CPlayerController**)(EntityList + (112 * i));
if (!pController || pController == lController) continue;
u32 pawnHandle = pController->_GetPawnHandle(); if (!pawnHandle) continue;
u32 pawnIndex = pawnHandle & 0x7FFF;
CPlayerPawn* pPawn = *(CPlayerPawn**)(EntityList + pawnIndex * 112); if (!pPawn) continue;
Код:
CPlayerPawn* pPawn = *(CPlayerPawn**)(EntityList + pawnIndex * 112);
Вот как у меня это выглядит в дизассемблере:
Код:
__int64 __fastcall f_GetPawnFromController(__int64 PlayerController)
{
int CPawnHandle; // edx
__int64 PointerChunk; // r9
_DWORD *slot; // rax
CPawnHandle = *(_DWORD *)(PlayerController + 0x6B4);
if ( CPawnHandle == -1 || !ptr2CEntitySystem )
return 0LL;
if ( CPawnHandle != -2
&& (PointerChunk = *(_QWORD *)(ptr2CEntitySystem + 8 * ((unsigned __int64)(CPawnHandle & 0x7FFF) >> 9))) != 0
&& (slot = (_DWORD *)(PointerChunk + 0x70LL * (CPawnHandle & 0x1FF))) != 0LL )
{
if ( slot[4] != CPawnHandle )
slot = 0LL;
}
else
{
slot = 0LL;
}
if ( slot )
return *(_QWORD *)slot;
else
return 0LL;
}