Merge pull request #9 from nullifiedcat/entity-stuff

entity esp optimization
This commit is contained in:
nullifiedcat 2017-03-19 20:52:08 +03:00 committed by GitHub
commit b49f07e08b
22 changed files with 221 additions and 912 deletions

View File

@ -103,21 +103,10 @@
</tool>
</toolChain>
</folderInfo>
<folderInfo id="cdt.managedbuild.config.gnu.exe.debug.1168214098.488468169" name="/" resourcePath="src">
<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.2016871316" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug" unusedChildren="">
<tool id="cdt.managedbuild.tool.gnu.archiver.base.1644152944" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base.782611349"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.226405435" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.883030293"/>
<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.471297336" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1506529605"/>
<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.932668299" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug.622955675"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.401951277" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.344565173"/>
<tool id="cdt.managedbuild.tool.gnu.assembler.exe.debug.1920346476" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug.1494960833"/>
</toolChain>
</folderInfo>
<sourceEntries>
<entry excluding="source-sdk-2013|autogen|vtables|segvcatch|gui|copypasted|targeting|ipc|mem|hooks|sdk|src" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
<entry excluding="autogen|vtables|segvcatch|gui|targeting|ipc|mem" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
<entry excluding="depr" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/gui"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/ipc"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/segvcatch"/>
</sourceEntries>
</configuration>
@ -171,7 +160,6 @@
<entry excluding="autogen|vtables|segvcatch|gui|hooks|hacks|copypasted|targeting|ipc|mem|sdk" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
<entry excluding="depr" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/gui"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/hooks"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/ipc"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/segvcatch"/>
</sourceEntries>
</configuration>
@ -267,7 +255,6 @@
<entry excluding="autogen|vtables|segvcatch|gui|hooks|targeting|ipc|mem" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
<entry excluding="depr" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/gui"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/hooks"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/ipc"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/segvcatch"/>
</sourceEntries>
</configuration>
@ -361,7 +348,6 @@
<entry excluding="autogen|vtables|segvcatch|gui|hooks|targeting|ipc|mem" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
<entry excluding="depr" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/gui"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/hooks"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/ipc"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/segvcatch"/>
</sourceEntries>
</configuration>

View File

@ -10,7 +10,9 @@
#include "beforecheaders.h"
#include <vector>
#include <string>
#include <array>
#include <functional>
#include "aftercheaders.h"
#include "drawing.h"
#include "entitycache.h"
@ -31,7 +33,6 @@
#include "prediction.h"
#include "conditions.h"
#include "itemtypes.h"
#include "ipc/ipcctl.h"
#include "chatstack.h"
#include "textfile.h"
#include "gui/GUI.h"
@ -75,7 +76,6 @@
#else
#define DEBUG_SEGV false
#endif
#define NO_IPC true
#define STR(c) #c
#if DEBUG_SEGV == true

View File

