Fixed hitbox cache

This commit is contained in:
nullifiedcat 2016-12-23 11:44:48 +03:00
parent c4fe132d39
commit 704109133e
3 changed files with 15 additions and 6 deletions

View File

@ -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:

View File

@ -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;

View File

@ -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;