RayWorldIntersection крашит игру

Забаненный
Статус
Оффлайн
Регистрация
20 Июл 2017
Сообщения
34
Реакции[?]
35
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Мой визибл чек работает как положено, но спустя некоторое время он крашит игру, кто-нибудь знает как это пофиксить?

C++:
template <typename T>T VMTCall(void* vBase, int vIndex)
{
    return (*(T**)vBase)[vIndex / 8];
}
 
struct ray_hit
{
    float dist;
    IPhysicalEntity* pCollider;
    int ipart;
    int partid;
    short surface_idx;
    short idmatOrg;
    int foreignIdx;
    int iNode;
    D3DXVECTOR3 pt;
    D3DXVECTOR3 n;
    int bTerrain;
    int iPrim;
    ray_hit* next;
};
 
struct ray_hit_cached
{
    ray_hit_cached()
    {
        pCollider = 0; ipart = 0;
    }
 
    ray_hit_cached(const ray_hit& hit)
    {
        pCollider = hit.pCollider; ipart = hit.ipart; iNode = hit.iNode;
    }
 
    ray_hit_cached& operator=(const ray_hit& hit)
    {
        pCollider = hit.pCollider; ipart = hit.ipart; iNode = hit.iNode; return *this;
    }
 
    IPhysicalEntity* pCollider;
    int ipart;
    int iNode;
};
 
struct EventPhysicsRWIResult;
class SRWIParams
{
public:
    void* pForeignData;
    int iForeignData;
    int (*OnEvent)(const EventPhysicsRWIResult*);
    D3DXVECTOR3 org;
    D3DXVECTOR3 dir;
    int objTypes;
    unsigned int flags;
    ray_hit* hits;
    int nMaxHits;
    ray_hit_cached* phitLast;
    int nSkipEnts;
    IPhysicalEntity** pSkipEnts;
};
 
class IPhysicalWorld
{
public:
    INT RayWorldIntersection(SRWIParams& srwi, const char* pNameTag, int iCaller)
    {
        return VMTCall<INT(__fastcall*)(PVOID, SRWIParams&, const char*, int)>(this, 280)(this, srwi, pNameTag, iCaller);
    }
 
    INT RayWorldIntersection(const D3DXVECTOR3& org, const D3DXVECTOR3& dir, int objTypes, unsigned int flags, ray_hit* hits, int nMaxHits = 1, IPhysicalEntity** pSkipEnts = 0, int nSkipEnts = 0, void* pForeignData = 0, int iForeignData = 0, const char* pNameTag = "RayWorldIntersection(Game)", ray_hit_cached* phitLast = 0, int iCaller = 4)
    {
        SRWIParams srwi;
 
        srwi.org = org;
        srwi.dir = dir;
 
        srwi.objTypes = objTypes;
        srwi.flags = flags;
 
        srwi.hits = hits;
        srwi.nMaxHits = nMaxHits;
 
        srwi.pForeignData = pForeignData;
        srwi.iForeignData = iForeignData;
 
        srwi.phitLast = phitLast;
        srwi.pSkipEnts = pSkipEnts;
        srwi.nSkipEnts = nSkipEnts;
 
        return RayWorldIntersection(srwi, pNameTag, iCaller);
    }
};
 
INT IsVisible(D3DXVECTOR3 targetPos, D3DXVECTOR3 playerPos)
{
    ray_hit rayHit;
    D3DXVECTOR3 direction;
 
    direction.x = targetPos.x - playerPos.x;
    direction.y = targetPos.y - playerPos.y;
    direction.z = targetPos.z - playerPos.z;
 
    return !gEnv->GetIPhysicalWorld()->RayWorldIntersection(playerPos, direction, 779, (10 & 0x0F), &rayHit, 1);
}
 
if (IsVisible(targetPos, playerPos))
{
  // Draw
}
P.s. Warface RU x64.
 
Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Серверная синхронизация. Поэтому и крашит.
 
Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
20 Июл 2017
Сообщения
34
Реакции[?]
35
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
где вызываешь? В каком потоке (игровом или d3d)?
В D3D (хук EndScene через девайс класса IRenderer).
Серверная синхронизация. Поэтому и крашит.
И как быть? Я вот думаю проверять на визибл только тогда, когда ентити появился в мире (заспавнился) и перед проверкой делать небольшую задержку, может тогда рассинхрона не будет :\
 
Забаненный
Статус
Оффлайн
Регистрация
20 Июл 2017
Сообщения
34
Реакции[?]
35
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Мой способ не прокатил, я так понимаю сейчас ни у кого нет визибл чека без краша?
 
masta copypasta
Участник
Статус
Оффлайн
Регистрация
2 Июн 2017
Сообщения
683
Реакции[?]
253
Поинты[?]
0
Последнее редактирование:
Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сверху Снизу