-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Мой визибл чек работает как положено, но спустя некоторое время он крашит игру, кто-нибудь знает как это пофиксить?
P.s. Warface RU x64.
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
}