Fixed hitbox cache
This commit is contained in:
parent
c4fe132d39
commit
704109133e
@ -50,7 +50,9 @@ void CachedEntity::Update(int idx) {
|
||||
|
||||
m_bGrenadeProjectile = false;
|
||||
m_bBonesSetup = false;
|
||||
SAFE_CALL(m_pHitboxCache->Update());
|
||||
if (m_pHitboxCache) {
|
||||
SAFE_CALL(m_pHitboxCache->Update());
|
||||
}
|
||||
|
||||
switch (m_iClassID) {
|
||||
case ClassID::CTFPlayer:
|
||||
|
@ -85,7 +85,8 @@ public:
|
||||
void InvalidateCache();
|
||||
|
||||
int m_nNumHitboxes;
|
||||
const model_t* m_pLastModel;
|
||||
model_t* m_pLastModel;
|
||||
bool m_bModelSet;
|
||||
mstudiohitboxset_t* m_pHitboxSet;
|
||||
bool m_bSuccess;
|
||||
CachedEntity* m_pParentEntity;
|
||||
|
@ -11,6 +11,8 @@ EntityHitboxCache::EntityHitboxCache(CachedEntity* parent) {
|
||||
m_CacheInternal = new CachedHitbox[CACHE_MAX_HITBOXES];
|
||||
m_CacheValidationFlags = new bool[CACHE_MAX_HITBOXES];
|
||||
InvalidateCache();
|
||||
m_pParentEntity = parent;
|
||||
m_bModelSet = false;
|
||||
}
|
||||
|
||||
EntityHitboxCache::~EntityHitboxCache() {
|
||||
@ -19,16 +21,18 @@ EntityHitboxCache::~EntityHitboxCache() {
|
||||
}
|
||||
|
||||
void EntityHitboxCache::InvalidateCache() {
|
||||
for (int i = 0; i < CACHE_MAX_HITBOXES; i++)
|
||||
for (int i = 0; i < CACHE_MAX_HITBOXES; i++) {
|
||||
m_CacheValidationFlags[i] = false;
|
||||
}
|
||||
}
|
||||
|
||||
void EntityHitboxCache::Update() {
|
||||
InvalidateCache();
|
||||
SAFE_CALL(InvalidateCache());
|
||||
if (CE_BAD(m_pParentEntity)) return;
|
||||
const model_t* model = RAW_ENT(m_pParentEntity)->GetModel();
|
||||
model_t* model;
|
||||
model = (model_t*)RAW_ENT(m_pParentEntity)->GetModel();
|
||||
if (!model) return;
|
||||
if (model != m_pLastModel) {
|
||||
if (!m_bModelSet || model != m_pLastModel) {
|
||||
studiohdr_t* shdr = interfaces::model->GetStudiomodel(model);
|
||||
if (!shdr) return;
|
||||
mstudiohitboxset_t* set = shdr->pHitboxSet(CE_INT(m_pParentEntity, netvar.iHitboxSet));
|
||||
@ -38,11 +42,13 @@ void EntityHitboxCache::Update() {
|
||||
m_nNumHitboxes = set->numhitboxes;
|
||||
if (m_nNumHitboxes > CACHE_MAX_HITBOXES) m_nNumHitboxes = CACHE_MAX_HITBOXES;
|
||||
m_bSuccess = true;
|
||||
m_bModelSet = true;
|
||||
}
|
||||
}
|
||||
|
||||
CachedHitbox* EntityHitboxCache::GetHitbox(int id) {
|
||||
if (id < 0 || id >= m_nNumHitboxes) return 0;
|
||||
if (!m_bSuccess) return 0;
|
||||
if (!m_CacheValidationFlags[id]) {
|
||||
mstudiobbox_t* box = m_pHitboxSet->pHitbox(id);
|
||||
if (!box) return 0;
|
||||
|
Reference in New Issue
Block a user