From a32ed831e7574063a7335ccaa17b5a79675815cc Mon Sep 17 00:00:00 2001 From: nullifiedcat Date: Thu, 22 Dec 2016 20:56:56 +0300 Subject: [PATCH] FINISH refactor. Now it's time to find that MemLeak. --- cathook/src/common.h | 31 +++++ cathook/src/drawing.cpp | 28 ++--- cathook/src/drawing.h | 2 +- cathook/src/entitycache.cpp | 21 ++-- cathook/src/entitycache.h | 9 +- cathook/src/globals.cpp | 3 +- cathook/src/globals.h | 1 + cathook/src/hack.cpp | 54 +++++---- cathook/src/hack.h | 31 ----- cathook/src/hacks/Aimbot.cpp | 135 ++++++++------------- cathook/src/hacks/Aimbot.h | 4 +- cathook/src/hacks/Airstuck.cpp | 15 --- cathook/src/hacks/AntiAim.cpp | 2 +- cathook/src/hacks/AntiDisguise.cpp | 10 +- cathook/src/hacks/AutoHeal.cpp | 17 +-- cathook/src/hacks/AutoReflect.cpp | 4 +- cathook/src/hacks/AutoReflect.h | 2 - cathook/src/hacks/AutoSticky.cpp | 8 +- cathook/src/hacks/AutoStrafe.cpp | 2 +- cathook/src/hacks/Bunnyhop.cpp | 11 +- cathook/src/hacks/ESP.cpp | 51 ++++---- cathook/src/hacks/FollowBot.cpp | 103 ++++++++-------- cathook/src/hacks/FollowBot.h | 12 +- cathook/src/hacks/HuntsmanCompensation.cpp | 2 +- cathook/src/hacks/IHack.h | 1 + cathook/src/hacks/Misc.cpp | 59 +++++---- cathook/src/hacks/Misc.h | 2 +- cathook/src/hacks/SpyAlert.cpp | 14 +-- cathook/src/hacks/Trigger.cpp | 28 ++--- cathook/src/helpers.cpp | 76 ++++++------ cathook/src/helpers.h | 9 +- cathook/src/localplayer.cpp | 25 ++-- cathook/src/localplayer.h | 2 +- cathook/src/playerresource.cpp | 6 +- cathook/src/prediction.cpp | 16 +-- cathook/src/prediction.h | 6 +- 36 files changed, 383 insertions(+), 419 deletions(-) diff --git a/cathook/src/common.h b/cathook/src/common.h index 071dcc05..793f9eae 100644 --- a/cathook/src/common.h +++ b/cathook/src/common.h @@ -30,4 +30,35 @@ #define CON_NAME "cat" #define CON_PREFIX CON_NAME "_" +#define DEBUG_SEGV false + +#if DEBUG_SEGV == true + +#define SEGV_BEGIN \ + try { + +#define SEGV_END \ + } catch (...) { \ + logging::Info("SEGV/FPE occured! %s in %s:%d", __func__, __FILE__, __LINE__); \ + } + +#define SEGV_END_INFO(x) \ + } catch (...) { \ + logging::Info("SEGV/FPE occured! (%s)", x); \ + } + +#define SAFE_CALL(x) \ + SEGV_BEGIN \ + x; \ + SEGV_END_INFO(#x) + +#else + +#define SEGV_BEGIN +#define SEGV_END +#define SEGV_END_INFO(x) +#define SAFE_CALL(x) x + +#endif + #endif /* COMMON_H_ */ diff --git a/cathook/src/drawing.cpp b/cathook/src/drawing.cpp index ebf132fb..febf1ac0 100644 --- a/cathook/src/drawing.cpp +++ b/cathook/src/drawing.cpp @@ -135,12 +135,12 @@ void colors::Init() { Color colors::EntityB(CachedEntity* ent) { using namespace colors; Color result = Transparent(black); - if (IsPlayer(ent->m_pEntity) || IsBuilding(ent->m_pEntity)) { + if (ent->m_Type == ENTITY_PLAYER || ent->m_Type == ENTITY_BUILDING) { if (ent->m_iTeam == TEAM_BLU) result = blu_b; else if (ent->m_iTeam == TEAM_RED) result = red_b; - if (IsPlayer(ent->m_pEntity)) { - if (GetRelation(ent->m_pEntity) == relation::DEVELOPER) result = Transparent(black, 0.6f); + if (ent->m_Type == ENTITY_PLAYER) { + if (GetRelation(ent) == relation::DEVELOPER) result = Transparent(black, 0.6f); } if (!ent->m_bIsVisible) result = Transparent(result, 0.833f); @@ -152,14 +152,14 @@ Color colors::EntityF(CachedEntity* ent) { using namespace colors; Color result = white; if (ent->m_iClassID == ClassID::CBaseAnimating) { - item_type type = GetItemType(ent->m_pEntity); + item_type type = GetItemType(ent); if (type != item_null) { if (type >= item_medkit_small && type <= item_medkit_large) { result = green; } else if (type >= item_ammo_small && type <= item_ammo_large) { // White. } else if (type >= item_mp_strength && type <= item_mp_crit) { - int skin = ent->m_pEntity->GetSkin(); + int skin = RAW_ENT(ent)->GetSkin(); if (skin == 1) { result = red; } else if (skin == 2) { @@ -174,7 +174,7 @@ Color colors::EntityF(CachedEntity* ent) { result = green; // TODO currency pack (red) } - if (IsProjectile(ent->m_pEntity)) { + if (ent->m_Type == ENTITY_PROJECTILE) { if (ent->m_iTeam == TEAM_BLU) result = blu; else if (ent->m_iTeam == TEAM_RED) result = red; if (ent->m_bCritProjectile) { @@ -183,11 +183,11 @@ Color colors::EntityF(CachedEntity* ent) { } } - if (IsPlayer(ent->m_pEntity) || IsBuilding(ent->m_pEntity)) { + if (ent->m_Type == ENTITY_PLAYER || ent->m_Type == ENTITY_BUILDING) { if (ent->m_iTeam == TEAM_BLU) result = blu; else if (ent->m_iTeam == TEAM_RED) result = red; - if (IsPlayer(ent->m_pEntity)) { - if (IsPlayerInvulnerable(ent->m_pEntity)) { + if (ent->m_Type == ENTITY_PLAYER) { + if (IsPlayerInvulnerable(ent)) { if (ent->m_iTeam == TEAM_BLU) result = blu_u; else if (ent->m_iTeam == TEAM_RED) result = red_u; } @@ -195,7 +195,7 @@ Color colors::EntityF(CachedEntity* ent) { if (ent->m_iTeam == TEAM_BLU) result = blu_v; else if (ent->m_iTeam == TEAM_RED) result = red_v; } - switch (GetRelation(ent->m_pEntity)) { + switch (GetRelation(ent)) { case FRIEND: result = green; break; case RAGE: @@ -303,7 +303,7 @@ void draw::DrawString(int x, int y, Color color, Color background, bool center, } draw::GetStringLength((char*)text, l, h); Color clr = background; - clr._color[3] = (unsigned char)180; + clr[3] = (unsigned char)180; draw::DrawRect(x, y + 1, l + 2, h - 4, clr); draw::DrawString(draw::font_handle, x, y, color, string); } @@ -320,12 +320,12 @@ void draw::DrawString(int x, int y, Color color, const char* text, ...) { draw::DrawString(draw::font_handle, x, y, color, string); } -bool draw::EntityCenterToScreen(IClientEntity* entity, Vector& out) { +bool draw::EntityCenterToScreen(CachedEntity* entity, Vector& out) { if (!entity) return false; Vector world; Vector min, max; - entity->GetRenderBounds(min, max); - world = entity->GetAbsOrigin(); + RAW_ENT(entity)->GetRenderBounds(min, max); + world = entity->m_vecOrigin; world.z += (min.z + max.z) / 2; Vector scr; bool succ = draw::WorldToScreen(world, scr); diff --git a/cathook/src/drawing.h b/cathook/src/drawing.h index d9804b19..6e798f95 100644 --- a/cathook/src/drawing.h +++ b/cathook/src/drawing.h @@ -74,7 +74,7 @@ void DrawString(int x, int y, Color color, Color background, bool center, const void DrawString(int x, int y, Color color, const char* text, ...); void DrawRect(int x, int y, int w, int h, Color color); bool WorldToScreen(Vector &origin, Vector &screen); -bool EntityCenterToScreen(IClientEntity* entity, Vector& out); +bool EntityCenterToScreen(CachedEntity* entity, Vector& out); void OutlineRect(int x, int y, int w, int h, Color color); void GetStringLength(char* string, int& length, int& height); diff --git a/cathook/src/entitycache.cpp b/cathook/src/entitycache.cpp index 2d0a7a2e..948abc28 100644 --- a/cathook/src/entitycache.cpp +++ b/cathook/src/entitycache.cpp @@ -32,6 +32,8 @@ IClientEntity* CachedEntity::InternalEntity() { } void CachedEntity::Update(int idx) { + SEGV_BEGIN + m_ESPOrigin.Zero(); m_nESPStrings = 0; m_IDX = idx; @@ -72,7 +74,7 @@ void CachedEntity::Update(int idx) { } m_vecOrigin = m_pEntity->GetAbsOrigin(); - if (g_pLocalPlayer->entity) { + if (CE_GOOD(g_pLocalPlayer->entity)) { m_flDistance = (g_pLocalPlayer->v_Origin.DistTo(m_vecOrigin)); } m_bAlivePlayer = false; @@ -85,11 +87,11 @@ void CachedEntity::Update(int idx) { if (m_Type == EntityType::ENTITY_PLAYER) { m_bAlivePlayer = !(NET_BYTE(m_pEntity, netvar.iLifeState)); - player_info_s* info = new player_info_s; - interfaces::engineClient->GetPlayerInfo(m_IDX, info); + m_pPlayerInfo = new player_info_s; + interfaces::engineClient->GetPlayerInfo(m_IDX, m_pPlayerInfo); m_iTeam = CE_INT(this, netvar.iTeamNum); // TODO m_bEnemy = (m_iTeam != g_pLocalPlayer->team); - m_bIsVisible = (IsEntityVisible(this, 0) || this(m_pEntity, 4)); + SAFE_CALL(m_bIsVisible = (IsEntityVisible(this, 0) || IsEntityVisible(this, 4))); m_iHealth = CE_INT(this, netvar.iHealth); m_iMaxHealth = g_pPlayerResource->GetMaxHealth(this); if (m_bIsVisible) { @@ -100,7 +102,7 @@ void CachedEntity::Update(int idx) { m_lLastSeen++; } } - if (m_iClassID == ClassID::CObjectSentrygun || m_iClassID == ClassID::CObjectDispenser || m_iClassID == ClassID::CObjectTeleporter) { + if (m_Type == EntityType::ENTITY_BUILDING) { m_iTeam = CE_INT(this, netvar.iTeamNum); // TODO m_bEnemy = (m_iTeam != g_pLocalPlayer->team); m_bIsVisible = (IsEntityVisible(this, 0)); @@ -114,6 +116,8 @@ void CachedEntity::Update(int idx) { m_lLastSeen++; } } + + SEGV_END_INFO(strfmt("Updating entity %i", m_IDX)) } void CachedEntity::AddESPString(Color color, Color background, const char* fmt, ...) { @@ -155,10 +159,9 @@ ESPStringCompound CachedEntity::GetESPString(int idx) { } matrix3x4_t* CachedEntity::GetBones() { - if (!m_bBonesSetup) { - if (!m_Bones) m_Bones = new matrix3x4_t[128](); - m_pEntity->SetupBones(m_Bones, 128, 0x100, interfaces::gvars->curtime); - m_bBonesSetup = true; + if (!m_bBonesSetup || !m_Bones) { + m_Bones = new matrix3x4_t[128]; + m_bBonesSetup = m_pEntity->SetupBones(m_Bones, 128, 0x100, 0); // interfaces::gvars->curtime } return m_Bones; } diff --git a/cathook/src/entitycache.h b/cathook/src/entitycache.h index 360c22f6..cbbc1450 100644 --- a/cathook/src/entitycache.h +++ b/cathook/src/entitycache.h @@ -14,7 +14,7 @@ struct matrix3x4_t; -#define ENTITY_CACHE_PROFILER true +#define ENTITY_CACHE_PROFILER false class IClientEntity; class Color; @@ -34,7 +34,10 @@ struct player_info_s; #define CE_GOOD(entity) (entity && entity->m_pEntity && !entity->m_pEntity->IsDormant()) #define CE_BAD(entity) (!CE_GOOD(entity)) -#define PROXY_ENTITY true +#define IDX_GOOD(idx) (idx >= 0 && idx < HIGHEST_ENTITY) +#define IDX_BAD(idx) !IDX_GOOD(idx) + +#define PROXY_ENTITY false #if PROXY_ENTITY == true #define RAW_ENT(ce) ce->InternalEntity() @@ -57,6 +60,8 @@ struct player_info_s; #define END_ENTITY_ITERATING } +#define HIGHEST_ENTITY gEntityCache.m_nMax +#define ENTITY(idx) gEntityCache.GetEntity(idx) class CachedEntity { public: diff --git a/cathook/src/globals.cpp b/cathook/src/globals.cpp index 871ed1c4..801c8a3c 100644 --- a/cathook/src/globals.cpp +++ b/cathook/src/globals.cpp @@ -11,7 +11,7 @@ void ThirdpersonCallback(IConVar* var, const char* pOldValue, float flOldValue) { if (g_Settings.bThirdperson && !g_Settings.bThirdperson->GetBool()) { if (g_pLocalPlayer && g_pLocalPlayer->entity) - NET_INT(g_pLocalPlayer->entity, netvar.nForceTauntCam) = 0; + CE_INT(g_pLocalPlayer->entity, netvar.nForceTauntCam) = 0; } } @@ -28,6 +28,7 @@ void GlobalSettings::Init() { this->bShowLogo = CREATE_CV(CV_SWITCH, "logo", "1", "Show logo"); this->bShowAntiAim = CREATE_CV(CV_SWITCH, "thirdperson_angles", "1", "Real angles in thirdperson"); this->bThirdperson = CREATE_CV(CV_SWITCH, "thirdperson", "0", "Thirdperson"); + this->bNoVisuals = CREATE_CV(CV_SWITCH, "novisuals", "0", "Disable visuals"); this->bThirdperson->m_pConVar->InstallChangeCallback(ThirdpersonCallback); } diff --git a/cathook/src/globals.h b/cathook/src/globals.h index 41fa4831..f1250b9d 100644 --- a/cathook/src/globals.h +++ b/cathook/src/globals.h @@ -27,6 +27,7 @@ public: ConVar* sDisconnectMsg; CatVar* bShowAntiAim; CatVar* bThirdperson; + CatVar* bNoVisuals; }; extern GlobalSettings g_Settings; diff --git a/cathook/src/hack.cpp b/cathook/src/hack.cpp index df1ec94c..aeedc79a 100644 --- a/cathook/src/hack.cpp +++ b/cathook/src/hack.cpp @@ -71,6 +71,7 @@ bool hack::invalidated = true; void hack::Hk_OverrideView(void* thisptr, CViewSetup* setup) { SEGV_BEGIN; ((OverrideView_t*)hooks::hkClientMode->GetMethod(hooks::offOverrideView))(thisptr, setup); + if (!g_Settings.bHackEnabled->GetBool()) return; if (g_Settings.flForceFOV && g_Settings.flForceFOV->GetBool()) { setup->fov = g_Settings.flForceFOV->GetFloat(); } @@ -86,6 +87,7 @@ void hack::Hk_PaintTraverse(void* p, unsigned int vp, bool fr, bool ar) { SEGV_BEGIN; SAFE_CALL(((PaintTraverse_t*)hooks::hkPanel->GetMethod(hooks::offPaintTraverse))(p, vp, fr, ar)); + if (!g_Settings.bHackEnabled->GetBool()) return; // Because of single-multi thread shit I'm gonna put this thing riiiight here. if (g_phFollowBot->v_bEnabled->GetBool()) { ipc_client_seg* seg_g = g_phFollowBot->m_pIPC->GetClientSegment(0); @@ -110,6 +112,7 @@ void hack::Hk_PaintTraverse(void* p, unsigned int vp, bool fr, bool ar) { } } + if (g_Settings.bNoVisuals->GetBool()) return; if (!draw::width || !draw::height) { interfaces::engineClient->GetScreenSize(draw::width, draw::height); @@ -135,15 +138,17 @@ void hack::Hk_PaintTraverse(void* p, unsigned int vp, bool fr, bool ar) { } for (IHack* i_hack : hack::hacks) { //PROF_BEGIN(); - i_hack->PaintTraverse(p, vp, fr, ar); + SEGV_BEGIN + i_hack->PaintTraverse(p, vp, fr, ar); + SEGV_END_INFO(strfmt("PaintTraverse: hack %s", i_hack->GetName())) //PROF_END(strfmt("%s PaintTraverse", i_hack->GetName())); } Vector screen; - for (int i = 0; i < gEntityCache.m_nMax && i < HIGHEST_ENTITY; i++) { + for (int i = 0; i < HIGHEST_ENTITY; i++) { CachedEntity* ce = gEntityCache.GetEntity(i); - if (!CheckCE(ce)) continue; + if (CE_BAD(ce)) continue; if (ce->m_ESPOrigin.IsZero(1.0f)) - if (!draw::EntityCenterToScreen(ce->m_pEntity, screen)) continue; + if (!draw::EntityCenterToScreen(ce, screen)) continue; for (int j = 0; j < ce->m_nESPStrings; j++) { ESPStringCompound str = ce->GetESPString(j); //logging::Info("drawing [idx=%i][ns=%i] %s", i, ce->m_nESPStrings, str.m_String); @@ -189,7 +194,7 @@ bool Hk_SendNetMsg(void* thisptr, INetMessage& msg, bool bForceReliable = false, SEGV_BEGIN; //logging::Info("Sending NetMsg! %i", msg.GetType()); - if (g_phAirstuck->v_bStuck->GetBool()) { + if (g_phAirstuck->v_bStuck->GetBool() && g_Settings.bHackEnabled->GetBool()) { switch (msg.GetType()) { case net_NOP: case net_SignonState: @@ -221,6 +226,9 @@ bool hack::Hk_CreateMove(void* thisptr, float inputSample, CUserCmd* cmd) { SEGV_BEGIN; bool ret = ((CreateMove_t*)hooks::hkClientMode->GetMethod(hooks::offCreateMove))(thisptr, inputSample, cmd); + + if (!g_Settings.bHackEnabled->GetBool()) return ret; + if (!interfaces::engineClient->IsInGame()) { hack::invalidated = true; return true; @@ -240,15 +248,18 @@ bool hack::Hk_CreateMove(void* thisptr, float inputSample, CUserCmd* cmd) { //logging::Info("canpacket: %i", ch->CanPacket()); //if (!cmd) return ret; - - float servertime = (float)CE_INT(g_pLocalPlayer->entity, netvar.nTickBase) * interfaces::gvars->interval_per_tick; - float curtime_old = interfaces::gvars->curtime; - interfaces::gvars->curtime = servertime; + bool time_replaced = false; + float curtime_old; + if (CE_GOOD(g_pLocalPlayer->entity) && false) { + float servertime = (float)CE_INT(g_pLocalPlayer->entity, netvar.nTickBase) * interfaces::gvars->interval_per_tick; + curtime_old = interfaces::gvars->curtime; + interfaces::gvars->curtime = servertime; + time_replaced = true; + } SAFE_CALL(gEntityCache.Update()); SAFE_CALL(g_pPlayerResource->Update()); SAFE_CALL(g_pLocalPlayer->Update()); g_pLocalPlayer->v_OrigViewangles = cmd->viewangles; - SAFE_CALL(CREATE_MOVE(Bunnyhop)); //RunEnginePrediction(g_pLocalPlayer->entity, cmd); SAFE_CALL(CREATE_MOVE(ESP)); @@ -264,8 +275,7 @@ bool hack::Hk_CreateMove(void* thisptr, float inputSample, CUserCmd* cmd) { SAFE_CALL(CREATE_MOVE(Misc)); SAFE_CALL(CREATE_MOVE(Triggerbot)); SAFE_CALL(CREATE_MOVE(HuntsmanCompensation)); - interfaces::gvars->curtime = curtime_old; - + if (time_replaced) interfaces::gvars->curtime = curtime_old; /*for (IHack* i_hack : hack::hacks) { if (!i_hack->CreateMove(thisptr, inputSample, cmd)) { ret = false; @@ -277,13 +287,14 @@ bool hack::Hk_CreateMove(void* thisptr, float inputSample, CUserCmd* cmd) { float speed = sqrt(vsilent.x * vsilent.x + vsilent.y * vsilent.y); Vector ang; VectorAngles(vsilent, ang); - float yaw = deg2rad(ang.y - g_pLocalPlayer->v_OrigViewangles.y + cmd->viewangles.y); + float yaw = DEG2RAD(ang.y - g_pLocalPlayer->v_OrigViewangles.y + cmd->viewangles.y); cmd->forwardmove = cos(yaw) * speed; cmd->sidemove = sin(yaw) * speed; ret = false; } if (cmd) last_angles = cmd->viewangles; + return ret; SEGV_END; @@ -295,24 +306,24 @@ void hack::Hk_FrameStageNotify(void* thisptr, int stage) { //logging::Info("FrameStageNotify %i", stage); // Ambassador to festive ambassador changer. simple. if (g_pLocalPlayer->weapon) { - int defidx = NET_INT(g_pLocalPlayer->weapon, netvar.iItemDefinitionIndex); + int defidx = CE_INT(g_pLocalPlayer->weapon, netvar.iItemDefinitionIndex); if (defidx == 61) { - NET_INT(g_pLocalPlayer->weapon, netvar.iItemDefinitionIndex) = 1006; + CE_INT(g_pLocalPlayer->weapon, netvar.iItemDefinitionIndex) = 1006; } } if (g_Settings.bThirdperson->GetBool() && g_pLocalPlayer->entity) { - NET_INT(g_pLocalPlayer->entity, netvar.nForceTauntCam) = 1; + CE_INT(g_pLocalPlayer->entity, netvar.nForceTauntCam) = 1; } if (stage == 5 && g_Settings.bShowAntiAim->GetBool() && interfaces::iinput->CAM_IsThirdPerson()) { if (g_pLocalPlayer->entity) { - NET_FLOAT(g_pLocalPlayer->entity, netvar.deadflag + 4) = last_angles.x; - NET_FLOAT(g_pLocalPlayer->entity, netvar.deadflag + 8) = last_angles.y; + CE_FLOAT(g_pLocalPlayer->entity, netvar.deadflag + 4) = last_angles.x; + CE_FLOAT(g_pLocalPlayer->entity, netvar.deadflag + 8) = last_angles.y; } } ((FrameStageNotify_t*)hooks::hkClient->GetMethod(hooks::offFrameStageNotify))(thisptr, stage); if (stage == 5 && g_Settings.bNoFlinch->GetBool()) { static Vector oldPunchAngles = Vector(); - Vector punchAngles = NET_VECTOR(g_pLocalPlayer->entity, netvar.vecPunchAngle); + Vector punchAngles = CE_VECTOR(g_pLocalPlayer->entity, netvar.vecPunchAngle); QAngle viewAngles; interfaces::engineClient->GetViewAngles(viewAngles); viewAngles -= VectorToQAngle(punchAngles - oldPunchAngles); @@ -323,7 +334,7 @@ void hack::Hk_FrameStageNotify(void* thisptr, int stage) { if (g_Settings.bNoZoom->GetBool()) { if (g_pLocalPlayer->entity) { //g_pLocalPlayer->bWasZoomed = NET_INT(g_pLocalPlayer->entity, netvar.iCond) & cond::zoomed; - NET_INT(g_pLocalPlayer->entity, netvar.iCond) = NET_INT(g_pLocalPlayer->entity, netvar.iCond) &~ cond::zoomed; + CE_INT(g_pLocalPlayer->entity, netvar.iCond) = CE_INT(g_pLocalPlayer->entity, netvar.iCond) &~ cond::zoomed; } } SEGV_END; @@ -409,10 +420,11 @@ void hack::Initialize() { hack::InitHacks(); logging::Info("Init global settings"); g_Settings.Init(); +#if ENTITY_CACHE_PROFILER == true if (!g_vEntityCacheProfiling) { g_vEntityCacheProfiling = CREATE_CV(CV_SWITCH, "entity_cache_profiling", "0", "Entity cache profiling"); } - +#endif g_pGUI = new GUI(); g_pGUI->Setup(); EndConVars(); diff --git a/cathook/src/hack.h b/cathook/src/hack.h index b918190a..ffd3ba9f 100644 --- a/cathook/src/hack.h +++ b/cathook/src/hack.h @@ -16,37 +16,6 @@ #define CREATE_MOVE(x) \ g_ph##x->CreateMove(thisptr, inputSample, cmd) -#define DEBUG_SEGV true - -#if DEBUG_SEGV == true - -#define SEGV_BEGIN \ - try { - -#define SEGV_END \ - } catch (...) { \ - logging::Info("SEGV/FPE occured! %s in %s:%d", __func__, __FILE__, __LINE__); \ - } - -#define SEGV_END_INFO(x) \ - } catch (...) { \ - logging::Info("SEGV/FPE occured! (%s)", x); \ - } - -#define SAFE_CALL(x) \ - SEGV_BEGIN \ - x; \ - SEGV_END_INFO(#x) - -#else - -#define SEGV_BEGIN -#define SEGV_END -#define SEGV_END_INFO(x) -#define SAFE_CALL(x) x - -#endif - class IHack; class CUserCmd; class CViewSetup; diff --git a/cathook/src/hacks/Aimbot.cpp b/cathook/src/hacks/Aimbot.cpp index 8db5dc35..5667c058 100644 --- a/cathook/src/hacks/Aimbot.cpp +++ b/cathook/src/hacks/Aimbot.cpp @@ -146,7 +146,7 @@ bool Aimbot::CreateMove(void*, float, CUserCmd* cmd) { } if (IsAmbassador(g_pLocalPlayer->weapon)) { // TODO AmbassadorCanHeadshot() - if ((interfaces::gvars->curtime - NET_FLOAT(g_pLocalPlayer->weapon, netvar.flLastFireTime)) <= 1.0) { + if ((interfaces::gvars->curtime - CE_FLOAT(g_pLocalPlayer->weapon, netvar.flLastFireTime)) <= 1.0) { return true; } } @@ -156,16 +156,14 @@ bool Aimbot::CreateMove(void*, float, CUserCmd* cmd) { if (this->v_bTriggerMode->GetBool() ) { cmd->buttons = cmd->buttons &~ IN_ATTACK; } - IClientEntity* player = g_pLocalPlayer->entity; - if (!player) return true; - if (player->IsDormant()) return true; + m_iHitbox = this->v_eHitbox->GetInt(); if (this->v_bAutoHitbox->GetBool()) m_iHitbox = 7; if (g_pLocalPlayer->weapon && this->v_bAutoHitbox->GetBool()) { - switch (g_pLocalPlayer->weapon->GetClientClass()->m_ClassID) { + switch (g_pLocalPlayer->weapon->m_iClassID) { case ClassID::CTFSniperRifle: case ClassID::CTFSniperRifleDecap: - if (!CanHeadshot(g_pLocalPlayer->entity)) { + if (!CanHeadshot()) { if (this->v_bZoomedOnly->GetBool()) return true; } else { m_iHitbox = 0; @@ -189,29 +187,25 @@ bool Aimbot::CreateMove(void*, float, CUserCmd* cmd) { if (this->v_bZoomedOnly->GetBool()) { // TODO IsSniperRifle() - if (g_pLocalPlayer->weapon) { - if (g_pLocalPlayer->weapon->GetClientClass()->m_ClassID == ClassID::CTFSniperRifle || - g_pLocalPlayer->weapon->GetClientClass()->m_ClassID == ClassID::CTFSniperRifleDecap) { - if (!CanHeadshot(g_pLocalPlayer->entity)) return true; - } + if (g_pLocalPlayer->weapon->m_iClassID == ClassID::CTFSniperRifle || + g_pLocalPlayer->weapon->m_iClassID == ClassID::CTFSniperRifleDecap) { + if (!CanHeadshot()) return true; } } - if (g_pLocalPlayer->weapon) { - if (g_pLocalPlayer->weapon->GetClientClass()->m_ClassID == 210) return true; - } + + if (g_pLocalPlayer->weapon->m_iClassID == 210) return true; m_bProjectileMode = (GetProjectileData(g_pLocalPlayer->weapon, m_flProjSpeed, m_flProjGravity)); // TODO priority modes (FOV, Smart, Distance, etc) - IClientEntity* target_highest = 0; + CachedEntity* target_highest = 0; float target_highest_score = -256; for (int i = 0; i < HIGHEST_ENTITY; i++) { - IClientEntity* ent = ENTITY(i); - if (ent == 0) continue; - if (!(IsPlayer(ent) || IsBuilding(ent))) continue; + CachedEntity* ent = ENTITY(i); + if (CE_BAD(ent)) continue; if (ShouldTarget(ent)) { - if (GetWeaponMode(player) == weaponmode::weapon_melee || this->v_ePriorityMode->GetInt() == 2) { + if (GetWeaponMode(g_pLocalPlayer->entity) == weaponmode::weapon_melee || this->v_ePriorityMode->GetInt() == 2) { Vector result; - if (IsBuilding(ent)) { + if (ent->m_Type == ENTITY_BUILDING) { result = GetBuildingPosition(ent); } else { GetHitbox(ent, m_iHitbox, result); @@ -232,7 +226,7 @@ bool Aimbot::CreateMove(void*, float, CUserCmd* cmd) { } break; case 1: { Vector result; - if (IsBuilding(ent)) { + if (ent->m_Type == ENTITY_BUILDING) { result = GetBuildingPosition(ent); } else { GetHitbox(ent, m_iHitbox, result); @@ -245,10 +239,10 @@ bool Aimbot::CreateMove(void*, float, CUserCmd* cmd) { } break; case 3: { float scr; - if (IsBuilding(ent)) { - scr = 450.0f - NET_INT(ent, netvar.iBuildingHealth); + if (ent->m_Type == ENTITY_BUILDING) { + scr = 450.0f - CE_INT(ent, netvar.iBuildingHealth); } else { - scr = 450.0f - NET_INT(ent, netvar.iHealth); + scr = 450.0f - CE_INT(ent, netvar.iHealth); } if (scr > target_highest_score) { target_highest_score = scr; @@ -260,14 +254,14 @@ bool Aimbot::CreateMove(void*, float, CUserCmd* cmd) { } } if (target_highest != 0) { - this->m_iLastTarget = target_highest->entindex(); + this->m_iLastTarget = target_highest->m_IDX; Aim(target_highest, cmd); - if (g_pLocalPlayer->weapon && g_pLocalPlayer->weapon->GetClientClass()->m_ClassID == ClassID::CTFMinigun) + if (g_pLocalPlayer->weapon->m_iClassID == ClassID::CTFMinigun) m_nMinigunFixTicks = 40; } - if (g_pLocalPlayer->weapon && g_pLocalPlayer->weapon->GetClientClass()->m_ClassID == ClassID::CTFMinigun && + if (g_pLocalPlayer->weapon->m_iClassID == ClassID::CTFMinigun && target_highest == 0 && - ENTITY(m_iLastTarget) && + IDX_GOOD(m_iLastTarget) && m_nMinigunFixTicks) { Aim(ENTITY(m_iLastTarget), cmd); } @@ -276,55 +270,35 @@ bool Aimbot::CreateMove(void*, float, CUserCmd* cmd) { void Aimbot::PaintTraverse(void*, unsigned int, bool, bool) { if (!v_bEnabled->GetBool()) return; - if (this->m_iLastTarget == -1) return; - IClientEntity* ent = ENTITY(this->m_iLastTarget); - if (!ent) return; - if (IsPlayer(ent)) { - int clazz = NET_INT(ent, netvar.iClass); + if (IDX_BAD(m_iLastTarget)) return; + CachedEntity* ent = ENTITY(this->m_iLastTarget); + if (CE_BAD(ent)) return; + if (ent->m_Type == ENTITY_PLAYER) { + int clazz = CE_INT(ent, netvar.iClass); if (clazz < 0 || clazz > 9) return; - player_info_t info; - if (!interfaces::engineClient->GetPlayerInfo(this->m_iLastTarget, &info)) return; - AddCenterString(colors::yellow, colors::black, "Prey: %i HP %s (%s)", NET_INT(ent, netvar.iHealth), tfclasses[clazz], info.name); - } else if (IsBuilding(ent)) { - AddCenterString(colors::yellow, colors::black, "Prey: %i HP LV %i %s", NET_INT(ent, netvar.iBuildingHealth), NET_INT(ent, netvar.iUpgradeLevel), GetBuildingName(ent)); + AddCenterString(colors::yellow, colors::black, "Prey: %i HP %s (%s)", CE_INT(ent, netvar.iHealth), tfclasses[clazz], ent->m_pPlayerInfo->name); + } else if (ent->m_Type == ENTITY_BUILDING) { + AddCenterString(colors::yellow, colors::black, "Prey: %i HP LV %i %s", CE_INT(ent, netvar.iBuildingHealth), CE_INT(ent, netvar.iUpgradeLevel), GetBuildingName(ent)); } } -bool Aimbot::ShouldTarget(IClientEntity* entity) { - //logging::Info("Should target?"); - if (!entity) return false; - if (entity->IsDormant()) return false; - if (IsPlayer(entity)) { - if (g_Settings.bIgnoreTaunting->GetBool() && (NET_INT(entity, netvar.iCond) & cond::taunting)) return false; - if (Developer(entity)) return false; - if (gEntityCache.GetEntity(entity->entindex())->m_lSeenTicks < this->v_iSeenDelay->GetInt()) return false; +bool Aimbot::ShouldTarget(CachedEntity* entity) { + // Just assuming CE is good + if (entity->m_Type == ENTITY_PLAYER) { + if (g_Settings.bIgnoreTaunting->GetBool() && (CE_INT(entity, netvar.iCond) & cond::taunting)) return false; + if (Developer(entity)) return false; // TODO developer relation + if (entity->m_lSeenTicks < (unsigned)this->v_iSeenDelay->GetInt()) return false; if (IsPlayerInvulnerable(entity)) return false; - int team = NET_INT(entity, netvar.iTeamNum); - int local = interfaces::engineClient->GetLocalPlayer(); - IClientEntity* player = ENTITY(local); - char life_state = NET_BYTE(entity, netvar.iLifeState); - if (life_state) return false; - if (!player) return false; + if (!entity->m_bAlivePlayer) return false; if (v_bRespectCloak->GetBool() && IsPlayerInvisible(entity)) return false; - int health = NET_INT(entity, netvar.iHealth); - /*if (this->v_bCharge->GetBool() && (NET_INT(player, eoffsets.iClass) == 2)) { - int rifleHandle = NET_INT(player, eoffsets.hActiveWeapon); - IClientEntity* rifle = ENTITY(rifleHandle & 0xFFF); - if (!rifle) return false; - float bdmg = NET_FLOAT(rifle, eoffsets.flChargedDamage); - if (health > 150 && (health > (150 + bdmg) || bdmg < 15.0f)) return false; - }*/ - int team_my = NET_INT(player, netvar.iTeamNum); - if (team == team_my) return false; - Vector enemy_pos = entity->GetAbsOrigin(); - Vector my_pos = player->GetAbsOrigin(); + if (!entity->m_bEnemy) return false; if (v_iMaxRange->GetInt() > 0) { - if ((enemy_pos - my_pos).Length() > v_iMaxRange->GetInt()) return false; + if (entity->m_flDistance > v_iMaxRange->GetInt()) return false; } if (GetWeaponMode(g_pLocalPlayer->entity) == weaponmode::weapon_melee) { - if ((enemy_pos - my_pos).Length() > 95) return false; + if (entity->m_flDistance > 95) return false; } - int econd = NET_INT(entity, netvar.iCond1); + int econd = CE_INT(entity, netvar.iCond1); if ((econd & cond_ex::vacc_bullet)) return false; if (GetRelation(entity) == relation::FRIEND) return false; Vector resultAim; @@ -341,16 +315,15 @@ bool Aimbot::ShouldTarget(IClientEntity* entity) { } if (v_fFOV->GetFloat() > 0.0f && (GetFov(g_pLocalPlayer->v_OrigViewangles, g_pLocalPlayer->v_Eye, resultAim) > v_fFOV->GetFloat())) return false; return true; - } else if (IsBuilding(entity)) { + } else if (entity->m_Type == ENTITY_BUILDING) { if (!v_bAimBuildings->GetBool()) return false; - int team = NET_INT(entity, netvar.iTeamNum); + int team = CE_INT(entity, netvar.iTeamNum); if (team == g_pLocalPlayer->team) return false; - Vector enemy_pos = entity->GetAbsOrigin(); if (v_iMaxRange->GetInt() > 0) { - if ((enemy_pos - g_pLocalPlayer->v_Origin).Length() > v_iMaxRange->GetInt()) return false; + if (entity->m_flDistance > v_iMaxRange->GetInt()) return false; } if (GetWeaponMode(g_pLocalPlayer->entity) == weaponmode::weapon_melee) { - if ((enemy_pos - g_pLocalPlayer->v_Origin).Length() > 95) return false; + if (entity->m_flDistance > 95) return false; } Vector resultAim; // TODO fix proj buildings @@ -372,18 +345,19 @@ bool Aimbot::ShouldTarget(IClientEntity* entity) { return false; } -bool Aimbot::Aim(IClientEntity* entity, CUserCmd* cmd) { +// TODO Vector objects +bool Aimbot::Aim(CachedEntity* entity, CUserCmd* cmd) { //logging::Info("Aiming!"); Vector hit; Vector angles; if (!entity) return false; - if (IsPlayer(entity)) { + if (entity->m_Type == ENTITY_PLAYER) { //logging::Info("A"); GetHitbox(entity, m_iHitbox, hit); //logging::Info("B"); if (this->v_bPrediction->GetBool()) SimpleLatencyPrediction(entity, m_iHitbox); //logging::Info("C"); - } else if (IsBuilding(entity)) { + } else if (entity->m_Type == ENTITY_BUILDING) { hit = GetBuildingPosition(entity); } if (v_bProjectileAimbot->GetBool()) { @@ -394,7 +368,6 @@ bool Aimbot::Aim(IClientEntity* entity, CUserCmd* cmd) { } } //logging::Info("ayyming!"); - IClientEntity* local = ENTITY(interfaces::engineClient->GetLocalPlayer()); Vector tr = (hit - g_pLocalPlayer->v_Eye); fVectorAngles(tr, angles); bool smoothed = false; @@ -415,17 +388,15 @@ bool Aimbot::Aim(IClientEntity* entity, CUserCmd* cmd) { if (g_pLocalPlayer->clazz == tf_class::tf_sniper) { if (g_pLocalPlayer->bZoomed) { if (this->v_iAutoShootCharge->GetBool()) { - int rifleHandle = NET_INT(local, netvar.hActiveWeapon); - IClientEntity* rifle = ENTITY(rifleHandle & 0xFFF); - float bdmg = NET_FLOAT(rifle, netvar.flChargedDamage); + float bdmg = CE_FLOAT(g_pLocalPlayer->weapon, netvar.flChargedDamage); if (bdmg < this->v_iAutoShootCharge->GetFloat()) return true; } else { - if (!CanHeadshot(g_pLocalPlayer->entity)) return true; + if (!CanHeadshot()) return true; } } } - if (g_pLocalPlayer->weapon && g_pLocalPlayer->weapon->GetClientClass()->m_ClassID == ClassID::CTFCompoundBow) { - float begincharge = NET_FLOAT(g_pLocalPlayer->weapon, netvar.flChargeBeginTime); + if (g_pLocalPlayer->weapon->m_iClassID == ClassID::CTFCompoundBow) { + float begincharge = CE_FLOAT(g_pLocalPlayer->weapon, netvar.flChargeBeginTime); float charge = 0; if (begincharge != 0) { charge = interfaces::gvars->curtime - begincharge; diff --git a/cathook/src/hacks/Aimbot.h b/cathook/src/hacks/Aimbot.h index 5a7e437a..5797e309 100644 --- a/cathook/src/hacks/Aimbot.h +++ b/cathook/src/hacks/Aimbot.h @@ -27,8 +27,8 @@ class Aimbot : public IHack { public: DECLARE_HACK_METHODS(); Aimbot(); - bool ShouldTarget(IClientEntity* entity); - bool Aim(IClientEntity* entity, CUserCmd* cmd); + bool ShouldTarget(CachedEntity* entity); + bool Aim(CachedEntity* entity, CUserCmd* cmd); bool m_bProjectileMode; float m_flProjSpeed; diff --git a/cathook/src/hacks/Airstuck.cpp b/cathook/src/hacks/Airstuck.cpp index a5008062..c3bfe6ba 100644 --- a/cathook/src/hacks/Airstuck.cpp +++ b/cathook/src/hacks/Airstuck.cpp @@ -27,27 +27,12 @@ bool Airstuck::CreateMove(void*, float, CUserCmd* cmd) { if (cmd->buttons & (IN_ATTACK | IN_ATTACK2)) { return true; } - //cmd->tick_count = 0xFFFFF; - //INetChannel* ch = (INetChannel*)interfaces::engineClient->GetNetChannelInfo(); - //NET_Tick tick; - //ch->SendNetMsg((INetMessage*)&tick); - //cmd->tick_count = 0xFFFF; - //interfaces::cvar->FindVar("net_fakeloss")->SetValue(99); - //interfaces::cvar->FindVar("net_fakeloss")->SetValue(100.0f); if (interfaces::gvars->tickcount % 60 == 0) { INetChannel* ch = (INetChannel*)interfaces::engineClient->GetNetChannelInfo(); - //IClient* client = (IClient*)ch->GetMsgHandler(); - //IServer* server = client->GetServer(); - //logging::Info("Client: 0x%08x Server: 0x%08x"); NET_NOP packet; - //logging::Info("NOP sent!"); - //NET_SignonState packet(6, 1); - //logging::Info("Created!"); packet.SetNetChannel(ch); packet.SetReliable(false); - //logging::Info("Sending!"); ch->SendNetMsg(packet); - //packet.WriteToBuffer(buffer); } } return true; diff --git a/cathook/src/hacks/AntiAim.cpp b/cathook/src/hacks/AntiAim.cpp index dd39eb36..37e0ccd0 100644 --- a/cathook/src/hacks/AntiAim.cpp +++ b/cathook/src/hacks/AntiAim.cpp @@ -40,7 +40,7 @@ bool AntiAim::CreateMove(void*, float, CUserCmd* cmd) { if (cmd->buttons & IN_ATTACK) { if (CanShoot()) return true; } - if ((cmd->buttons & IN_ATTACK2) && g_pLocalPlayer->weapon && g_pLocalPlayer->weapon->GetClientClass()->m_ClassID == ClassID::CTFLunchBox) return true; + if ((cmd->buttons & IN_ATTACK2) && g_pLocalPlayer->weapon->m_iClassID == ClassID::CTFLunchBox) return true; if (g_pLocalPlayer->bAttackLastTick) return true; if (GetWeaponMode(g_pLocalPlayer->entity) == weaponmode::weapon_melee) return true; float p = cmd->viewangles.x; diff --git a/cathook/src/hacks/AntiDisguise.cpp b/cathook/src/hacks/AntiDisguise.cpp index e50e4982..7d51b7c9 100644 --- a/cathook/src/hacks/AntiDisguise.cpp +++ b/cathook/src/hacks/AntiDisguise.cpp @@ -23,11 +23,11 @@ AntiDisguise::AntiDisguise() { void AntiDisguise::PaintTraverse(void*, unsigned int, bool, bool) { if (!v_bEnabled->GetBool()) return; for (int i = 0; i < 64 && i < HIGHEST_ENTITY; i++) { - IClientEntity* ent = ENTITY(i); - if (!ent) continue; - if (ent->GetClientClass()->m_ClassID == ClassID::CTFPlayer) { - if (NET_INT(ent, netvar.iClass) == tf_class::tf_spy) { - NET_INT(ent, netvar.iCond) = NET_INT(ent, netvar.iCond) &~ cond::disguised; + CachedEntity* ent = ENTITY(i); + if (CE_BAD(ent)) continue; + if (ent->m_Type == ENTITY_PLAYER) { + if (CE_INT(ent, netvar.iClass) == tf_class::tf_spy) { + CE_INT(ent, netvar.iCond) = CE_INT(ent, netvar.iCond) &~ cond::disguised; } } } diff --git a/cathook/src/hacks/AutoHeal.cpp b/cathook/src/hacks/AutoHeal.cpp index ac1cbc33..8083aa39 100644 --- a/cathook/src/hacks/AutoHeal.cpp +++ b/cathook/src/hacks/AutoHeal.cpp @@ -31,9 +31,9 @@ int AutoHeal::GetBestHealingTarget() { int AutoHeal::GetHealingPriority(int idx) { if (!CanHeal(idx)) return -1; - IClientEntity* ent = ENTITY(idx); + CachedEntity* ent = ENTITY(idx); int priority = 0; - int health = NET_INT(ent, netvar.iHealth); + int health = CE_INT(ent, netvar.iHealth); int maxhealth = g_pPlayerResource->GetMaxHealth(ent); int maxbuffedhealth = maxhealth * 1.5; int maxoverheal = maxbuffedhealth - maxhealth; @@ -51,13 +51,14 @@ int AutoHeal::GetHealingPriority(int idx) { } bool AutoHeal::CanHeal(int idx) { - IClientEntity* ent = ENTITY(idx); + CachedEntity* ent = ENTITY(idx); if (!ent) return false; - if (ent->GetClientClass()->m_ClassID != ClassID::CTFPlayer) return false; + if (ent->m_Type != ENTITY_PLAYER) return false; if (interfaces::engineClient->GetLocalPlayer() == idx) return false; - if (NET_BYTE(ent, netvar.iLifeState)) return false; - if (g_pLocalPlayer->team != NET_INT(ent, netvar.iTeamNum)) return false; - if (g_pLocalPlayer->v_Origin.DistToSqr(ent->GetAbsOrigin()) > 420 * 420) return false; + if (!ent->m_bAlivePlayer) return false; + if (ent->m_bEnemy) return false; + if (ent->m_flDistance > 420) return false; + // TODO visible any hitbox if (!IsEntityVisible(ent, 7)) return false; if (IsPlayerInvisible(ent)) return false; return true; @@ -82,7 +83,7 @@ bool AutoHeal::CreateMove(void*, float, CUserCmd* cmd) { m_iNewTarget = 1; } if (m_iCurrentHealingTarget == -1) return true; - IClientEntity* target = ENTITY(m_iCurrentHealingTarget); + CachedEntity* target = ENTITY(m_iCurrentHealingTarget); Vector out; GetHitbox(target, 7, out); AimAt(g_pLocalPlayer->v_Eye, out, cmd); diff --git a/cathook/src/hacks/AutoReflect.cpp b/cathook/src/hacks/AutoReflect.cpp index 7a35a203..11f3d24b 100644 --- a/cathook/src/hacks/AutoReflect.cpp +++ b/cathook/src/hacks/AutoReflect.cpp @@ -49,8 +49,8 @@ bool AutoReflect::CreateMove(void*, float, CUserCmd* cmd) { CachedEntity* closest = 0; float closest_dist = 0.0f; - for (int i = 0; i < gEntityCache.m_nMax; i++) { - CachedEntity* ent = gEntityCache.GetEntity(i); + for (int i = 0; i < HIGHEST_ENTITY; i++) { + CachedEntity* ent = ENTITY(i); if (CE_BAD(ent)) continue; if (!ShouldReflect(ent)) continue; //if (ent->Var(eoffsets.vVelocity).IsZero(1.0f)) continue; diff --git a/cathook/src/hacks/AutoReflect.h b/cathook/src/hacks/AutoReflect.h index 3656920a..cd2847b8 100644 --- a/cathook/src/hacks/AutoReflect.h +++ b/cathook/src/hacks/AutoReflect.h @@ -10,8 +10,6 @@ #include "IHack.h" -class IClientEntity; - class AutoReflect : public IHack { public: DECLARE_HACK_METHODS(); diff --git a/cathook/src/hacks/AutoSticky.cpp b/cathook/src/hacks/AutoSticky.cpp index 2b9dd83e..619965bc 100644 --- a/cathook/src/hacks/AutoSticky.cpp +++ b/cathook/src/hacks/AutoSticky.cpp @@ -25,8 +25,8 @@ AutoSticky::AutoSticky() { } bool AutoSticky::ShouldDetonate(CachedEntity* bomb) { - for (int i = 0; i < gEntityCache.m_nMax; i++) { - CachedEntity* ent = gEntityCache.GetEntity(i); + for (int i = 0; i < HIGHEST_ENTITY; i++) { + CachedEntity* ent = ENTITY(i); if (CE_BAD(ent)) continue; if (ent->m_Type != ENTITY_PLAYER && (ent->m_Type != ENTITY_BUILDING || !this->v_bBuildings->GetBool())) continue; if (ent->m_iTeam == CE_INT(bomb, netvar.iTeamNum)) continue; @@ -39,8 +39,8 @@ bool AutoSticky::ShouldDetonate(CachedEntity* bomb) { bool AutoSticky::CreateMove(void*, float, CUserCmd* cmd) { if (!this->v_bEnabled->GetBool()) return true; if (CE_BAD(g_pLocalPlayer->entity)) return true; - for (int i = 0; i < gEntityCache.m_nMax; i++) { - CachedEntity* ent = gEntityCache.GetEntity(i); + for (int i = 0; i < HIGHEST_ENTITY; i++) { + CachedEntity* ent = ENTITY(i); if (CE_BAD(ent)) continue; if (ent->m_iClassID != ClassID::CTFGrenadePipebombProjectile) continue; if (CE_INT(ent, netvar.iPipeType) != 1) continue; diff --git a/cathook/src/hacks/AutoStrafe.cpp b/cathook/src/hacks/AutoStrafe.cpp index 65fc6759..218fa6b6 100644 --- a/cathook/src/hacks/AutoStrafe.cpp +++ b/cathook/src/hacks/AutoStrafe.cpp @@ -24,7 +24,7 @@ bool AutoStrafe::CreateMove(void*, float, CUserCmd* cmd) { if (!v_bEnabled->GetBool()) return true; if (g_pLocalPlayer->entity && !g_pLocalPlayer->life_state) { // TODO FL_ONGROUND - if (NET_INT(g_pLocalPlayer->entity, netvar.iFlags) & (1 << 0)) return true; + if (CE_INT(g_pLocalPlayer->entity, netvar.iFlags) & (1 << 0)) return true; if (abs(cmd->mousedx) > 1) { cmd->sidemove = (cmd->mousedx) < 0.0f ? -450.0f : 450.0f; } diff --git a/cathook/src/hacks/Bunnyhop.cpp b/cathook/src/hacks/Bunnyhop.cpp index 45a9823c..d04f9de9 100644 --- a/cathook/src/hacks/Bunnyhop.cpp +++ b/cathook/src/hacks/Bunnyhop.cpp @@ -26,15 +26,12 @@ bool bDoubleJumpFix = false; bool Bunnyhop::CreateMove(void* thisptr, float sampling, CUserCmd* cmd) { if (!this->v_bEnabled->GetBool()) return true; - int player = interfaces::engineClient->GetLocalPlayer(); - IClientEntity* entity = ENTITY(player); - int cond3 = NET_INT(entity, netvar.iCond3); - if (cond3 & cond_ex3::grappling) return true; - int flags = NET_INT(entity, netvar.iFlags); + if (g_pLocalPlayer->cond_3 & cond_ex3::grappling) return true; + int flags = CE_INT(g_pLocalPlayer->entity, netvar.iFlags); if (v_bAutoJump->GetBool()) { - Vector vel = NET_VECTOR(g_pLocalPlayer->entity, netvar.vVelocity); - if (sqrt((vel.x * vel.x + vel.y * vel.y)) > v_iAutoJumpSpeed->GetInt()) { + Vector vel = CE_VECTOR(g_pLocalPlayer->entity, netvar.vVelocity); + if ((vel.x * vel.x + vel.y * vel.y) > SQR(v_iAutoJumpSpeed->GetInt())) { cmd->buttons |= IN_JUMP; } } diff --git a/cathook/src/hacks/ESP.cpp b/cathook/src/hacks/ESP.cpp index d5696de1..2378af0b 100644 --- a/cathook/src/hacks/ESP.cpp +++ b/cathook/src/hacks/ESP.cpp @@ -29,8 +29,8 @@ const char* classes[] = { }; void ESP::PaintTraverse(void*, unsigned int, bool, bool) { - for (int i = 0; i < gEntityCache.m_nMax; i++) { - ProcessEntityPT(gEntityCache.GetEntity(i)); + for (int i = 0; i < HIGHEST_ENTITY; i++) { + ProcessEntityPT(ENTITY(i)); } } @@ -71,11 +71,11 @@ ESP::ESP() { #define ESP_HEIGHT 14 void ESP::DrawBox(CachedEntity* ent, Color clr, float widthFactor, float addHeight, bool healthbar, int health, int healthmax) { - if (!CheckCE(ent)) return; - bool cloak = ent->m_iClassID == ClassID::CTFPlayer && IsPlayerInvisible(ent->m_pEntity);//(CE_INT(ent, netvar.iCond) & cond::cloaked); + if (CE_BAD(ent)) return; + bool cloak = ent->m_iClassID == ClassID::CTFPlayer && IsPlayerInvisible(ent);//(CE_INT(ent, netvar.iCond) & cond::cloaked); Vector min, max; - ent->m_pEntity->GetRenderBounds(min, max); - Vector origin = ent->m_pEntity->GetAbsOrigin(); + RAW_ENT(ent)->GetRenderBounds(min, max); + Vector origin = ent->m_vecOrigin; Vector so; draw::WorldToScreen(origin, so); //if (!a) return; @@ -117,28 +117,26 @@ void ESP::DrawBox(CachedEntity* ent, Color clr, float widthFactor, float addHeig void ESP::ProcessEntityPT(CachedEntity* ent) { if (!this->v_bEnabled->GetBool()) return; if (!this->v_bBox->GetBool()) return; - if (!CheckCE(ent)) return; + if (CE_BAD(ent)) return; if (!(this->v_bSeeLocal->GetBool() && interfaces::iinput->CAM_IsThirdPerson()) && ent->m_IDX == interfaces::engineClient->GetLocalPlayer()) return; Color fg = colors::EntityF(ent); - switch (ent->m_iClassID) { - case ClassID::CTFPlayer: { - bool cloak = IsPlayerInvisible(ent->m_pEntity);//CE_INT(ent, netvar.iCond) & cond::cloaked; - if (v_bLegit->GetBool() && ent->m_iTeam != g_pLocalPlayer->team && !GetRelation(ent->m_pEntity)) { + switch (ent->m_Type) { + case ENTITY_PLAYER: { + bool cloak = IsPlayerInvisible(ent);//CE_INT(ent, netvar.iCond) & cond::cloaked; + if (v_bLegit->GetBool() && ent->m_iTeam != g_pLocalPlayer->team && !GetRelation(ent)) { if (cloak) return; if (ent->m_lLastSeen > v_iLegitSeenTicks->GetInt()) { return; } } - if (CE_INT(ent, netvar.iTeamNum) == g_pLocalPlayer->team && !v_bTeammates->GetBool() && !GetRelation(ent->m_pEntity)) break; + if (!ent->m_bEnemy && !v_bTeammates->GetBool() && !GetRelation(ent)) break; if (!ent->m_bAlivePlayer) break; DrawBox(ent, fg, 3.0f, -15.0f, true, CE_INT(ent, netvar.iHealth), ent->m_iMaxHealth); break; } - case ClassID::CObjectSentrygun: - case ClassID::CObjectDispenser: - case ClassID::CObjectTeleporter: { + case ENTITY_BUILDING: { if (v_bLegit->GetBool() && ent->m_iTeam != g_pLocalPlayer->team) { if (ent->m_lLastSeen > v_iLegitSeenTicks->GetInt()) { return; @@ -153,13 +151,13 @@ void ESP::ProcessEntityPT(CachedEntity* ent) { void ESP::ProcessEntity(CachedEntity* ent) { if (!this->v_bEnabled->GetBool()) return; - if (!CheckCE(ent)) return; + if (CE_BAD(ent)) return; Color color = colors::EntityF(ent); Color bgclr = colors::EntityB(ent); if (v_bEntityESP->GetBool()) { - ent->AddESPString(color, bgclr, "%s [%i]", ent->m_pEntity->GetClientClass()->m_pNetworkName, ent->m_iClassID); + ent->AddESPString(color, bgclr, "%s [%i]", RAW_ENT(ent)->GetClientClass()->m_pNetworkName, ent->m_iClassID); if (v_bShowEntityID->GetBool()) { ent->AddESPString(color, bgclr, "%i", ent->m_IDX); } @@ -245,7 +243,7 @@ void ESP::ProcessEntity(CachedEntity* ent) { } break; case ClassID::CBaseAnimating: { if (!this->v_bItemESP->GetBool()) break; - item_type type = GetItemType(ent->m_pEntity); + item_type type = GetItemType(ent); if (type == item_type::item_null) break; bool shown = false; if (type >= item_medkit_small && type <= item_medkit_large && this->v_bShowHealthPacks->GetBool()) { @@ -271,12 +269,12 @@ void ESP::ProcessEntity(CachedEntity* ent) { int pcond = CE_INT(ent, netvar.iCond); player_info_t info; if (!interfaces::engineClient->GetPlayerInfo(ent->m_IDX, &info)) return; - powerup_type power = GetPowerupOnPlayer(ent->m_pEntity); + powerup_type power = GetPowerupOnPlayer(ent); // If target is enemy, always show powerups, if player is teammate, show powerups // only if bTeammatePowerup or bTeammates is true - if (v_bLegit->GetBool() && ent->m_iTeam != g_pLocalPlayer->team && !GetRelation(ent->m_pEntity)) { + if (v_bLegit->GetBool() && ent->m_iTeam != g_pLocalPlayer->team && !GetRelation(ent)) { //if (pcond & cond::cloaked) return; - if (IsPlayerInvisible(ent->m_pEntity)) return; + if (IsPlayerInvisible(ent)) return; if (ent->m_lLastSeen > (unsigned)v_iLegitSeenTicks->GetInt()) { return; } @@ -284,7 +282,7 @@ void ESP::ProcessEntity(CachedEntity* ent) { if (power >= 0 && (ent->m_bEnemy || this->v_bTeammatePowerup->GetBool() || this->v_bTeammates->GetBool())) { ent->AddESPString(color, bgclr, "HAS [%s]", powerups[power]); } - if (ent->m_bEnemy || v_bTeammates->GetBool() || GetRelation(ent->m_pEntity)) { + if (ent->m_bEnemy || v_bTeammates->GetBool() || GetRelation(ent)) { ent->AddESPString(color, bgclr, "%s", info.name); if (v_bShowFriendID->GetBool()) { ent->AddESPString(color, bgclr, "%lu", info.friendsID); @@ -297,7 +295,7 @@ void ESP::ProcessEntity(CachedEntity* ent) { if (pcond & cond::cloaked) { ent->AddESPString(color, bgclr, "CLOAKED"); } - if (IsPlayerInvulnerable(ent->m_pEntity)) { + if (IsPlayerInvulnerable(ent)) { ent->AddESPString(color, bgclr, "INVULNERABLE"); } if (CE_INT(ent, netvar.iCond1) & cond_ex::vacc_bullet) { @@ -306,7 +304,7 @@ void ESP::ProcessEntity(CachedEntity* ent) { if (CE_INT(ent, netvar.iCond1) & cond_ex::vacc_pbullet) { ent->AddESPString(color, bgclr, "VACCINATOR PASSIVE"); } - if (IsPlayerCritBoosted(ent->m_pEntity)) { + if (IsPlayerCritBoosted(ent)) { ent->AddESPString(color, bgclr, "CRIT BOOSTED"); } if (this->v_bShowDistance) { @@ -339,8 +337,9 @@ void ESP::ProcessEntity(CachedEntity* ent) { } bool ESP::CreateMove(void*, float, CUserCmd*) { - for (int i = 0; i < gEntityCache.m_nMax; i++) { - ProcessEntity(gEntityCache.GetEntity(i)); + for (int i = 0; i < HIGHEST_ENTITY; i++) { + CachedEntity* ent = ENTITY(i); + if (CE_GOOD(ent)) { ProcessEntity(ent); } } return true; }; diff --git a/cathook/src/hacks/FollowBot.cpp b/cathook/src/hacks/FollowBot.cpp index 3360f8bc..1aa33eea 100644 --- a/cathook/src/hacks/FollowBot.cpp +++ b/cathook/src/hacks/FollowBot.cpp @@ -30,10 +30,10 @@ bool FollowBot::ShouldPopUber(bool force) { if (health_my < 30) return true; //bool other_bots_have_uber = false; for (int i = 0; i < 64 && i < HIGHEST_ENTITY; i++) { - IClientEntity* ent = ENTITY(i); + CachedEntity* ent = ENTITY(i); if (ent == g_pLocalPlayer->entity) continue; if (IsFriendlyBot(ent)) { - if (NET_BYTE(ent, netvar.iLifeState)) continue; + if (CE_BYTE(ent, netvar.iLifeState)) continue; //IClientEntity* medigun; // TODO } @@ -64,7 +64,7 @@ void CC_ResetList(const CCommand& args) { MedicCallListener* g_pListener; // TODO -void FollowBot::ProcessEntity(IClientEntity* entity, bool enemy) { +void FollowBot::ProcessEntity(CachedEntity* entity, bool enemy) { return; } @@ -80,13 +80,13 @@ void FollowBot::ProcessEntity(IClientEntity* entity, bool enemy) { */ // TODO -int FollowBot::ShouldNotTarget(IClientEntity* ent, bool notrace) { - if (!ent || ent->IsDormant()) return 1; - if (ent->GetClientClass()->m_ClassID != 241) return 2; - if (NET_BYTE(ent, netvar.iLifeState)) return 3; - bool enemy = NET_INT(ent, netvar.iTeamNum) != g_pLocalPlayer->team; - if (enemy) return 4; +int FollowBot::ShouldNotTarget(CachedEntity* ent, bool notrace) { + if (CE_BAD(ent)) return 1; + if (ent->m_Type != ENTITY_PLAYER) return 2; + if (!ent->m_bAlivePlayer) return 3; + if (ent->m_bEnemy) return 4; + // TODO temporary! W+m1 bot should be back! if (!this->IsOwner(ent)) { return 7; } @@ -103,17 +103,17 @@ int FollowBot::ShouldNotTarget(IClientEntity* ent, bool notrace) { } void FollowBot::Tick(CUserCmd* cmd) { - if (!g_pLocalPlayer->entity || g_pLocalPlayer->entity->IsDormant()) return; + if (CE_BAD(g_pLocalPlayer->entity)) return; if (g_pLocalPlayer->life_state) return; - IClientEntity* owner_entity = 0; + CachedEntity* owner_entity = 0; for (int i = 0; i < 64 && i < HIGHEST_ENTITY; i++) { if (IsOwner(ENTITY(i))) { m_hTargetFollowing = i; owner_entity = ENTITY(i); } } - if (!owner_entity) return; + if (CE_BAD(owner_entity)) return; if (m_iForceHealTicks && m_iForceHealTicks < 20) { m_iForceHealTicks++; cmd->buttons |= IN_ATTACK; @@ -142,18 +142,15 @@ void FollowBot::Tick(CUserCmd* cmd) { if (!owner_entity) break; //bool owner_zoomed = (NET_INT(owner_entity, eoffsets.iCond) & cond::zoomed); // - if (IClientEntity* weapon = ENTITY(NET_INT(owner_entity, netvar.hActiveWeapon) & 0xFFF)) { - if (weapon) { - if (weapon->GetClientClass()->m_ClassID == ClassID::CTFSniperRifle || weapon->GetClientClass()->m_ClassID == ClassID::CTFSniperRifle) { - bool bot_zoomed = (NET_INT(g_pLocalPlayer->entity, netvar.iCond) & cond::zoomed); - if (!bot_zoomed) { - cmd->buttons |= IN_ATTACK2; - } - } else { - bool bot_zoomed = (NET_INT(g_pLocalPlayer->entity, netvar.iCond) & cond::zoomed); - if (bot_zoomed) { - cmd->buttons |= IN_ATTACK2; - } + CachedEntity* owner_weapon = ENTITY(CE_INT(owner_entity, netvar.hActiveWeapon) & 0xFFF); + if (CE_GOOD(owner_weapon)) { + if (owner_weapon->m_iClassID == ClassID::CTFSniperRifle || owner_weapon->m_iClassID == ClassID::CTFSniperRifle) { + if (!g_pLocalPlayer->bZoomed) { + cmd->buttons |= IN_ATTACK2; + } + } else { + if (g_pLocalPlayer->bZoomed) { + cmd->buttons |= IN_ATTACK2; } } } @@ -164,10 +161,10 @@ void FollowBot::Tick(CUserCmd* cmd) { if (v_iBotPackage->GetInt() == botpackage::BOT_MEDIC) { - IClientEntity* healtr = this->GetBestHealingTarget(); - m_hTargetHealing = (healtr ? healtr->entindex() : 0); + CachedEntity* healtr = this->GetBestHealingTarget(); + m_hTargetHealing = (healtr ? healtr->m_IDX : 0); if (healtr) { - if (NET_INT(healtr, netvar.iHealth) < 35 && !NET_BYTE(healtr, netvar.iLifeState)) { + if (CE_INT(healtr, netvar.iHealth) < 35 && !CE_BYTE(healtr, netvar.iLifeState)) { m_iShouldUbercharge = 1; } if (g_pLocalPlayer->health < 35) { @@ -179,7 +176,7 @@ void FollowBot::Tick(CUserCmd* cmd) { if (owner_entity && (0 == (g_nTick % 20))) { static bool forward = false; static bool jump = false; - if (!jump && NET_VECTOR(g_pLocalPlayer->entity, netvar.vVelocity).IsZero(10.0f) && !(NET_INT(g_pLocalPlayer->entity, netvar.iCond) & cond::zoomed)) { + if (!jump && CE_VECTOR(g_pLocalPlayer->entity, netvar.vVelocity).IsZero(10.0f) && !g_pLocalPlayer->bZoomed) { interfaces::engineClient->ExecuteClientCmd("+jump"); jump = true; } else if (jump) { @@ -200,17 +197,17 @@ void FollowBot::Tick(CUserCmd* cmd) { } void FollowBot::ActuallyCreateMove(CUserCmd* cmd) { - IClientEntity* tr_follow = ENTITY(this->m_hTargetFollowing); + CachedEntity* tr_follow = ENTITY(this->m_hTargetFollowing); QAngle angles = VectorToQAngle(cmd->viewangles); - if (tr_follow) { + if (CE_GOOD(tr_follow)) { AimAtHitbox(tr_follow, 4, cmd); angles = VectorToQAngle(cmd->viewangles); g_pLocalPlayer->v_OrigViewangles = cmd->viewangles; } if (v_iBotPackage->GetInt() == botpackage::BOT_MEDIC) { - IClientEntity* tr_heal = ENTITY(this->m_hTargetHealing); - if (tr_heal) { + CachedEntity* tr_heal = ENTITY(this->m_hTargetHealing); + if (CE_GOOD(tr_heal)) { AimAtHitbox(tr_heal, 4, cmd); g_pLocalPlayer->bUseSilentAngles = true; } @@ -219,38 +216,34 @@ void FollowBot::ActuallyCreateMove(CUserCmd* cmd) { } // TODO optimize, cache or something -bool FollowBot::IsOwner(IClientEntity* ent) { - if (!ent) return false; - if (ent->GetClientClass()->m_ClassID != ClassID::CTFPlayer) return false; - player_info_t info; - if (!interfaces::engineClient->GetPlayerInfo(ent->entindex(), &info)) return false; - return (info.friendsID == this->m_nOwnerID); +bool FollowBot::IsOwner(CachedEntity* ent) { + if (CE_BAD(ent)) return false; + return (ent->m_pPlayerInfo && ent->m_pPlayerInfo->friendsID == this->m_nOwnerID); } void FollowBot::ResetBotList() { this->m_nOtherBots = 0; } -bool FollowBot::IsFriendlyBot(IClientEntity* ent) { - if (!ent) return false; - if (ent->GetClientClass()->m_ClassID != ClassID::CTFPlayer) return false; - player_info_t info; - if (!interfaces::engineClient->GetPlayerInfo(ent->entindex(), &info)) return false; +bool FollowBot::IsFriendlyBot(CachedEntity* ent) { + if (CE_BAD(ent)) return false; + if (!ent->m_pPlayerInfo) return false; for (unsigned i = 0; i < this->m_nOtherBots && i < 32; i++) { - if (info.friendsID == this->m_OtherBots[i]) return true; + if (ent->m_pPlayerInfo->friendsID == this->m_OtherBots[i]) return true; } return false; } -IClientEntity* FollowBot::GetBestHealingTarget() { - IClientEntity* best = 0; +CachedEntity* FollowBot::GetBestHealingTarget() { + CachedEntity* best = 0; int best_score = -65536; for (int i = 0; i < 64 && i < HIGHEST_ENTITY; i++) { - IClientEntity* cur = ENTITY(i); - if (cur && cur->GetClientClass()->m_ClassID == ClassID::CTFPlayer) { - if (NET_INT(cur, netvar.iTeamNum) != g_pLocalPlayer->team) continue; - if (NET_BYTE(cur, netvar.iLifeState)) continue; + CachedEntity* cur = ENTITY(i); + if (CE_BAD(cur)) continue; + if (cur->m_Type == ENTITY_PLAYER) { + if (cur->m_bEnemy) continue; + if (!cur->m_bAlivePlayer) continue; if (cur == g_pLocalPlayer->entity) continue; int score = this->GetHealingPriority(cur); if (score > best_score && score != 0) { @@ -271,22 +264,22 @@ bool FollowBot::CreateMove(void*, float, CUserCmd* cmd) { return false; } -int FollowBot::GetHealingPriority(IClientEntity* ent) { +int FollowBot::GetHealingPriority(CachedEntity* ent) { if (!ent) return 0; int result = 0; - if (NET_BYTE(ent, netvar.iLifeState)) return 0; - if (NET_INT(ent, netvar.iTeamNum) != g_pLocalPlayer->team) return 0; + if (ent->m_bEnemy) return 0; + if (!ent->m_bAlivePlayer) return 0; if (!IsEntityVisible(ent, 4)) return 0; - int health = NET_INT(ent, netvar.iHealth); + int health = CE_INT(ent, netvar.iHealth); int maxhealth = g_pPlayerResource->GetMaxHealth(ent); int maxbuffedhealth = maxhealth * 1.5; int maxoverheal = maxbuffedhealth - maxhealth; int overheal = maxoverheal - (maxbuffedhealth - health); float overhealp = ((float)overheal / (float)maxoverheal); float healthp = ((float)health / (float)maxhealth); - if (ent->GetAbsOrigin().DistToSqr(g_pLocalPlayer->v_Eye) > 1000 * 1000) return 0; + if (ent->m_flDistance > 1000) return 0; if (this->IsFriendlyBot(ent)) { // Friendly bot medics must be constantly at 100%+ hp diff --git a/cathook/src/hacks/FollowBot.h b/cathook/src/hacks/FollowBot.h index 0944ee28..7aa6c36a 100644 --- a/cathook/src/hacks/FollowBot.h +++ b/cathook/src/hacks/FollowBot.h @@ -30,16 +30,16 @@ public: DECLARE_HACK_METHODS(); FollowBot(); ~FollowBot(); - void ProcessEntity(IClientEntity* entity, bool enemy); + void ProcessEntity(CachedEntity* entity, bool enemy); void Tick(CUserCmd*); - int ShouldNotTarget(IClientEntity* ent, bool notrace); + int ShouldNotTarget(CachedEntity* ent, bool notrace); bool ShouldPopUber(bool force); void ActuallyCreateMove(CUserCmd*); - IClientEntity* GetBestHealingTarget(); - int GetHealingPriority(IClientEntity* ent); - bool IsFriendlyBot(IClientEntity* ent); - bool IsOwner(IClientEntity* ent); + CachedEntity* GetBestHealingTarget(); + int GetHealingPriority(CachedEntity* ent); + bool IsFriendlyBot(CachedEntity* ent); + bool IsOwner(CachedEntity* ent); void ResetBotList(); void AddBotID(uint32 id); void SetOwner(uint32 id); diff --git a/cathook/src/hacks/HuntsmanCompensation.cpp b/cathook/src/hacks/HuntsmanCompensation.cpp index 15cb2b1b..a1523175 100644 --- a/cathook/src/hacks/HuntsmanCompensation.cpp +++ b/cathook/src/hacks/HuntsmanCompensation.cpp @@ -28,7 +28,7 @@ bool HuntsmanCompensation::CreateMove(void*, float, CUserCmd* cmd) { if (g_pLocalPlayer->life_state) return true; static trace_t* view_trace = new trace_t(); Ray_t ray; - trace::g_pFilterDefault->SetSelf(g_pLocalPlayer->entity); + trace::g_pFilterDefault->SetSelf(RAW_ENT(g_pLocalPlayer->entity)); Vector forward; float sp, sy, cp, cy; sy = sinf(DEG2RAD(cmd->viewangles[1])); // yaw diff --git a/cathook/src/hacks/IHack.h b/cathook/src/hacks/IHack.h index daa676c3..1125d952 100644 --- a/cathook/src/hacks/IHack.h +++ b/cathook/src/hacks/IHack.h @@ -13,6 +13,7 @@ class ConVar; class CatVar; class ConCommand; class CCommand; +class CachedEntity; typedef unsigned int uint32; diff --git a/cathook/src/hacks/Misc.cpp b/cathook/src/hacks/Misc.cpp index 6b86b3a5..e705530a 100644 --- a/cathook/src/hacks/Misc.cpp +++ b/cathook/src/hacks/Misc.cpp @@ -47,7 +47,7 @@ void CC_AddRage(const CCommand& args) { rage[n_rage++] = atoi(args[1]); } -void DumpRecvTable(IClientEntity* ent, RecvTable* table, int depth, const char* ft) { +void DumpRecvTable(CachedEntity* ent, RecvTable* table, int depth, const char* ft) { //bool forcetable = strlen(ft); if (!ft || !strcmp(ft, table->GetName())) logging::Info("==== TABLE: %s", table->GetName()); @@ -60,19 +60,19 @@ void DumpRecvTable(IClientEntity* ent, RecvTable* table, int depth, const char* if (ft && strcmp(ft, table->GetName())) continue; switch (prop->GetType()) { case SendPropType::DPT_Float: - logging::Info("%s [0x%04x] = %f", prop->GetName(), prop->GetOffset(), NET_FLOAT(ent, prop->GetOffset())); + logging::Info("%s [0x%04x] = %f", prop->GetName(), prop->GetOffset(), CE_FLOAT(ent, prop->GetOffset())); break; case SendPropType::DPT_Int: - logging::Info("%s [0x%04x] = %i", prop->GetName(), prop->GetOffset(), NET_INT(ent, prop->GetOffset())); + logging::Info("%s [0x%04x] = %i", prop->GetName(), prop->GetOffset(), CE_INT(ent, prop->GetOffset())); break; case SendPropType::DPT_String: - logging::Info("%s [0x%04x] = %s", prop->GetName(), prop->GetOffset(), NET_VAR(ent, prop->GetOffset(), char*)); + logging::Info("%s [0x%04x] = %s", prop->GetName(), prop->GetOffset(), CE_VAR(ent, prop->GetOffset(), char*)); break; case SendPropType::DPT_Vector: - logging::Info("%s [0x%04x] = (%f, %f, %f)", prop->GetName(), prop->GetOffset(), NET_FLOAT(ent, prop->GetOffset()), NET_FLOAT(ent, prop->GetOffset() + 4), NET_FLOAT(ent, prop->GetOffset() + 8)); + logging::Info("%s [0x%04x] = (%f, %f, %f)", prop->GetName(), prop->GetOffset(), CE_FLOAT(ent, prop->GetOffset()), CE_FLOAT(ent, prop->GetOffset() + 4), CE_FLOAT(ent, prop->GetOffset() + 8)); break; case SendPropType::DPT_VectorXY: - logging::Info("%s [0x%04x] = (%f, %f)", prop->GetName(), prop->GetOffset(), NET_FLOAT(ent, prop->GetOffset()), NET_FLOAT(ent, prop->GetOffset() + 4)); + logging::Info("%s [0x%04x] = (%f, %f)", prop->GetName(), prop->GetOffset(), CE_FLOAT(ent, prop->GetOffset()), CE_FLOAT(ent, prop->GetOffset() + 4)); break; } @@ -85,10 +85,10 @@ void CC_DumpVars(const CCommand& args) { if (args.ArgC() < 1) return; if (!atoi(args[1])) return; int idx = atoi(args[1]); - IClientEntity* ent = ENTITY(idx); + CachedEntity* ent = ENTITY(idx); if (!ent) return; - ClientClass* clz = ent->GetClientClass(); - logging::Info("Entity %i: %s", ent->entindex(), clz->GetName()); + ClientClass* clz = RAW_ENT(ent)->GetClientClass(); + logging::Info("Entity %i: %s", ent->m_IDX, clz->GetName()); const char* ft = (args.ArgC() > 1 ? args[2] : ""); DumpRecvTable(ent, clz->m_pRecvTable, 0, ft); } @@ -100,11 +100,9 @@ void CC_ResetLists(const CCommand& args) { void CC_DumpPlayers(const CCommand& args) { for (int i = 0; i < 64 && i < HIGHEST_ENTITY; i++) { - IClientEntity* ent = ENTITY(i); - if (!ent || ent->GetClientClass()->m_ClassID != ClassID::CTFPlayer) continue; - player_info_t info; - if (!interfaces::engineClient->GetPlayerInfo(i, &info)) continue; - logging::Info("[%i] FriendID: %lu ; Name: %s", i, info.friendsID, info.name); + CachedEntity* ent = ENTITY(i); + if (CE_BAD(ent) || !ent->m_pPlayerInfo) continue; + logging::Info("[%i] FriendID: %lu ; Name: %s", i, ent->m_pPlayerInfo->friendsID, ent->m_pPlayerInfo->name); } } @@ -208,8 +206,8 @@ void CC_DisonnectVAC(const CCommand& args) { void CC_DumpAttribs(const CCommand& args) { if (g_pLocalPlayer->weapon) { for (int i = 0; i < 15; i++) { - logging::Info("%i %f", NET_INT(g_pLocalPlayer->weapon, netvar.AttributeList + i * 12), - NET_FLOAT(g_pLocalPlayer->weapon, netvar.AttributeList + i * 12 + 4)); + logging::Info("%i %f", CE_INT(g_pLocalPlayer->weapon, netvar.AttributeList + i * 12), + CE_FLOAT(g_pLocalPlayer->weapon, netvar.AttributeList + i * 12 + 4)); } } } @@ -245,7 +243,7 @@ Misc::Misc() { c_Disconnect = CreateConCommand(CON_PREFIX "disconnect", CC_Disconnect, "Disconnect"); c_DisconnectVAC = CreateConCommand(CON_PREFIX "disconnect_vac", CC_DisonnectVAC, "Disconnect (VAC)"); v_bInfoSpam = CreateConVar(CON_PREFIX "info_spam", "0", "Info spam"); - v_bFakeCrouch = CreateConVar(CON_PREFIX "fakecrouch", "0", "Fake crouch"); + v_bFastCrouch = CreateConVar(CON_PREFIX "fakecrouch", "0", "Fast crouch"); CreateConCommand(CON_PREFIX "set", CC_SetValue, "Set ConVar value (if third argument is 1 the ^'s will be converted into newlines)"); } @@ -267,8 +265,8 @@ bool Misc::CreateMove(void*, float, CUserCmd* cmd) { //ch->SendNetMsg(*(INetMessage*)&setname); //setname.WriteToBuffer(0); }*/ - if (v_bFakeCrouch->GetBool()) { - if (interfaces::gvars->tickcount % 2 == 0) { + if (v_bFastCrouch->GetBool()) { + if (interfaces::gvars->tickcount % 4 == 0) { cmd->buttons &= ~IN_DUCK; } } @@ -278,7 +276,7 @@ bool Misc::CreateMove(void*, float, CUserCmd* cmd) { lastsay++; } else lastsay = 0; if (v_bInfoSpam->GetBool() && (lastsay == 0)) { - IClientEntity* ent = ENTITY(curindex++); + /*IClientEntity* ent = ENTITY(curindex++); if (curindex >= 64) curindex = 0; //logging::Info("Making string for %i", curindex); if (!ent || ent->IsDormant()) goto breakif; @@ -291,7 +289,7 @@ bool Misc::CreateMove(void*, float, CUserCmd* cmd) { if (str) { interfaces::engineClient->ServerCmd(strfmt("say %s", str)); lastsay = 1; - } + }*/ } breakif: return true; @@ -306,22 +304,21 @@ void Misc::PaintTraverse(void*, unsigned int, bool, bool) { interfaces::baseClient->IN_DeactivateMouse(); }*/ - if (g_pLocalPlayer->weapon) { - IClientEntity* weapon = g_pLocalPlayer->weapon; - AddSideString(colors::white, colors::black, "Weapon: %s [%i]", weapon->GetClientClass()->GetName(), weapon->GetClientClass()->m_ClassID); - AddSideString(colors::white, colors::black, "flNextPrimaryAttack: %f", NET_FLOAT(g_pLocalPlayer->weapon, netvar.flNextPrimaryAttack)); - AddSideString(colors::white, colors::black, "nTickBase: %f", (float)(NET_INT(g_pLocalPlayer->entity, netvar.nTickBase)) * interfaces::gvars->interval_per_tick); + if (CE_GOOD(g_pLocalPlayer->weapon)) { + AddSideString(colors::white, colors::black, "Weapon: %s [%i]", RAW_ENT(g_pLocalPlayer->weapon)->GetClientClass()->GetName(), g_pLocalPlayer->weapon->m_iClassID); + AddSideString(colors::white, colors::black, "flNextPrimaryAttack: %f", CE_FLOAT(g_pLocalPlayer->weapon, netvar.flNextPrimaryAttack)); + AddSideString(colors::white, colors::black, "nTickBase: %f", (float)(CE_INT(g_pLocalPlayer->entity, netvar.nTickBase)) * interfaces::gvars->interval_per_tick); AddSideString(colors::white, colors::black, "CanShoot: %i", CanShoot()); - AddSideString(colors::white, colors::black, "Decaps: %i", NET_INT(g_pLocalPlayer->entity, netvar.iDecapitations)); - AddSideString(colors::white, colors::black, "Damage: %f", NET_FLOAT(g_pLocalPlayer->weapon, netvar.flChargedDamage)); - AddSideString(colors::white, colors::black, "DefIndex: %i", NET_INT(g_pLocalPlayer->weapon, netvar.iItemDefinitionIndex)); + AddSideString(colors::white, colors::black, "Decaps: %i", CE_INT(g_pLocalPlayer->entity, netvar.iDecapitations)); + AddSideString(colors::white, colors::black, "Damage: %f", CE_FLOAT(g_pLocalPlayer->weapon, netvar.flChargedDamage)); + AddSideString(colors::white, colors::black, "DefIndex: %i", CE_INT(g_pLocalPlayer->weapon, netvar.iItemDefinitionIndex)); AddSideString(colors::white, colors::black, "GlobalVars: 0x%08x", interfaces::gvars); AddSideString(colors::white, colors::black, "realtime: %f", interfaces::gvars->realtime); AddSideString(colors::white, colors::black, "interval_per_tick: %f", interfaces::gvars->interval_per_tick); - AddSideString(colors::white, colors::black, "ambassador_can_headshot: %i", (interfaces::gvars->curtime - NET_FLOAT(g_pLocalPlayer->weapon, netvar.flLastFireTime)) > 0.95); + AddSideString(colors::white, colors::black, "ambassador_can_headshot: %i", (interfaces::gvars->curtime - CE_FLOAT(g_pLocalPlayer->weapon, netvar.flLastFireTime)) > 0.95); AddSideString(colors::white, colors::black, "WeaponMode: %i", GetWeaponMode(g_pLocalPlayer->entity)); AddSideString(colors::white, colors::black, "ToGround: %f", DistanceToGround(g_pLocalPlayer->v_Origin)); - AddSideString(colors::white, colors::black, "ServerTime: %f", NET_FLOAT(g_pLocalPlayer->entity, netvar.nTickBase) * interfaces::gvars->interval_per_tick); + AddSideString(colors::white, colors::black, "ServerTime: %f", CE_FLOAT(g_pLocalPlayer->entity, netvar.nTickBase) * interfaces::gvars->interval_per_tick); AddSideString(colors::white, colors::black, "CurTime: %f", interfaces::gvars->curtime); AddSideString(colors::white, colors::black, "FrameCount: %i", interfaces::gvars->framecount); float speed, gravity; diff --git a/cathook/src/hacks/Misc.h b/cathook/src/hacks/Misc.h index d7fd5cd0..75aa1c54 100644 --- a/cathook/src/hacks/Misc.h +++ b/cathook/src/hacks/Misc.h @@ -21,7 +21,7 @@ public: ConVar* v_bDebugInfo; ConCommand* c_Name; ConVar* v_bInfoSpam; - ConVar* v_bFakeCrouch; + ConVar* v_bFastCrouch; ConCommand* c_DumpItemAttributes; ConCommand* c_SayLine; ConCommand* c_Shutdown; diff --git a/cathook/src/hacks/SpyAlert.cpp b/cathook/src/hacks/SpyAlert.cpp index 6ce237d3..d5fb4023 100644 --- a/cathook/src/hacks/SpyAlert.cpp +++ b/cathook/src/hacks/SpyAlert.cpp @@ -27,14 +27,12 @@ bool SpyAlert::CreateMove(void*, float, CUserCmd* cmd) { void SpyAlert::PaintTraverse(void*, unsigned int, bool, bool) { if (!v_bEnabled->GetBool()) return; for (int i = 0; i < HIGHEST_ENTITY && i < 64; i++) { - IClientEntity* ent = ENTITY(i); - if (!ent) continue; - if (NET_BYTE(ent, netvar.iLifeState)) continue; - if (NET_INT(ent, netvar.iClass) != tf_class::tf_spy) continue; - if (NET_INT(ent, netvar.iTeamNum) == g_pLocalPlayer->team) continue; - Vector spypos = ent->GetAbsOrigin(); - Vector mypos = g_pLocalPlayer->v_Origin; - float distance = spypos.DistTo(mypos); + CachedEntity* ent = ENTITY(i); + if (CE_BAD(ent)) continue; + if (CE_BYTE(ent, netvar.iLifeState)) continue; + if (CE_INT(ent, netvar.iClass) != tf_class::tf_spy) continue; + if (CE_INT(ent, netvar.iTeamNum) == g_pLocalPlayer->team) continue; + float distance = ent->m_flDistance; if (distance < this->v_flBackstabDistance->GetFloat()) { AddCenterString(colors::yellow, colors::red, "BACKSTAB WARNING! %im", (int)(distance / 64 * 1.22f)); } else if (distance < this->v_flWarningDistance->GetFloat()) { diff --git a/cathook/src/hacks/Trigger.cpp b/cathook/src/hacks/Trigger.cpp index e5c71db8..09f42a4a 100644 --- a/cathook/src/hacks/Trigger.cpp +++ b/cathook/src/hacks/Trigger.cpp @@ -46,7 +46,7 @@ bool Triggerbot::CreateMove(void* thisptr, float sampl, CUserCmd* cmd) { if (!local) return; if (NET_BYTE(local, entityvars.iLifeState)) return;*/ Ray_t ray; - filter->SetSelf(g_pLocalPlayer->entity); + filter->SetSelf(RAW_ENT(g_pLocalPlayer->entity)); eye = g_pLocalPlayer->v_Eye; Vector forward; float sp, sy, cp, cy; @@ -62,10 +62,12 @@ bool Triggerbot::CreateMove(void* thisptr, float sampl, CUserCmd* cmd) { forward = forward * 8192.0f + eye; ray.Init(eye, forward); interfaces::trace->TraceRay(ray, 0x4200400B, filter, enemy_trace); - IClientEntity* entity = (IClientEntity*)(enemy_trace->m_pEnt); - if (!entity) return true; + IClientEntity* raw_entity = (IClientEntity*)(enemy_trace->m_pEnt); + if (!raw_entity) return true; + CachedEntity* entity = ENTITY(raw_entity->entindex()); + bool isPlayer = false; - switch (entity->GetClientClass()->m_ClassID) { + switch (entity->m_iClassID) { case ClassID::CTFPlayer: isPlayer = true; break; @@ -79,13 +81,11 @@ bool Triggerbot::CreateMove(void* thisptr, float sampl, CUserCmd* cmd) { default: return true; }; - int team = g_pLocalPlayer->team; - int eteam = NET_INT(entity, netvar.iTeamNum); - if (team == eteam) return true; - Vector enemy_pos = entity->GetAbsOrigin(); - Vector my_pos = g_pLocalPlayer->entity->GetAbsOrigin(); + if (!entity->m_bEnemy) return true; + Vector enemy_pos = entity->m_vecOrigin; + Vector my_pos = g_pLocalPlayer->entity->m_vecOrigin; if (v_iMinRange->GetInt() > 0) { - if ((enemy_pos - my_pos).Length() > v_iMinRange->GetInt()) return true; + if (entity->m_flDistance > v_iMinRange->GetInt()) return true; } if (!isPlayer) { cmd->buttons |= IN_ATTACK; @@ -96,7 +96,7 @@ bool Triggerbot::CreateMove(void* thisptr, float sampl, CUserCmd* cmd) { if (IsPlayerInvulnerable(entity)) return true; if (!this->v_bIgnoreCloak->GetBool() && (IsPlayerInvisible(entity))) return true; - int health = NET_INT(entity, netvar.iHealth); + int health = CE_INT(entity, netvar.iHealth); bool bodyshot = false; if (g_pLocalPlayer->clazz == tf_class::tf_sniper) { // If sniper.. @@ -105,15 +105,15 @@ bool Triggerbot::CreateMove(void* thisptr, float sampl, CUserCmd* cmd) { } // If we need charge... if (!bodyshot && this->v_bBodyshot->GetBool()) { - float bdmg = NET_FLOAT(g_pLocalPlayer->weapon, netvar.flChargedDamage); - if (CanHeadshot(g_pLocalPlayer->entity) && (bdmg) >= health) { + float bdmg = CE_FLOAT(g_pLocalPlayer->weapon, netvar.flChargedDamage); + if (CanHeadshot() && (bdmg) >= health) { bodyshot = true; } } } if (!bodyshot && (g_pLocalPlayer->clazz == tf_class::tf_sniper) && this->v_bZoomedOnly->GetBool() && - !((g_pLocalPlayer->bZoomed) && CanHeadshot(g_pLocalPlayer->entity))) { + !((g_pLocalPlayer->bZoomed) && CanHeadshot())) { return true; } //IClientEntity* weapon; diff --git a/cathook/src/helpers.cpp b/cathook/src/helpers.cpp index 7a7efdac..f2ddda82 100644 --- a/cathook/src/helpers.cpp +++ b/cathook/src/helpers.cpp @@ -67,7 +67,7 @@ ConCommand* CreateConCommand(const char* name, FnCommandCallback_t callback, con const char* GetModelPath(CachedEntity* entity) { if (!entity) return "NULL"; - const model_t* model = entity->m_pEntity->GetModel(); + const model_t* model = RAW_ENT(entity)->GetModel(); return interfaces::model->GetModelName(model); } @@ -87,7 +87,7 @@ const char* GetBuildingName(CachedEntity* ent) { } /* Takes CBaseAnimating entity as input */ -item_type GetItemType(IClientEntity* entity) { +item_type GetItemType(CachedEntity* entity) { if (entity == 0) return item_type::item_null; const char* path = GetModelPath(entity); /* SDK function */ size_t length = strlen(path); @@ -171,7 +171,8 @@ void VectorTransform (const float *in1, const matrix3x4_t& in2, float *out) } bool GetHitbox(CachedEntity* entity, int hb, Vector& out) { - const model_t* model = entity->m_pEntity->GetModel(); + if (CE_BAD(entity)) return false; + const model_t* model = RAW_ENT(entity)->GetModel(); if (!model) return false; studiohdr_t* shdr = interfaces::model->GetStudiomodel(model); if (!shdr) return false; @@ -180,15 +181,19 @@ bool GetHitbox(CachedEntity* entity, int hb, Vector& out) { mstudiobbox_t* box = set->pHitbox(hb); if (!box) return false; if (box->bone < 0 || box->bone >= 128) return 5; - float *min = new float[3](), - *max = new float[3](); - VectorTransform(box->bbmin, entity->GetBones()[box->bone], *(Vector*)min); - VectorTransform(box->bbmax, entity->GetBones()[box->bone], *(Vector*)max); + //float *min = new float[3], + // *max = new float[3]; + Vector min, max; + SEGV_BEGIN + if (entity->GetBones() == 0) logging::Info("no bones!"); + VectorTransform(box->bbmin, entity->GetBones()[box->bone], min); + VectorTransform(box->bbmax, entity->GetBones()[box->bone], max); + SEGV_END_INFO("VectorTransform()-ing with unsafe Vector casting"); out.x = (min[0] + max[0]) / 2; out.x = (min[1] + max[1]) / 2; out.x = (min[2] + max[2]) / 2; - delete[] min; - delete[] max; + //delete[] min; + //delete[] max; return true; } @@ -263,20 +268,21 @@ bool IsEntityVisible(CachedEntity* entity, int hb) { } trace_t trace_visible; Ray_t ray; - IClientEntity* local = ENTITY(interfaces::engineClient->GetLocalPlayer()); - trace_filter->SetSelf(local); + CachedEntity* local = ENTITY(interfaces::engineClient->GetLocalPlayer()); + trace_filter->SetSelf(RAW_ENT(local)); Vector hit; if (hb == -1) { hit = entity->m_vecOrigin; } else { - if (!GetHitbox(entity, hb, hit)) { - return false; - } + SAFE_CALL( \ + if (!GetHitbox(entity, hb, hit)) { \ + return false; \ + }); } - ray.Init(local->GetAbsOrigin() + NET_VECTOR(local, netvar.vViewOffset), hit); + ray.Init(local->m_vecOrigin + g_pLocalPlayer->v_ViewOffset, hit); interfaces::trace->TraceRay(ray, 0x4200400B, trace_filter, &trace_visible); if (trace_visible.m_pEnt) { - return ((IClientEntity*)trace_visible.m_pEnt) == entity->m_pEntity; + return ((IClientEntity*)trace_visible.m_pEnt) == RAW_ENT(entity); } return false; } @@ -313,10 +319,10 @@ bool IsBuildingVisible(CachedEntity* ent) { } trace_t trace_visible; Ray_t ray; - trace_filter->SetSelf(g_pLocalPlayer->entity); + trace_filter->SetSelf(RAW_ENT(g_pLocalPlayer->entity)); ray.Init(g_pLocalPlayer->v_Eye, GetBuildingPosition(ent)); interfaces::trace->TraceRay(ray, 0x4200400B, trace_filter, &trace_visible); - return (IClientEntity*)trace_visible.m_pEnt == ent->m_pEntity; + return (IClientEntity*)trace_visible.m_pEnt == RAW_ENT(ent); } void fVectorAngles(Vector &forward, Vector &angles) { @@ -399,13 +405,13 @@ void Patch(void* address, void* patch, size_t length) { bool IsProjectileCrit(CachedEntity* ent) { if (ent->m_bGrenadeProjectile) - return NET_BYTE(ent, netvar.Grenade_bCritical); - return NET_BYTE(ent, netvar.Rocket_bCritical); + return CE_BYTE(ent, netvar.Grenade_bCritical); + return CE_BYTE(ent, netvar.Rocket_bCritical); } weaponmode GetWeaponMode(CachedEntity* player) { int weapon_handle = CE_INT(player, netvar.hActiveWeapon); - CachedEntity* weapon = ENTITY(weapon_handle & 0xFFF); + CachedEntity* weapon = (weapon_handle & 0xFFF < HIGHEST_ENTITY ? ENTITY(weapon_handle & 0xFFF) : 0); if (CE_BAD(weapon)) return weaponmode::weapon_invalid; if (IsMeleeWeapon(weapon)) return weaponmode::weapon_melee; switch (weapon->m_iClassID) { @@ -451,13 +457,13 @@ bool GetProjectileData(CachedEntity* weapon, float& speed, float& gravity) { break; case ClassID::CTFGrenadeLauncher: // TODO offset (GetProjectileSpeed) - rspeed = ((GetProjectileData*) *(*(const void ***) weapon + 527))(weapon); + rspeed = ((GetProjectileData*) *(*(const void ***) weapon + 527))(RAW_ENT(weapon)); // TODO Wrong grenade launcher gravity rgrav = 0.5f; break; case ClassID::CTFCompoundBow: { - rspeed = ((GetProjectileData*) *(*(const void ***) weapon + 527))(weapon); - rgrav = ((GetProjectileData*) *(*(const void ***) weapon + 528))(weapon); + rspeed = ((GetProjectileData*) *(*(const void ***) weapon + 527))(RAW_ENT(weapon)); + rgrav = ((GetProjectileData*) *(*(const void ***) weapon + 528))(RAW_ENT(weapon)); } break; case ClassID::CTFBat_Wood: rspeed = 3000.0f; @@ -511,7 +517,7 @@ bool IsVectorVisible(Vector origin, Vector target) { } trace_t trace_visible; Ray_t ray; - vec_filter->SetSelf(g_pLocalPlayer->entity); + vec_filter->SetSelf(RAW_ENT(g_pLocalPlayer->entity)); ray.Init(origin, target); interfaces::trace->TraceRay(ray, 0x4200400B, vec_filter, &trace_visible); float dist2 = origin.DistToSqr(trace_visible.endpos); @@ -571,10 +577,6 @@ bool IsAmbassador(CachedEntity* entity) { return (defidx == 61 || defidx == 1006); } -bool CheckCE(CachedEntity* entity) { - return (entity && entity->m_pEntity && !entity->m_pEntity->IsDormant()); -} - // F1 c&p Vector CalcAngle(Vector src, Vector dst) { Vector AimAngles; @@ -638,12 +640,11 @@ void AimAt(Vector origin, Vector target, CUserCmd* cmd) { cmd->viewangles = angles; } -/*void AimAtHitbox(IClientEntity* ent, int hitbox, CUserCmd* cmd) { - Vector r = ent->GetAbsOrigin(); +void AimAtHitbox(CachedEntity* ent, int hitbox, CUserCmd* cmd) { + Vector r = ent->m_vecOrigin; GetHitbox(ent, hitbox, r); AimAt(g_pLocalPlayer->v_Eye, r, cmd); - //logging::Info("Aiming at %f %f %f", r.x, r.y, r.z); -}*/ +} bool IsEntityVisiblePenetration(CachedEntity* entity, int hb) { if (!trace::g_pFilterPenetration) { @@ -651,19 +652,18 @@ bool IsEntityVisiblePenetration(CachedEntity* entity, int hb) { } trace_t trace_visible; Ray_t ray; - IClientEntity* local = ENTITY(interfaces::engineClient->GetLocalPlayer()); - trace::g_pFilterPenetration->SetSelf(local); + trace::g_pFilterPenetration->SetSelf(RAW_ENT(g_pLocalPlayer->entity)); trace::g_pFilterPenetration->Reset(); Vector hit; int ret = GetHitbox(entity, hb, hit); if (ret) { return false; } - ray.Init(local->GetAbsOrigin() + NET_VECTOR(local, netvar.vViewOffset), hit); + ray.Init(g_pLocalPlayer->v_Origin + g_pLocalPlayer->v_ViewOffset, hit); interfaces::trace->TraceRay(ray, 0x4200400B, trace::g_pFilterPenetration, &trace_visible); bool s = false; if (trace_visible.m_pEnt) { - s = ((IClientEntity*)trace_visible.m_pEnt) == entity; + s = ((IClientEntity*)trace_visible.m_pEnt) == RAW_ENT(entity); } if (!s) return false; interfaces::trace->TraceRay(ray, 0x4200400B, trace::g_pFilterDefault, &trace_visible); @@ -671,7 +671,7 @@ bool IsEntityVisiblePenetration(CachedEntity* entity, int hb) { IClientEntity* ent = (IClientEntity*)trace_visible.m_pEnt; if (ent) { if (ent->GetClientClass()->m_ClassID == ClassID::CTFPlayer) { - if (ent == entity) return false; + if (ent == RAW_ENT(entity)) return false; if (trace_visible.hitbox >= 0) { return true; } diff --git a/cathook/src/helpers.h b/cathook/src/helpers.h index 00be198a..36bc0b4d 100644 --- a/cathook/src/helpers.h +++ b/cathook/src/helpers.h @@ -26,9 +26,6 @@ class Vector; #include "fixsdk.h" #include -#define HIGHEST_ENTITY gEntityCache.m_nMax -#define ENTITY(idx) gEntityCache.GetEntity(idx)->m_pEntity - //typedef void ( *FnCommandCallback_t )( const CCommand &command ); // TODO split this shit @@ -79,13 +76,13 @@ bool IsAmbassador(CachedEntity* ent); void Patch(void* address, void* patch, size_t length); void AimAt(Vector origin, Vector target, CUserCmd* cmd); -void AimAtHitbox(IClientEntity* ent, int hitbox, CUserCmd* cmd); +void AimAtHitbox(CachedEntity* ent, int hitbox, CUserCmd* cmd); bool IsMeleeWeapon(CachedEntity* ent); bool IsProjectileCrit(CachedEntity* ent); -QAngle VectorToQAngle(Vector& in); -Vector QAngleToVector(QAngle& in); +QAngle VectorToQAngle(Vector in); +Vector QAngleToVector(QAngle in); bool CanHeadshot(); bool CanShoot(); diff --git a/cathook/src/localplayer.cpp b/cathook/src/localplayer.cpp index c80942b4..90aa98ae 100644 --- a/cathook/src/localplayer.cpp +++ b/cathook/src/localplayer.cpp @@ -11,16 +11,21 @@ void LocalPlayer::Update() { entity_idx = interfaces::engineClient->GetLocalPlayer(); entity = ENTITY(entity_idx); - team = NET_INT(entity, netvar.iTeamNum); - life_state = NET_BYTE(entity, netvar.iLifeState); - v_ViewOffset = NET_VECTOR(entity, netvar.vViewOffset); - v_Origin = entity->GetAbsOrigin(); + if (!entity) logging::Info("Local Player is NULL!"); + if (CE_BAD(entity)) logging::Info("Local Player is BAD CACHED ENTITY!"); + team = CE_INT(entity, netvar.iTeamNum); + life_state = CE_BYTE(entity, netvar.iLifeState); + v_ViewOffset = CE_VECTOR(entity, netvar.vViewOffset); + v_Origin = entity->m_vecOrigin; v_Eye = v_Origin + v_ViewOffset; - cond_0 = NET_INT(entity, netvar.iCond); - clazz = NET_INT(entity, netvar.iClass); - health = NET_INT(entity, netvar.iHealth); + cond_0 = CE_INT(entity, netvar.iCond); + cond_1 = CE_INT(entity, netvar.iCond1); + cond_2 = CE_INT(entity, netvar.iCond1); + cond_3 = CE_INT(entity, netvar.iCond3); + clazz = CE_INT(entity, netvar.iClass); + health = CE_INT(entity, netvar.iHealth); this->bUseSilentAngles = false; - bZoomed = NET_INT(entity, netvar.iFOV) == 20; //!= NET_INT(entity, netvar.iDefaultFOV); + bZoomed = CE_INT(entity, netvar.iFOV) == 20; //!= NET_INT(entity, netvar.iDefaultFOV); if (bZoomed) { if (flZoomBegin == 0.0f) flZoomBegin = interfaces::gvars->curtime; } else { @@ -28,11 +33,11 @@ void LocalPlayer::Update() { } - int hWeapon = NET_INT(entity, netvar.hActiveWeapon); + int hWeapon = CE_INT(entity, netvar.hActiveWeapon); if (hWeapon && (hWeapon & 0xFFF) < HIGHEST_ENTITY) { weapon = ENTITY(hWeapon & 0xFFF); if (weapon) - bIsReloading = (NET_INT(weapon, netvar.iReloadMode) == 1); + bIsReloading = (CE_INT(weapon, netvar.iReloadMode) == 1); } else { weapon = 0; bIsReloading = false; diff --git a/cathook/src/localplayer.h b/cathook/src/localplayer.h index 2600a93f..d78e9f46 100644 --- a/cathook/src/localplayer.h +++ b/cathook/src/localplayer.h @@ -11,7 +11,7 @@ #include "fixsdk.h" #include -class IClientEntity; +class CachedEntity; class LocalPlayer { public: diff --git a/cathook/src/playerresource.cpp b/cathook/src/playerresource.cpp index 1e6c418f..430a2d4b 100644 --- a/cathook/src/playerresource.cpp +++ b/cathook/src/playerresource.cpp @@ -11,7 +11,7 @@ void TFPlayerResource::Update() { m_pEntity = 0; for (int i = 0; i < HIGHEST_ENTITY; i++) { CachedEntity* ent = ENTITY(i); - if (ent && ent->m_iClassID == ClassID::CTFPlayerResource) { + if (CE_GOOD(ent) && ent->m_iClassID == ClassID::CTFPlayerResource) { m_pEntity = ent; } } @@ -21,14 +21,14 @@ int TFPlayerResource::GetMaxHealth(CachedEntity* player) { if (!m_pEntity) return 0; int idx = player->m_IDX; if (idx >= 64 || idx < 0) return 0; - return *(int*)((unsigned int)m_pEntity + netvar.iMaxHealth + 4 * idx); + return *(int*)((unsigned int)RAW_ENT(m_pEntity) + netvar.iMaxHealth + 4 * idx); } int TFPlayerResource::GetMaxBuffedHealth(CachedEntity* player) { if (!m_pEntity) return 0; int idx = player->m_IDX; if (idx >= 64 || idx < 0) return 0; - return *(int*)((unsigned int)m_pEntity + netvar.iMaxBuffedHealth + 4 * idx); + return *(int*)((unsigned int)RAW_ENT(m_pEntity) + netvar.iMaxBuffedHealth + 4 * idx); } diff --git a/cathook/src/prediction.cpp b/cathook/src/prediction.cpp index eb6bb9ad..da875384 100644 --- a/cathook/src/prediction.cpp +++ b/cathook/src/prediction.cpp @@ -10,24 +10,24 @@ #include "common.h" #include "sdk.h" -Vector SimpleLatencyPrediction(IClientEntity* ent, int hb) { - //logging::Info("Simple prediction!"); +// TODO there is a Vector() object created each call. + +Vector SimpleLatencyPrediction(CachedEntity* ent, int hb) { if (!ent) return Vector(); Vector result; GetHitbox(ent, hb, result); float latency = interfaces::engineClient->GetNetChannelInfo()->GetLatency(FLOW_OUTGOING) + interfaces::engineClient->GetNetChannelInfo()->GetLatency(FLOW_INCOMING); - result += NET_VECTOR(ent, netvar.vVelocity) * latency; - //logging::Info("Returning!"); + result += CE_VECTOR(ent, netvar.vVelocity) * latency; return result; } -Vector ProjectilePrediction(IClientEntity* ent, int hb, float speed, float gravitymod) { +Vector ProjectilePrediction(CachedEntity* ent, int hb, float speed, float gravitymod) { if (!ent) return Vector(); - Vector result = ent->GetAbsOrigin(); + Vector result = ent->m_vecOrigin; float dtg = DistanceToGround(result); GetHitbox(ent, hb, result); - Vector vel = NET_VECTOR(ent, netvar.vVelocity); + Vector vel = CE_VECTOR(ent, netvar.vVelocity); // TODO ProjAim /*float tt = g_pLocalPlayer->v_Eye.DistTo(result) + interfaces::engineClient->GetNetChannelInfo()->GetLatency(FLOW_OUTGOING) + interfaces::engineClient->GetNetChannelInfo()->GetLatency(FLOW_INCOMING) - 0.20; @@ -42,7 +42,7 @@ Vector ProjectilePrediction(IClientEntity* ent, int hb, float speed, float gravi float ttt = dtt / speed + interfaces::engineClient->GetNetChannelInfo()->GetLatency(FLOW_OUTGOING) + interfaces::engineClient->GetNetChannelInfo()->GetLatency(FLOW_INCOMING); float oz = result.z; - int flags = NET_INT(ent, netvar.iFlags); + int flags = CE_INT(ent, netvar.iFlags); bool ground = (flags & (1 << 0)); if (!ground) result.z -= ttt * ttt * 400; result += vel * ttt; diff --git a/cathook/src/prediction.h b/cathook/src/prediction.h index 3061ffc0..0fd78add 100644 --- a/cathook/src/prediction.h +++ b/cathook/src/prediction.h @@ -10,11 +10,11 @@ #include "enums.h" -class IClientEntity; +class CachedEntity; class Vector; -Vector SimpleLatencyPrediction(IClientEntity* ent, int hb); -Vector ProjectilePrediction(IClientEntity* ent, int hb, float speed, float gravitymod); +Vector SimpleLatencyPrediction(CachedEntity* ent, int hb); +Vector ProjectilePrediction(CachedEntity* ent, int hb, float speed, float gravitymod); float DistanceToGround(Vector origin);