RayWorldIntersection крашит игру

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

C++:
Expand Collapse Copy
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.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Серверная синхронизация. Поэтому и крашит.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
где вызываешь? В каком потоке (игровом или d3d)?
В D3D (хук EndScene через девайс класса IRenderer).
Серверная синхронизация. Поэтому и крашит.
И как быть? Я вот думаю проверять на визибл только тогда, когда ентити появился в мире (заспавнился) и перед проверкой делать небольшую задержку, может тогда рассинхрона не будет :\
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Мой способ не прокатил, я так понимаю сейчас ни у кого нет визибл чека без краша?
 
Мой способ не прокатил, я так понимаю сейчас ни у кого нет визибл чека без краша?
есть
1576726778804.png
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Назад
Сверху Снизу