/* * entitycache.h * * Created on: Nov 7, 2016 * Author: nullifiedcat */ #ifndef ENTITYCACHE_HPP_ #define ENTITYCACHE_HPP_ #include #include #include "entityhitboxcache.hpp" #include "averager.hpp" #include #include #include #include #include #include #include #include #include struct matrix3x4_t; class IClientEntity; struct player_info_s; struct model_t; struct mstudiohitboxset_t; struct mstudiobbox_t; #define MAX_STRINGS 16 #define MAX_ENTITIES 2048 #define PROXY_ENTITY true #if PROXY_ENTITY == true #define RAW_ENT(ce) ce->InternalEntity() #else #define RAW_ENT(ce) ce->m_pEntity #endif #define CE_VAR(entity, offset, type) \ NET_VAR(RAW_ENT(entity), offset, type) #define CE_INT(entity, offset) CE_VAR(entity, offset, int) #define CE_FLOAT(entity, offset) CE_VAR(entity, offset, float) #define CE_BYTE(entity, offset) CE_VAR(entity, offset, unsigned char) #define CE_VECTOR(entity, offset) CE_VAR(entity, offset, Vector) #define CE_GOOD(entity) (entity && !g_Settings.bInvalid && entity->Good()) #define CE_BAD(entity) (!CE_GOOD(entity)) #define IDX_GOOD(idx) (idx >= 0 && idx <= HIGHEST_ENTITY && idx < MAX_ENTITIES) #define IDX_BAD(idx) !IDX_GOOD(idx) #define HIGHEST_ENTITY (entity_cache::max) #define ENTITY(idx) (&entity_cache::Get(idx)) class CachedEntity { public: CachedEntity(); ~CachedEntity(); __attribute__((hot)) void Update(); bool IsVisible(); void Reset(); __attribute__((always_inline, hot, const)) IClientEntity* InternalEntity() const { return g_IEntityList->GetClientEntity(m_IDX); } __attribute__((always_inline, hot, const)) inline bool Good() const { if (!m_iClassID) return false; IClientEntity* const entity = InternalEntity(); return entity && !entity->IsDormant(); } template __attribute__((always_inline, hot, const)) inline T& var(uintptr_t offset) const { return *reinterpret_cast(uintptr_t(RAW_ENT(this)) + offset); } const int m_IDX; int m_iClassID { 0 }; Vector m_vecOrigin { 0 }; int m_iTeam { 0 }; bool m_bAlivePlayer { false }; bool m_bEnemy { false }; int m_iMaxHealth { 0 }; int m_iHealth { 0 }; // Entity fields start here EntityType m_Type { ENTITY_GENERIC }; float m_flDistance { 0.0f }; bool m_bCritProjectile { false }; bool m_bGrenadeProjectile { false }; bool m_bAnyHitboxVisible { false }; bool m_bVisCheckComplete { false }; k_EItemType m_ItemType { ITEM_NONE }; unsigned long m_lSeenTicks { 0 }; unsigned long m_lLastSeen { 0 }; Vector m_vecVOrigin { 0 }; Vector m_vecVelocity { 0 }; Vector m_vecAcceleration { 0 }; float m_fLastUpdate { 0.0f }; hitbox_cache::EntityHitboxCache& hitboxes; player_info_s player_info {}; Averager velocity_averager { 8 }; bool was_dormant { true }; bool velocity_is_valid { false }; #if PROXY_ENTITY != true IClientEntity* m_pEntity { nullptr }; #endif }; namespace entity_cache { extern CachedEntity array[MAX_ENTITIES]; // b1g fat array in inline CachedEntity& Get(int idx) { if (idx < 0 || idx >= 2048) throw std::out_of_range("Entity index out of range!"); return array[idx]; } void Update(); void Invalidate(); extern int max; } #endif /* ENTITYCACHE_HPP_ */