diff --git a/cathook/src/entitycache.cpp b/cathook/src/entitycache.cpp index ee7260c7..9fd1a507 100644 --- a/cathook/src/entitycache.cpp +++ b/cathook/src/entitycache.cpp @@ -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: diff --git a/cathook/src/entitycache.h b/cathook/src/entitycache.h index 24277b7b..2c43f201 100644 --- a/cathook/src/entitycache.h +++ b/cathook/src/entitycache.h @@ -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; diff --git a/cathook/src/entityhitboxcache.cpp b/cathook/src/entityhitboxcache.cpp index f15d843c..ba78982e 100644 --- a/cathook/src/entityhitboxcache.cpp +++ b/cathook/src/entityhitboxcache.cpp @@ -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;