@ -8,77 +8,45 @@
#include "common.h"
#include "sdk.h"
int g_nStringsSide = 0;
int g_nStringsCenter = 0;
ESPStringCompound* g_pStringsSide;
ESPStringCompound* g_pStringsCenter;
std::array<std::string, 32> side_strings;
std::array<std::string, 32> center_strings;
std::array<int, 32> side_strings_colors { 0 };
std::array<int, 32> center_strings_colors { 0 };
int side_strings_count { 0 };
int center_strings_count { 0 };
void InitStrings() {
g_pStringsSide = new ESPStringCompound[32]();
g_pStringsCenter = new ESPStringCompound[32]();
ResetStrings();
}
void ResetStrings() {
g_nStringsSide = 0;
g_nStringsCenter = 0;
side_strings_count = 0;
center_strings_count = 0;
}
void AddSideString(int fg, const char* fmt, ...) {
if (!g_pStringsSide) return;
if (g_pStringsSide[g_nStringsSide].m_String) {
delete g_pStringsSide[g_nStringsSide].m_String;
}
char* buffer = new char[1024]();
va_list list;
va_start(list, fmt);
vsprintf(buffer, fmt, list);
va_end(list);
if (g_nStringsSide >= 32) {
logging::Info("Can't attach more than %i strings to an entity", 32);
return;
}
g_pStringsSide[g_nStringsSide].m_nColor = fg;
g_pStringsSide[g_nStringsSide].m_String = buffer;
g_pStringsSide[g_nStringsSide].m_bColored = true;
g_nStringsSide++;
void AddSideString(const std::string& string, int color) {
side_strings[side_strings_count] = string;
side_strings_colors[side_strings_count] = color;
side_strings_count++;
}
void DrawStrings() {
int y = 8;
for (int i = 0; i < g_nStringsSide; i++) {
//draw::DrawString(8, y, g_pStringsSide[i].m_Color, g_pStringsSide[i].m_Background, false, g_pStringsSide[i].m_String);
draw::String(fonts::ESP, 8, y, g_pStringsSide[i].m_nColor, 2, g_pStringsSide[i].m_String);
int y { 8 };
for (int i = 0; i < side_strings_count; i++) {
draw::String(fonts::ESP, 8, y, side_strings_colors[i], 2, side_strings[i]);
y += 14;
}
y = draw::height / 2;
for (int i = 0; i < g_nStringsCenter; i++) {
draw::String(fonts::ESP, draw::width / 2, y, g_pStringsCenter[i].m_nColor, 2, g_pStringsCenter[i].m_String);
for (int i = 0; i < center_strings_count; i++) {
draw::String(fonts::ESP, draw::width / 2, y, center_strings_colors[i], 2, center_strings[i]);
y += 14;
}
}
ESPStringCompound::~ESPStringCompound() {
//if (m_String) delete [] m_String;
}
void AddCenterString(int fg, const char* fmt, ...) {
if (g_pStringsCenter[g_nStringsCenter].m_String) {
delete g_pStringsCenter[g_nStringsCenter].m_String;
}
char* buffer = new char[1024]();
va_list list;
va_start(list, fmt);
vsprintf(buffer, fmt, list);
va_end(list);
if (g_nStringsCenter >= 32) {
logging::Info("Can't attach more than %i strings to an entity", 32);
return;
}
g_pStringsCenter[g_nStringsCenter].m_nColor = fg;
g_pStringsCenter[g_nStringsCenter].m_String = buffer;
g_pStringsCenter[g_nStringsCenter].m_bColored = true;
g_nStringsCenter++;
void AddCenterString(const std::string& string, int color) {
center_strings[center_strings_count] = string;
center_strings_colors[center_strings_count] = color;
center_strings_count++;
}
@ -256,12 +224,6 @@ void draw::DrawRect(int x, int y, int w, int h, int color) {
g_ISurface->DrawFilledRect(x, y, x + w, y + h);
}
ESPStringCompound::ESPStringCompound() {
m_String = nullptr;
m_bColored = false;
m_nColor = colors::white;
}
void draw::Initialize() {
fonts::ESP = g_ISurface->CreateFont();
fonts::MENU = g_ISurface->CreateFont();

View File

@ -17,16 +17,6 @@ class CachedEntity;
class Vector;
class IClientEntity;
struct ESPStringCompound {
ESPStringCompound();
~ESPStringCompound();
char* m_String;
bool m_bColored;
int m_nColor;
//Color m_Color;
//Color m_Background;
};
namespace fonts {
extern unsigned long ESP;
@ -67,16 +57,10 @@ int EntityF(CachedEntity* ent);
void InitStrings();
void ResetStrings();
void AddCenterString(int fg, const char* fmt, ...);
void AddSideString(int fg, const char* fmt, ...);
void AddCenterString(const std::string& string, int color = 0xFFFFFFFF);
void AddSideString(const std::string& string, int color = 0xFFFFFFFF);
void DrawStrings();
extern ESPStringCompound* g_pStringsSide;
extern int g_nStringsSide;
extern ESPStringCompound* g_pStringsCenter;
extern int g_nStringsCenter;
namespace draw {
extern int width;

View File

@ -13,8 +13,6 @@
CachedEntity::CachedEntity() {
m_pEntity = nullptr;
m_Strings = new ESPStringCompound[MAX_STRINGS]();
m_nESPStrings = 0;
m_Bones = 0;
m_Bones = new matrix3x4_t[MAXSTUDIOBONES];
m_pHitboxCache = new EntityHitboxCache(this);
@ -23,7 +21,6 @@ CachedEntity::CachedEntity() {
}
CachedEntity::~CachedEntity() {
delete [] m_Strings;
delete [] m_Bones;
delete m_pHitboxCache;
}
@ -40,8 +37,6 @@ void EntityCache::Invalidate() {
void CachedEntity::Update(int idx) {
SEGV_BEGIN
m_ESPOrigin.Zero();
m_IDX = idx;
m_pEntity = g_IEntityList->GetClientEntity(idx);
if (!m_pEntity) {
@ -197,35 +192,6 @@ bool CachedEntity::IsVisible() {
return false;
}
void CachedEntity::AddESPString(const char* fmt, ...) {
if (m_Strings[m_nESPStrings].m_String) {
delete m_Strings[m_nESPStrings].m_String;
}
m_Strings[m_nESPStrings].m_bColored = false;
char* buffer = new char[1024]();
va_list list;
va_start(list, fmt);
vsprintf(buffer, fmt, list);
va_end(list);
if (m_nESPStrings >= MAX_STRINGS) {
logging::Info("Can't attach more than %i strings to an entity", MAX_STRINGS);
return;
}
if (m_nESPStrings < 0) {
logging::Info("Invalid string count !!!");
return;
}
m_Strings[m_nESPStrings].m_String = buffer;
//logging::Info("String: %s", m_Strings[m_nESPStrings].m_String);
m_nESPStrings++;
}
ESPStringCompound& CachedEntity::GetESPString(int idx) {
//if (idx >= 0 && idx < m_nESPStrings) {
return m_Strings[idx];
}
matrix3x4_t* CachedEntity::GetBones() {
if (!m_bBonesSetup) {
m_bBonesSetup = m_pEntity->SetupBones(m_Bones, MAXSTUDIOBONES, 0x100, 0); // gvars->curtime
@ -241,14 +207,6 @@ EntityCache::~EntityCache() {
delete [] m_pArray;
}
void CachedEntity::PruneStrings() {
m_nESPStrings = 0;
}
void EntityCache::PruneStrings() {
for (int i = 0; i < m_nMax && i < MAX_ENTITIES; i++) m_pArray[i].PruneStrings();
}
void EntityCache::Update() {
m_nMax = g_IEntityList->GetHighestEntityIndex();
for (int i = 0; i < m_nMax && i < MAX_ENTITIES; i++) {

View File

@ -16,7 +16,6 @@
struct matrix3x4_t;
class IClientEntity;
struct ESPStringCompound;
struct player_info_s;
struct model_t;
struct mstudiohitboxset_t;
@ -107,9 +106,6 @@ public:
~CachedEntity();
void Update(int idx);
void PruneStrings();
void AddESPString(const char* string, ...);
ESPStringCompound& GetESPString(int idx);
// Entity fields start here.
@ -151,10 +147,6 @@ public:
int m_IDX;
IClientEntity* InternalEntity();
IClientEntity* m_pEntity;
ESPStringCompound* m_Strings;
int m_ESPColorFG;
int m_nESPStrings;
Vector m_ESPOrigin;
Vector m_vecVOrigin;
Vector m_vecVelocity;
Vector m_vecAcceleration;
@ -167,7 +159,6 @@ public:
~EntityCache();
void Update();
void PruneStrings();
void Invalidate();
CachedEntity* GetEntity(int idx);

22
src/entitywrap.cpp Normal file
View File

@ -0,0 +1,22 @@
/*
* entitywrap.cpp
*
* Created on: Mar 18, 2017
* Author: nullifiedcat
*/
#include "entitywrap.h"
#include "common.h"
EntityWrapper::EntityWrapper(int idx) : idx(idx) {}
bool EntityWrapper::good() const {
return idx < g_IEntityList->GetHighestEntityIndex() && g_IEntityList->GetClientEntity(idx);
}
IClientEntity* EntityWrapper::operator ->() const {
IClientEntity* ret = g_IEntityList->GetClientEntity(idx);
if (!ret) throw std::runtime_error("referencing null entity");
return ret;
}

23
src/entitywrap.h Normal file
View File

@ -0,0 +1,23 @@
/*
* entitywrap.h
*
* Created on: Mar 18, 2017
* Author: nullifiedcat
*/
#ifndef ENTITYWRAP_H_
#define ENTITYWRAP_H_
class IClientEntity;
class EntityWrapper {
public:
EntityWrapper(int idx);
bool good() const;
IClientEntity* operator->() const;
const int idx;
};
#endif /* ENTITYWRAP_H_ */

View File

@ -45,8 +45,6 @@
#include "copypasted/CSignature.h"
#include "copypasted/Netvar.h"
#include "CDumper.h"
#include "ipc/ipcctl.h"
#include <KeyValues.h>
/*

View File

@ -136,7 +136,7 @@ void CreateMove() {
}
}
if (CE_GOOD(target_highest)) {
target_highest->m_ESPColorFG = colors::pink;
hacks::shared::esp::SetEntityColor(target_highest, colors::pink);
if (ShouldAim(cmd)) {
last_target = target_highest->m_IDX;
if (g_pLocalPlayer->weapon()->m_iClassID == g_pClassID->CTFCompoundBow) { // There is no Huntsman in TF2C.

View File

@ -45,6 +45,26 @@ CatVar entity_model(CV_SWITCH, "esp_model_name", "0", "Model name ESP", "Model n
CatVar item_weapon_spawners(CV_SWITCH, "esp_weapon_spawners", "1", "Show weapon spawners", "TF2C deathmatch weapon spawners");
CatVar item_adrenaline(CV_SWITCH, "esp_item_adrenaline", "0", "Show Adrenaline", "TF2C adrenaline pills");
std::array<ESPData, 2048> data;
void ResetEntityStrings() {
for (auto& i : data) {
i.string_count = 0;
i.color = 0;
}
}
void SetEntityColor(CachedEntity* entity, int color) {
data[entity->m_IDX].color = color;
}
void AddEntityString(CachedEntity* entity, const std::string& string, int color) {
ESPData& entity_data = data[entity->m_IDX];
entity_data.strings[entity_data.string_count].data = string;
entity_data.strings[entity_data.string_count].color = color;
entity_data.string_count++;
}
const std::string classes[] = {
"Scout",
"Sniper",
@ -58,14 +78,16 @@ const std::string classes[] = {
};
void CreateMove() {
ResetEntityStrings();
int limit = HIGHEST_ENTITY;
if (!buildings && !proj_esp && !item_esp) limit = min(32, HIGHEST_ENTITY);
for (int i = 0; i < limit; i++) {
ProcessEntity(ENTITY(i));
if (ENTITY(i)->m_nESPStrings) {
ENTITY(i)->m_ESPColorFG = colors::EntityF(ENTITY(i));
if (vischeck) {
if (!ENTITY(i)->IsVisible()) ENTITY(i)->m_ESPColorFG = colors::Transparent(ENTITY(i)->m_ESPColorFG);
CachedEntity* ent = ENTITY(i);
ProcessEntity(ent);
if (data[i].string_count) {
SetEntityColor(ent, colors::EntityF(ent));
if (show_distance) {
AddEntityString(ent, format((int)(ENTITY(i)->m_flDistance / 64 * 1.22f), 'm'));
}
}
}
@ -105,8 +127,8 @@ void DrawBox(CachedEntity* ent, int clr, float widthFactor, float addHeight, boo
//draw::DrawString(min(smin.x, smax.x), min(smin.y, smax.y), clr, false, "min");
//draw::DrawString(max(smin.x, smax.x), max(smin.y, smax.y), clr, false, "max");
//draw::DrawString((int)so.x, (int)so.y, draw::white, false, "origin");
ent->m_ESPOrigin.x = so.x + width / 2 + 1;
ent->m_ESPOrigin.y = so.y - height;
data[ent->m_IDX].esp_origin.x = so.x + width / 2 + 1;
data[ent->m_IDX].esp_origin.y = so.y - height;
unsigned char alpha = clr >> 24;
float trf = (float)((float)alpha / 255.0f);
int border = cloak ? colors::Create(160, 160, 160, alpha) : colors::Transparent(colors::black, trf);
@ -128,17 +150,14 @@ void ProcessEntity(CachedEntity* ent) {
if (!enabled) return;
if (CE_BAD(ent)) return;
//if (ent->IsVisible()) ent->AddESPString("VISIBLE");
if (entity_info) {
ent->AddESPString("%s [%i]", RAW_ENT(ent)->GetClientClass()->m_pNetworkName, ent->m_iClassID);
AddEntityString(ent, format(RAW_ENT(ent)->GetClientClass()->m_pNetworkName, " [", ent->m_iClassID, "]"));
if (entity_id) {
ent->AddESPString("%i", ent->m_IDX);
AddEntityString(ent, std::to_string(ent->m_IDX));
}
//ent->AddESPString("Type: %i", ent->m_Type);
if (entity_model) {
const model_t* model = RAW_ENT(ent)->GetModel();
if (model) ent->AddESPString("%s", g_IModelInfo->GetModelName(model));
if (model) AddEntityString(ent, std::string(g_IModelInfo->GetModelName(model)));
}
}
@ -146,10 +165,7 @@ void ProcessEntity(CachedEntity* ent) {
if (ent->m_iClassID == g_pClassID->CTFProjectile_Rocket || ent->m_iClassID == g_pClassID->CTFProjectile_SentryRocket) {
if (proj_rockets) {
if ((int)proj_rockets != 2 || ent->m_bCritProjectile) {
ent->AddESPString("[ ==> ]");
if (show_distance) {
ent->AddESPString("%im", (int)(ent->m_flDistance / 64 * 1.22f));
}
AddEntityString(ent, "[ ==> ]");
}
}
} else if (ent->m_iClassID == g_pClassID->CTFGrenadePipebombProjectile) {
@ -157,22 +173,16 @@ void ProcessEntity(CachedEntity* ent) {
case 0:
if (!proj_pipes) break;
if ((int)proj_pipes == 2 && !ent->m_bCritProjectile) break;
ent->AddESPString("[ (PP) ]");
AddEntityString(ent, "[ (PP) ]");
break;
case 1:
if (!proj_stickies) break;
if ((int)proj_stickies == 2 && !ent->m_bCritProjectile) break;
ent->AddESPString("[ {*} ]");
}
if (show_distance) {
ent->AddESPString("%im", (int)(ent->m_flDistance / 64 * 1.22f));
AddEntityString(ent, "[ {*} ]");
}
} else if (ent->m_iClassID == g_pClassID->CTFProjectile_Arrow) {
if ((int)proj_arrows != 2 || ent->m_bCritProjectile) {
ent->AddESPString("[ >>---> ]");
if (show_distance) {
ent->AddESPString("%im", (int)(ent->m_flDistance / 64 * 1.22f));
}
AddEntityString(ent, "[ >>---> ]");
}
}
}
@ -180,88 +190,68 @@ void ProcessEntity(CachedEntity* ent) {
if (HL2DM) {
if (item_esp && item_dropped_weapons) {
if (CE_BYTE(ent, netvar.hOwner) == (unsigned char)-1) {
int a = ent->m_nESPStrings;
if (ent->m_iClassID == g_pClassID->CWeapon_SLAM) ent->AddESPString("SLAM");
else if (ent->m_iClassID == g_pClassID->CWeapon357) ent->AddESPString(".357");
else if (ent->m_iClassID == g_pClassID->CWeaponAR2) ent->AddESPString("AR2");
else if (ent->m_iClassID == g_pClassID->CWeaponAlyxGun) ent->AddESPString("Alyx Gun");
else if (ent->m_iClassID == g_pClassID->CWeaponAnnabelle) ent->AddESPString("Annabelle");
else if (ent->m_iClassID == g_pClassID->CWeaponBinoculars) ent->AddESPString("Binoculars");
else if (ent->m_iClassID == g_pClassID->CWeaponBugBait) ent->AddESPString("Bug Bait");
else if (ent->m_iClassID == g_pClassID->CWeaponCrossbow) ent->AddESPString("Crossbow");
else if (ent->m_iClassID == g_pClassID->CWeaponShotgun) ent->AddESPString("Shotgun");
else if (ent->m_iClassID == g_pClassID->CWeaponSMG1) ent->AddESPString("SMG");
else if (ent->m_iClassID == g_pClassID->CWeaponRPG) ent->AddESPString("RPG");
if (a != ent->m_nESPStrings) {
ent->m_ESPColorFG = colors::yellow;
if (show_distance) {
ent->AddESPString("%im", (int)(ent->m_flDistance / 64 * 1.22f));
}
int a = data[ent->m_IDX].string_count;
if (ent->m_iClassID == g_pClassID->CWeapon_SLAM) AddEntityString(ent, "SLAM");
else if (ent->m_iClassID == g_pClassID->CWeapon357) AddEntityString(ent, ".357");
else if (ent->m_iClassID == g_pClassID->CWeaponAR2) AddEntityString(ent, "AR2");
else if (ent->m_iClassID == g_pClassID->CWeaponAlyxGun) AddEntityString(ent, "Alyx Gun");
else if (ent->m_iClassID == g_pClassID->CWeaponAnnabelle) AddEntityString(ent, "Annabelle");
else if (ent->m_iClassID == g_pClassID->CWeaponBinoculars) AddEntityString(ent, "Binoculars");
else if (ent->m_iClassID == g_pClassID->CWeaponBugBait) AddEntityString(ent, "Bug Bait");
else if (ent->m_iClassID == g_pClassID->CWeaponCrossbow) AddEntityString(ent, "Crossbow");
else if (ent->m_iClassID == g_pClassID->CWeaponShotgun) AddEntityString(ent, "Shotgun");
else if (ent->m_iClassID == g_pClassID->CWeaponSMG1) AddEntityString(ent, "SMG");
else if (ent->m_iClassID == g_pClassID->CWeaponRPG) AddEntityString(ent, "RPG");
if (a != data[ent->m_IDX].string_count) {
SetEntityColor(ent, colors::yellow);
}
}
}
}
if (ent->m_iClassID == g_pClassID->CTFTankBoss && tank) {
ent->AddESPString("Tank");
AddEntityString(ent, "Tank");
} else if (ent->m_iClassID == g_pClassID->CTFDroppedWeapon && item_esp && item_dropped_weapons) {
ent->AddESPString("WEAPON %s", ent->m_pEntity->GetClientClass()->GetName());
if (show_distance) {
ent->AddESPString("%im", (int)(ent->m_flDistance / 64 * 1.22f));
}
AddEntityString(ent, format("WEAPON ", ent->m_pEntity->GetClientClass()->GetName()));
} else if (ent->m_iClassID == g_pClassID->CCurrencyPack && item_money) {
if (CE_BYTE(ent, netvar.bDistributed)) {
if (item_money_red) {
ent->AddESPString("$$$");
ent->AddESPString("%im", (int)(ent->m_flDistance / 64 * 1.22f));
AddEntityString(ent, "~$~");
}
} else {
ent->AddESPString("$$$");
ent->AddESPString("%im", (int)(ent->m_flDistance / 64 * 1.22f));
AddEntityString(ent, "$$$");
}
} else if (ent->m_ItemType != ITEM_NONE && item_esp) {
bool shown = false;
if (item_health_packs && (ent->m_ItemType >= ITEM_HEALTH_SMALL && ent->m_ItemType <= ITEM_HEALTH_LARGE || ent->m_ItemType == ITEM_HL_BATTERY)) {
if (ent->m_ItemType == ITEM_HEALTH_SMALL) ent->AddESPString("[+]");
if (ent->m_ItemType == ITEM_HEALTH_MEDIUM) ent->AddESPString("[++]");
if (ent->m_ItemType == ITEM_HEALTH_LARGE) ent->AddESPString("[+++]");
if (ent->m_ItemType == ITEM_HL_BATTERY) ent->AddESPString("[Z]");
if (ent->m_ItemType == ITEM_HEALTH_SMALL) AddEntityString(ent, "[+]");
if (ent->m_ItemType == ITEM_HEALTH_MEDIUM) AddEntityString(ent, "[++]");
if (ent->m_ItemType == ITEM_HEALTH_LARGE) AddEntityString(ent, "[+++]");
if (ent->m_ItemType == ITEM_HL_BATTERY) AddEntityString(ent, "[Z]");
} else if (item_adrenaline && ent->m_ItemType == ITEM_TF2C_PILL) {
ent->AddESPString("[a]");
AddEntityString(ent, "[a]");
} else if (item_ammo_packs && ent->m_ItemType >= ITEM_AMMO_SMALL && ent->m_ItemType <= ITEM_AMMO_LARGE) {
if (ent->m_ItemType == ITEM_AMMO_SMALL) ent->AddESPString("{i}");
if (ent->m_ItemType == ITEM_AMMO_MEDIUM) ent->AddESPString("{ii}");
if (ent->m_ItemType == ITEM_AMMO_LARGE) ent->AddESPString("{iii}");
if (ent->m_ItemType == ITEM_AMMO_SMALL) AddEntityString(ent, "{i}");
if (ent->m_ItemType == ITEM_AMMO_MEDIUM) AddEntityString(ent, "{ii}");
if (ent->m_ItemType == ITEM_AMMO_LARGE) AddEntityString(ent, "{iii}");
} else if (item_powerups && ent->m_ItemType >= ITEM_POWERUP_FIRST && ent->m_ItemType <= ITEM_POWERUP_LAST) {
ent->AddESPString("%s PICKUP", powerups[ent->m_ItemType - ITEM_POWERUP_FIRST]);
AddEntityString(ent, format(powerups[ent->m_ItemType - ITEM_POWERUP_FIRST], " PICKUP"));
} else if (item_weapon_spawners && ent->m_ItemType >= ITEM_TF2C_W_FIRST && ent->m_ItemType <= ITEM_TF2C_W_LAST) {
ent->AddESPString("%s SPAWNER", tf2c_weapon_names[ent->m_ItemType - ITEM_TF2C_W_FIRST].c_str());
if (CE_BYTE(ent, netvar.bRespawning)) ent->AddESPString("-- RESPAWNING --");
}
if (show_distance && shown) {
ent->AddESPString("%im", (int)(ent->m_flDistance / 64 * 1.22f));
AddEntityString(ent, format(tf2c_weapon_names[ent->m_ItemType - ITEM_TF2C_W_FIRST], " SPAWNER"));
if (CE_BYTE(ent, netvar.bRespawning)) AddEntityString(ent, "-- RESPAWNING --");
}
} else if (ent->m_Type == ENTITY_BUILDING && buildings) {
if (!ent->m_bEnemy && !teammates) return;
int level = CE_INT(ent, netvar.iUpgradeLevel);
const char* name = (ent->m_iClassID == g_pClassID->CObjectTeleporter ? "Teleporter" : (ent->m_iClassID == g_pClassID->CObjectSentrygun ? "Sentry Gun" : "Dispenser"));
const std::string& name = (ent->m_iClassID == g_pClassID->CObjectTeleporter ? "Teleporter" : (ent->m_iClassID == g_pClassID->CObjectSentrygun ? "Sentry Gun" : "Dispenser"));
if (legit && ent->m_iTeam != g_pLocalPlayer->team) {
/*if (ent->m_lLastSeen > v_iLegitSeenTicks->GetInt()) {
return;
}*/
}
ent->AddESPString("LV %i %s", level, name);
AddEntityString(ent, format("LV ", level, ' ', name));
if (show_health) {
ent->AddESPString("%i / %i HP", ent->m_iHealth, ent->m_iMaxHealth);
ent->GetESPString(ent->m_nESPStrings - 1).m_bColored = true;
if (vischeck) {
ent->GetESPString(ent->m_nESPStrings - 1).m_nColor = colors::Transparent(colors::Health(ent->m_iHealth, ent->m_iMaxHealth), ent->IsVisible() ? 1.0 : 0.5f);
} else {
ent->GetESPString(ent->m_nESPStrings - 1).m_nColor = colors::Health(ent->m_iHealth, ent->m_iMaxHealth);
}
}
if (show_distance) {
ent->AddESPString("%im", (int)(ent->m_flDistance / 64 * 1.22f));
AddEntityString(ent, format(ent->m_iHealth, '/', ent->m_iMaxHealth, " HP"), colors::Health(ent->m_iHealth, ent->m_iMaxHealth));
}
return;
} else if (ent->m_Type == ENTITY_PLAYER && ent->m_bAlivePlayer) {
@ -280,44 +270,35 @@ void ProcessEntity(CachedEntity* ent) {
}*/
}
if (power >= 0 && (ent->m_bEnemy || teammates)) {
ent->AddESPString("HAS [%s]", powerups[power]);
AddEntityString(ent, format("HAS ", powerups[power]));
}
if (ent->m_bEnemy || teammates || GetRelation(ent)) {
if (show_name)
ent->AddESPString("%s", info.name);
AddEntityString(ent, std::string(info.name));
if (show_class) {
if (pclass > 0 && pclass < 10)
ent->AddESPString("%s", classes[pclass - 1].c_str());
AddEntityString(ent, classes[pclass - 1]);
}
if (show_health) {
ent->AddESPString("%i / %i HP", ent->m_iHealth, ent->m_iMaxHealth);
ent->GetESPString(ent->m_nESPStrings - 1).m_bColored = true;
if (vischeck) {
ent->GetESPString(ent->m_nESPStrings - 1).m_nColor = colors::Transparent(colors::Health(ent->m_iHealth, ent->m_iMaxHealth), ent->IsVisible() ? 1.0 : 0.5f);
} else {
ent->GetESPString(ent->m_nESPStrings - 1).m_nColor = colors::Health(ent->m_iHealth, ent->m_iMaxHealth);
}
AddEntityString(ent, format(ent->m_iHealth, '/', ent->m_iMaxHealth, " HP"), colors::Health(ent->m_iHealth, ent->m_iMaxHealth));
}
if (show_conditions && TF) {
if (IsPlayerInvisible(ent)) {
ent->AddESPString("INVISIBLE");
AddEntityString(ent, "INVISIBLE");
}
if (IsPlayerInvulnerable(ent)) {
ent->AddESPString("INVULNERABLE");
AddEntityString(ent, "INVULNERABLE");
}
if (HasCondition(ent, TFCond_UberBulletResist)) {
ent->AddESPString("VACCINATOR ACTIVE");
AddEntityString(ent, "VACCINATOR ACTIVE");
}
if (HasCondition(ent, TFCond_SmallBulletResist)) {
ent->AddESPString("VACCINATOR PASSIVE");
AddEntityString(ent, "VACCINATOR PASSIVE");
}
if (IsPlayerCritBoosted(ent)) {
ent->AddESPString("CRIT BOOSTED");
AddEntityString(ent, "CRIT BOOSTED");
}
}
if (show_distance) {
ent->AddESPString("%im", (int)(ent->m_flDistance / 64 * 1.22f));
}
}
return;
}
@ -329,7 +310,9 @@ void ProcessEntityPT(CachedEntity* ent) {
if (CE_BAD(ent)) return;
if (!(local_esp && g_IInput->CAM_IsThirdPerson()) &&
ent->m_IDX == g_IEngine->GetLocalPlayer()) return;
int fg = ent->m_ESPColorFG;
const ESPData& ent_data = data[ent->m_IDX];
int fg = ent_data.color;
bool transparent { false };
switch (ent->m_Type) {
case ENTITY_PLAYER: {
bool cloak = IsPlayerInvisible(ent);
@ -339,9 +322,11 @@ void ProcessEntityPT(CachedEntity* ent) {
return;
}*/
}
if (!ent->m_bEnemy && !teammates && !GetRelation(ent)) break;
if (!ent->m_bAlivePlayer) break;
if (vischeck && !ent->IsVisible()) transparent = true;
if (transparent) fg = colors::Transparent(fg);
DrawBox(ent, fg, 3.0f, -15.0f, true, CE_INT(ent, netvar.iHealth), ent->m_iMaxHealth);
break;
}
@ -352,10 +337,35 @@ void ProcessEntityPT(CachedEntity* ent) {
}*/
}
if (CE_INT(ent, netvar.iTeamNum) == g_pLocalPlayer->team && !teammates) break;
if (!transparent && vischeck && !ent->IsVisible()) transparent = true;
if (transparent) fg = colors::Transparent(fg);
DrawBox(ent, fg, 1.0f, 0.0f, true, CE_INT(ent, netvar.iBuildingHealth), CE_INT(ent, netvar.iBuildingMaxHealth));
break;
}
}
if (ent_data.string_count) {
Vector screen;
bool origin_is_zero = ent_data.esp_origin.IsZero(1.0f);
if (!origin_is_zero || draw::EntityCenterToScreen(ent, screen)) {
if (vischeck && !ent->IsVisible()) transparent = true;
Vector draw_point = origin_is_zero ? screen : ent_data.esp_origin;
for (int j = 0; j < ent_data.string_count; j++) {
const ESPString& string = ent_data.strings[j];
int color = string.color ? string.color : ent_data.color;
if (transparent) color = colors::Transparent(color);
if (!origin_is_zero) {
draw::String(fonts::ESP, draw_point.x, draw_point.y, color, 2, string.data);
draw_point.y += 11;
} else {
auto l = draw::GetStringLength(fonts::ESP, string.data);
draw::String(fonts::ESP, draw_point.x - l.first / 2, draw_point.y, color, 2, string.data);
draw_point.y += 11;
}
}
}
}
}
}}}

View File

@ -13,6 +13,13 @@
class ConVar;
class CachedEntity;
#include "../sdk.h" // VECTOR
#include "../beforecheaders.h"
#include <array>
#include <string>
#include "../aftercheaders.h"
namespace hacks { namespace shared { namespace esp {
extern CatVar local_esp;
@ -47,6 +54,25 @@ extern CatVar entity_model;
extern CatVar item_weapon_spawners;
extern CatVar item_adrenaline;
class ESPString {
public:
std::string data { "" };
int color { 0 };
};
class ESPData {
public:
int color { 0 };
int string_count { 0 };
std::array<ESPString, 16> strings {};
Vector esp_origin { 0, 0, 0 };
};
extern std::array<ESPData, 2048> data;
void ResetEntityStrings();
void AddEntityString(CachedEntity* entity, const std::string& string, int color = 0x0);
void SetEntityColor(CachedEntity* entity, int color);
void CreateMove();
void Draw();

View File

@ -1,404 +0,0 @@
/*
* HPyroBot.cpp
*
* Created on: Oct 30, 2016
* Author: nullifiedcat
*/
/*
#include "FollowBot.h"
#include <signal.h>
#include "../common.h"
#include "../ipc/ipcctl.h"
#include "../sdk.h"
DEFINE_HACK_SINGLETON(FollowBot);
unsigned long g_nTick = 0;
const char* FollowBot::GetName() {
return "FOLLOWBOT";
}
// TODO
bool FollowBot::ShouldPopUber(bool force) {
int health_my = g_pLocalPlayer->health;
//int health_tr = NET_INT(ENTITY(this->m_hTargetHealing), eoffsets.iHealth);
if (health_my < 30) return true;
//bool other_bots_have_uber = false;
for (int i = 0; i < 64 && i < HIGHEST_ENTITY; i++) {
CachedEntity* ent = ENTITY(i);
if (ent == g_pLocalPlayer->entity) continue;
if (IsFriendlyBot(ent)) {
if (CE_BYTE(ent, netvar.iLifeState)) continue;
//IClientEntity* medigun;
// TODO
}
}
return false;
}
class MedicCallListener : public IGameEventListener2 {
public:
MedicCallListener() {}
void FireGameEvent(IGameEvent* pEvent) {
if (!g_phFollowBot->v_bEnabled->GetBool()) return;
if (strcmp("player_calledformedic", pEvent->GetName())) return;
int id = engineClient->GetPlayerForUserID(pEvent->GetInt("userid", -1));
logging::Info("%i called for medic");
player_info_s info;
engineClient->GetPlayerInfo(id, &info);
if (info.friendsID == g_phFollowBot->m_nOwnerID) {
g_phFollowBot->m_iShouldUbercharge = 1;
}
}
};
void CC_ResetList(const CCommand& args) {
g_phFollowBot->ResetBotList();
}
MedicCallListener* g_pListener;
// TODO
void FollowBot::ProcessEntity(CachedEntity* entity, bool enemy) {
return;
}
/*
* pick target
* if can't pick target:
* forward
* follow
* if can't follow:
* goto pick target
* if at shooting distance:
* shoot
*//*
// TODO
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;
}
if (!notrace) {
bool a = false;
for (int i = 0; i < 17; i++) {
if (IsEntityVisible(ent, i)) a = true;
}
if (!a) return 6;
}
return 0;
}
void FollowBot::Tick(CUserCmd* cmd) {
if (CE_BAD(g_pLocalPlayer->entity)) return;
if (g_pLocalPlayer->life_state) return;
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 (CE_BAD(owner_entity)) return;
if (m_iForceHealTicks && m_iForceHealTicks < 20) {
m_iForceHealTicks++;
cmd->buttons |= IN_ATTACK;
} else m_iForceHealTicks = 0;
switch (v_iBotPackage->GetInt()) {
case botpackage::BOT_FOLLOW: {
break;
}
case botpackage::BOT_MEDIC: {
cmd->buttons |= IN_ATTACK;
if ((g_nTick % 100) == 0) {
engineClient->ExecuteClientCmd("slot2");
cmd->buttons &= ~IN_ATTACK;
}
if (this->m_iShouldUbercharge && this->m_iShouldUbercharge < 30) {
cmd->buttons |= IN_ATTACK2;
engineClient->ExecuteClientCmd("voicemenu 2 1");
this->m_iShouldUbercharge++;
} else {
this->m_iShouldUbercharge = 0;
}
break;
}
case botpackage::BOT_SNIPER: {
if (!owner_entity) break;
//bool owner_zoomed = (NET_INT(owner_entity, eoffsets.iCond) & cond::zoomed);
//
CachedEntity* owner_weapon = ENTITY(CE_INT(owner_entity, netvar.hActiveWeapon) & 0xFFF);
if (CE_GOOD(owner_weapon)) {
if (owner_weapon->m_iClassID == g_pClassID->CTFSniperRifle || owner_weapon->m_iClassID == g_pClassID->CTFSniperRifle) {
if (!g_pLocalPlayer->bZoomed) {
cmd->buttons |= IN_ATTACK2;
}
} else {
if (g_pLocalPlayer->bZoomed) {
cmd->buttons |= IN_ATTACK2;
}
}
}
break;
}
}
if (v_iBotPackage->GetInt() == botpackage::BOT_DUMMY) return;
if (v_iBotPackage->GetInt() == botpackage::BOT_MEDIC) {
CachedEntity* healtr = this->GetBestHealingTarget();
m_hTargetHealing = (healtr ? healtr->m_IDX : 0);
if (healtr) {
if (CE_INT(healtr, netvar.iHealth) < 35 && !CE_BYTE(healtr, netvar.iLifeState)) {
m_iShouldUbercharge = 1;
}
if (g_pLocalPlayer->health < 35) {
m_iShouldUbercharge = 1;
}
}
}
if (owner_entity && (0 == (g_nTick % 20))) {
static bool forward = false;
static bool jump = false;
if (!jump && CE_VECTOR(g_pLocalPlayer->entity, netvar.vVelocity).IsZero(10.0f) && !g_pLocalPlayer->bZoomed) {
engineClient->ExecuteClientCmd("+jump");
jump = true;
} else if (jump) {
engineClient->ExecuteClientCmd("-jump");
jump = false;
}
if (forward && DistToSqr(owner_entity) < (60 * 60)) {
engineClient->ExecuteClientCmd("-forward");
forward = false;
} else if (!forward) {
engineClient->ExecuteClientCmd("+forward");
forward = true;
}
}
return;
}
void FollowBot::ActuallyCreateMove(CUserCmd* cmd) {
CachedEntity* tr_follow = ENTITY(this->m_hTargetFollowing);
QAngle angles = VectorToQAngle(cmd->viewangles);
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) {
CachedEntity* tr_heal = ENTITY(this->m_hTargetHealing);
if (CE_GOOD(tr_heal)) {
AimAtHitbox(tr_heal, 4, cmd);
g_pLocalPlayer->bUseSilentAngles = true;
}
}
engineClient->SetViewAngles(angles);
}
// TODO optimize, cache or something
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(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 (ent->m_pPlayerInfo->friendsID == this->m_OtherBots[i]) return true;
}
return false;
}
CachedEntity* FollowBot::GetBestHealingTarget() {
CachedEntity* best = 0;
int best_score = -65536;
for (int i = 0; i < 64 && i < HIGHEST_ENTITY; i++) {
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) {
best = cur;
best_score = score;
}
}
}
return best;
}
bool FollowBot::CreateMove(void*, float, CUserCmd* cmd) {
if (!v_bEnabled->GetBool()) return true;
Tick(cmd);
g_nTick++;
this->ActuallyCreateMove(cmd);
return false;
}
int FollowBot::GetHealingPriority(CachedEntity* ent) {
if (!ent) return 0;
int result = 0;
if (ent->m_bEnemy) return 0;
if (!ent->m_bAlivePlayer) return 0;
if (!IsEntityVisible(ent, 4)) return 0;
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->m_flDistance > 1000) return 0;
if (this->IsFriendlyBot(ent)) {
// Friendly bot medics must be constantly at 100%+ hp
if (healthp < 0.75) {
result += 60;
}
result += (maxbuffedhealth - health);
} else if (this->IsOwner(ent)) {
if (overhealp > 0.75) result -= 25;
result += (maxbuffedhealth - health) * 1.25;
} else {
result += (maxhealth - health);
if (result > 50) result = 50;
}
//logging::Info("idx %i score %i | HP %i MH %i MBH %i MO %i O %i", ent->entindex(), result, health, maxhealth, maxbuffedhealth, maxoverheal, overheal);
return result;
}
void FollowBot::AddBotID(uint32 id) {
logging::Info("Added bot: %lu", id);
this->m_OtherBots[this->m_nOtherBots++] = id;
}
void FollowBot::SetOwner(uint32 id) {
logging::Info("Owner set: %lu", id);
this->m_nOwnerID = id;
}
// TODO
void CC_BotStatus(const CCommand& args) {
//logging::Info("Bot Status: %i, ID: %i, Search: %i", g_bState, g_nTargetID, nPilotSearch);
}
void CC_AddBotID(const CCommand& args) {
if (args.ArgC() < 1) return;
uint32 id = strtoul(args.Arg(1), 0, 0);
if (!id) return;
g_phFollowBot->AddBotID(id);
}
void CC_SetOwner(const CCommand& args) {
if (args.ArgC() < 1) return;
uint32 id = strtoul(args.Arg(1), 0, 0);
if (!id) return;
g_phFollowBot->m_nOwnerID = id;
}
void CC_HealOwner(const CCommand& args) {
g_phFollowBot->m_hTargetHealing = g_phFollowBot->m_nOwnerID;
g_phFollowBot->m_iForceHealTicks = 1;
}
void CC_BotCommand(const CCommand& args) {
if (args.ArgC() < 2) return;
int bot_id = strtol(args.Arg(1), 0, 0);
char* buf = new char[256];
for (int i = 2; i < args.ArgC(); i++) {
strcat(buf, strfmt("%s ", args.Arg(i)));
}
if (!bot_id) {
logging::Info("Executing command `%s` on EACH bot.", buf);
} else {
logging::Info("Executing command `%s` on bot %i.", buf, bot_id);
}
g_phFollowBot->m_pIPC->SetCommand(bot_id, (char*)buf);
delete [] buf;
}
void CC_IPCList(const CCommand& args) {
for (int i = 1; i < MAX_SEGS; i++) {
ipc_client_seg seg = g_phFollowBot->m_pIPC->mem->segments[i];
if (seg.initialized && (time(0) - seg.last_access_time < ACCESS_TIMEOUT)) {
if (kill(seg.owner_pid, 0) == -1) {
if (errno == ESRCH) continue;
}
logging::Info("[%i]: pid=%i name=`%s`", i, seg.owner_pid, seg.name);
}
}
}
FollowBot::FollowBot() {
v_bEnabled = CreateConVar(CON_PREFIX "bot_enabled", "0", "Enables followbot");
v_iBotPackage = CreateConVar(CON_PREFIX "bot_ai", "0", "AI Package (FOLLOW, MEDIC, SNIPER)");
c_AddBotID = CreateConCommand(CON_PREFIX "bot_addbot", CC_AddBotID, "Adds another bot's ID");
c_SetOwner = CreateConCommand(CON_PREFIX "bot_owner", CC_SetOwner, "Set followbot owner");
c_ResetList = CreateConCommand(CON_PREFIX "bot_reset", CC_ResetList, "Resets bot list");
c_BotCommand = CreateConCommand(CON_PREFIX "bot_command", CC_BotCommand, "Sends bot commands");
c_IPCList = CreateConCommand(CON_PREFIX "bot_ipclist", CC_IPCList, "Lists IPC status");
c_HealOwner = CreateConCommand(CON_PREFIX "bot_healowner", CC_HealOwner, "Heals owner");
m_nOwnerID = 0;
this->last_command_global = 0;
this->last_command_local = 0;
m_hTargetFollowing = 0;
m_hTargetHealing = 0;
cmd_Status = CreateConCommand(CON_PREFIX "bot_status", CC_BotStatus, "Status");
g_pListener = new MedicCallListener();
eventManager->AddListener(g_pListener, "player_calledformedic", false);
logging::Info("Creating shared memory for bot");
m_pIPC = new ipcctl();
if (m_pIPC->Init()) {
logging::Info("Successfully allocated shared memory!");
logging::Info("Bot ID: %i", m_pIPC->client_id);
} else {
logging::Info("Failed to allocate shared memory for bot.");
}
}
FollowBot::~FollowBot() {
eventManager->RemoveListener(g_pListener);
m_pIPC->Detach();
}
void FollowBot::PaintTraverse(void*, unsigned int, bool, bool) {}
void FollowBot::LevelInit(const char*) {}
void FollowBot::LevelShutdown() {}
*/

View File

@ -1,73 +0,0 @@
/*
* HPyroBot.h
*
* Created on: Oct 30, 2016
* Author: nullifiedcat
*/
#ifndef HPYROBOT_H_
#define HPYROBOT_H_
#include "IHack.h"
/*
class ipcctl;
class IClientEntity;
void CC_ResetList(const CCommand& args);
void CC_AddBotID(const CCommand& args);
void CC_BotStatus(const CCommand& args);
void CC_SetOwner(const CCommand& args);
enum botpackage {
BOT_FOLLOW = 0,
BOT_MEDIC,
BOT_SNIPER,
BOT_DUMMY
};
class FollowBot : public IHack {
public:
DECLARE_HACK_METHODS();
FollowBot();
~FollowBot();
void ProcessEntity(CachedEntity* entity, bool enemy);
void Tick(CUserCmd*);
int ShouldNotTarget(CachedEntity* ent, bool notrace);
bool ShouldPopUber(bool force);
void ActuallyCreateMove(CUserCmd*);
CachedEntity* GetBestHealingTarget();
int GetHealingPriority(CachedEntity* ent);
bool IsFriendlyBot(CachedEntity* ent);
bool IsOwner(CachedEntity* ent);
void ResetBotList();
void AddBotID(uint32 id);
void SetOwner(uint32 id);
void UpdateOwner();
int m_hTargetFollowing;
int m_hTargetHealing;
ConCommand* cmd_Status;
ConVar* v_bEnabled;
int m_iForceHealTicks;
int m_iShouldUbercharge;
ConVar* v_iBotPackage;
ConCommand* c_AddBotID;
ConCommand* c_SetOwner;
ConCommand* c_ResetList;
ConCommand* c_HealOwner;
ConCommand* c_BotCommand;
ConCommand* c_IPCList;
uint32 m_nOwnerID;
uint32 m_OtherBots[32];
uint32 m_nOtherBots;
ipcctl* m_pIPC;
unsigned last_command_global;
unsigned last_command_local;
};
DECLARE_HACK_SINGLETON(FollowBot)
*/
#endif /* HPYROBOT_H_ */

View File

@ -41,11 +41,11 @@ const std::string tf_teams_killsay[] = {
TextFile file {};
std::string ComposeKillSay(IGameEvent* event) {
if (file.LineCount() == 0) return 0;
if (!event) return 0;
if (file.LineCount() == 0) return "";
if (!event) return "";
int vid = event->GetInt("userid");
int kid = event->GetInt("attacker");
if (kid == vid) return 0;
if (kid == vid) return "";
if (g_IEngine->GetPlayerForUserID(kid) != g_IEngine->GetLocalPlayer()) return 0;
std::string msg = file.Line(rand() % file.LineCount());
player_info_s info;

View File

@ -59,25 +59,25 @@ void CreateMove() {
void Draw() {
if (crit_info && CE_GOOD(LOCAL_W)) {
if (crit_hack) {
AddCenterString(colors::red, "FORCED CRITS: ON");
AddCenterString("FORCED CRITS!", colors::red);
}
if (TF2) {
if (!vfunc<bool(*)(IClientEntity*)>(RAW_ENT(LOCAL_W), 465, 0)(RAW_ENT(LOCAL_W)))
AddCenterString(colors::white, "Random crits are disabled");
AddCenterString("Random crits are disabled", colors::yellow);
else {
if (!vfunc<bool(*)(IClientEntity*)>(RAW_ENT(LOCAL_W), 465 + 21, 0)(RAW_ENT(LOCAL_W)))
AddCenterString(colors::white, "Weapon can't randomly crit");
AddCenterString("Weapon can't randomly crit", colors::yellow);
else
AddCenterString(colors::white, "Weapon can randomly crit");
AddCenterString("Weapon can randomly crit");
}
AddCenterString(colors::white, "Bucket: %.2f", *(float*)((uintptr_t)RAW_ENT(LOCAL_W) + 2612u));
AddCenterString(format("Bucket: %.2f", *(float*)((uintptr_t)RAW_ENT(LOCAL_W) + 2612u)));
}
}
if (!debug_info) return;
if (CE_GOOD(g_pLocalPlayer->weapon())) {
AddSideString(colors::white, "Weapon: %s [%i]", RAW_ENT(g_pLocalPlayer->weapon())->GetClientClass()->GetName(), g_pLocalPlayer->weapon()->m_iClassID);
/*AddSideString(colors::white, "Weapon: %s [%i]", RAW_ENT(g_pLocalPlayer->weapon())->GetClientClass()->GetName(), g_pLocalPlayer->weapon()->m_iClassID);
//AddSideString(colors::white, "flNextPrimaryAttack: %f", CE_FLOAT(g_pLocalPlayer->weapon(), netvar.flNextPrimaryAttack));
//AddSideString(colors::white, "nTickBase: %f", (float)(CE_INT(g_pLocalPlayer->entity, netvar.nTickBase)) * gvars->interval_per_tick);
AddSideString(colors::white, "CanShoot: %i", CanShoot());
@ -118,7 +118,7 @@ void Draw() {
//AddSideString(draw::white, draw::black, "VecPunchAngle: %f %f %f", pa.x, pa.y, pa.z);
//draw::DrawString(10, y, draw::white, draw::black, false, "VecPunchAngleVel: %f %f %f", pav.x, pav.y, pav.z);
//y += 14;
//AddCenterString(draw::font_handle, input->GetAnalogValue(AnalogCode_t::MOUSE_X), input->GetAnalogValue(AnalogCode_t::MOUSE_Y), draw::white, L"S\u0FD5");
//AddCenterString(draw::font_handle, input->GetAnalogValue(AnalogCode_t::MOUSE_X), input->GetAnalogValue(AnalogCode_t::MOUSE_Y), draw::white, L"S\u0FD5");*/
}
}

View File

@ -26,9 +26,9 @@ void Draw() {
if (CE_INT(ent, netvar.iTeamNum) == g_pLocalPlayer->team) continue;
float distance = ent->m_flDistance;
if (distance < (float)distance_backstab) {
AddCenterString(colors::red, "BACKSTAB WARNING! %im", (int)(distance / 64 * 1.22f));
AddCenterString(format("BACKSTAB WARNING! ", (int)(distance / 64 * 1.22f), 'm'), colors::red);
} else if (distance < (float)distance_warning) {
AddCenterString(colors::yellow, "Incoming spy! %im", (int)(distance / 64 * 1.22f));
AddCenterString(format("Incoming spy! ", (int)(distance / 64 * 1.22f), 'm'), colors::yellow);
}
}
}

View File

@ -75,7 +75,7 @@ bool CreateMove_hook(void* thisptr, float inputSample, CUserCmd* cmd) {
bool time_replaced = false;
float curtime_old = g_GlobalVars->curtime;;
if (CE_GOOD(g_pLocalPlayer->entity)) {
if (!g_Settings.bInvalid &&CE_GOOD(g_pLocalPlayer->entity)) {
float servertime = (float)CE_INT(g_pLocalPlayer->entity, netvar.nTickBase) * g_GlobalVars->interval_per_tick;
g_GlobalVars->curtime = servertime;
time_replaced = true;
@ -91,7 +91,6 @@ bool CreateMove_hook(void* thisptr, float inputSample, CUserCmd* cmd) {
g_Settings.bInvalid = false;
// Disabled because this causes EXTREME aimbot inaccuracy
//if (!cmd->command_number) return ret;
gEntityCache.PruneStrings();
if (CE_GOOD(g_pLocalPlayer->entity)) {
g_pLocalPlayer->v_OrigViewangles = cmd->viewangles;
// PROF_BEGIN();

View File

@ -82,32 +82,13 @@ void PaintTraverse_hook(void* p, unsigned int vp, bool fr, bool ar) {
draw_flag = false;
if (logo) {
AddSideString(colors::RainbowCurrent(), "cathook by d4rkc4t");
AddSideString("cathook by d4rkc4t", colors::RainbowCurrent());
}
if (CE_GOOD(g_pLocalPlayer->entity) && !g_Settings.bInvalid) {
if (TF) SAFE_CALL(hacks::tf2::antidisguise::Draw());
SAFE_CALL(hacks::shared::misc::Draw());
SAFE_CALL(hacks::shared::esp::Draw());
if (TF) SAFE_CALL(hacks::tf::spyalert::Draw());
Vector screen;
for (int i = 0; i < HIGHEST_ENTITY; i++) {
CachedEntity* ce = gEntityCache.GetEntity(i);
if (CE_BAD(ce)) continue;
if (ce->m_ESPOrigin.IsZero(1.0f))
if (!draw::EntityCenterToScreen(ce, screen)) continue;
for (int j = 0; j < ce->m_nESPStrings; j++) {
ESPStringCompound str = ce->GetESPString(j);
int color = str.m_bColored ? str.m_nColor : ce->m_ESPColorFG;
if (!ce->m_ESPOrigin.IsZero(1.0)) {
draw::String(fonts::ESP, ce->m_ESPOrigin.x, ce->m_ESPOrigin.y, color, 2, str.m_String);
ce->m_ESPOrigin.y += 12;
} else {
auto l = draw::GetStringLength(fonts::ESP, std::string(str.m_String));
draw::String(fonts::ESP, screen.x - l.first / 2, screen.y, color, 2, str.m_String);
screen.y += 11;
}
}
}
}
#if GUI_ENABLED == true

View File

@ -1,107 +0,0 @@
/*
* ipcctl.cpp
*
* Created on: Nov 23, 2016
* Author: nullifiedcat
*/
#include "../ipc/ipcctl.h"
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <steam/isteamfriends.h>
#include <sys/ipc.h>
#include <errno.h>
#include <sys/shm.h>
#include <signal.h>
#include "../logging.h"
#include "../interfaces.h"
bool ipcctl::Init() {
broken = true;
key = 0x0D34DC47;
logging::Info("IPC Total Size: %i", sizeof(ipc_mem_layout));
shmid = shmget(key, sizeof(ipc_mem_layout), 0666 | IPC_CREAT);
if (shmid == -1) {
logging::Info("shmget error: %i", errno);
return false;
}
mem = (ipc_mem_layout*)shmat(shmid, (void*)0, 0);
if (mem == (ipc_mem_layout*)-1) {
logging::Info("shmat error: %i", errno);
return false;
}
client_id = NextClientID();
memset(&mem->segments[client_id], 0, sizeof(ipc_client_seg));
mem->segments[client_id].initialized = true;
mem->segments[client_id].owner_pid = getpid();
mem->segments[client_id].command_number = 0;
memcpy(mem->segments[client_id].name, g_ISteamFriends->GetPersonaName(), 32);
if (client_id == -1) return false;
broken = false;
return true;
}
int ipcctl::NextClientID() {
/* Segment 0 is reserved for broadcast commands */
for (int i = 1; i < MAX_SEGS; i++) {
ipc_client_seg seg = mem->segments[i];
if (seg.initialized) {
logging::Info("Segment %i is owned by `%s`, PID %i", i, seg.name, seg.owner_pid);
if (kill(seg.owner_pid, 0) == -1 && errno == ESRCH) {
logging::Info("Dead process: %i", seg.owner_pid);
return i;
}
if ((time(0) - seg.last_access_time) > ACCESS_TIMEOUT) {
logging::Info("Segment timeout: %i", i);
return i;
}
} else {
return i;
}
}
logging::Info("Ran out of segments for bots.");
return -1;
}
void ipcctl::SetCommand(int client, char* cmd) {
if (broken) return;
if (client < 0 || client >= MAX_SEGS) return;
char buffer[CMD_LENGTH];
snprintf(buffer, CMD_LENGTH, "%s", cmd);
logging::Info("Executing command `%s`, #CMD %i", cmd, mem->segments[client].command_number);
mem->segments[client].command_number++;
memcpy(mem->segments[client].command_buffer, buffer, sizeof(char) * CMD_LENGTH);
}
ipc_client_seg* ipcctl::GetClientSegment(int client) {
if (broken) return (ipc_client_seg*)0;
if (client < 0 || client >= MAX_SEGS) return (ipc_client_seg*)0;
if (client != 0 && mem->segments[client].owner_pid != getpid()) {
logging::Info("Warning: Shared memory violation! BotID: %i ; PID: %i ; OWNER: %i", client, getpid(), mem->segments[client].owner_pid);
this->client_id = NextClientID();
if (client == -1) {
logging::Info("FAILED TO ASSIGN NEW BOT ID !!!");
return 0;
}
logging::Info("New BotID: %i", client);
memset(&mem->segments[client], 0, sizeof(ipc_client_seg));
mem->segments[client].initialized = true;
mem->segments[client].owner_pid = getpid();
mem->segments[client].command_number = 0;
memcpy(mem->segments[client].name, g_ISteamFriends->GetPersonaName(), 32);
return 0;
}
mem->segments[client].last_access_time = time(0);
return &mem->segments[client];
}
bool ipcctl::Detach() {
if (broken) return true;
if (mem != (ipc_mem_layout*)-1) {
shmdt(mem);
}
return true;
}

View File

@ -1,47 +0,0 @@
/*
* ipcctl.h
*
* Created on: Nov 23, 2016
* Author: nullifiedcat
*/
#ifndef IPCCTL_H_
#define IPCCTL_H_
#include <sys/types.h>
#define MAX_SEGS 16
#define CMD_LENGTH 256
#define ACCESS_TIMEOUT 10000
#define NAME_LENGTH 32
typedef struct ipc_client_seg {
bool initialized;
time_t last_access_time;
pid_t owner_pid;
unsigned command_number;
char name[NAME_LENGTH];
char command_buffer[CMD_LENGTH];
} ipc_client_seg;
typedef struct ipc_mem_layout {
/* 0: Global commands; 1-15: Bot-Specific commands */
ipc_client_seg segments[MAX_SEGS];
} ipc_mem_layout;
class ipcctl {
public:
bool broken;
int key;
int shmid;
ipc_mem_layout* mem;
int client_id;
bool Init();
void SetCommand(int client, char* cmd);
ipc_client_seg* GetClientSegment(int client);
int NextClientID();
bool Detach();
};
#endif /* IPCCTL_H_ */

View File

@ -28,7 +28,7 @@ public:
Vector v_Origin;
Vector v_Eye;
int entity_idx;
CachedEntity* entity;
CachedEntity* entity { 0 };
CachedEntity* weapon();
Vector v_OrigViewangles;
Vector v_SilentAngles;