esp stuff
This commit is contained in:
parent
70e5ff3fac
commit
265540cd60
@ -272,7 +272,7 @@ void _FASTCALL DrawBox(CachedEntity* ent, const rgba_t& clr, bool healthbar, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Depending on whether the player is cloaked, we change the color acordingly
|
// Depending on whether the player is cloaked, we change the color acordingly
|
||||||
bool border = ((ent->m_iClassID == RCC_PLAYER) && IsPlayerInvisible(ent)) ? colors::FromRGBA8(160, 160, 160, clr.a * 255.0f) : colors::Transparent(colors::black, clr.a);
|
rgba_t border = ((ent->m_iClassID == RCC_PLAYER) && IsPlayerInvisible(ent)) ? colors::FromRGBA8(160, 160, 160, clr.a * 255.0f) : colors::Transparent(colors::black, clr.a);
|
||||||
|
|
||||||
// If box nodraw isnt true, we can draw our box
|
// If box nodraw isnt true, we can draw our box
|
||||||
if (!box_nodraw) {
|
if (!box_nodraw) {
|
||||||
@ -301,14 +301,6 @@ void _FASTCALL ProcessEntity(CachedEntity* ent) {
|
|||||||
if (!enabled) return; // Esp enable check
|
if (!enabled) return; // Esp enable check
|
||||||
if (CE_BAD(ent)) return; // CE_BAD check to prevent crashes
|
if (CE_BAD(ent)) return; // CE_BAD check to prevent crashes
|
||||||
|
|
||||||
int string_count_backup, *weapon_list, handle, eid;
|
|
||||||
bool shown;
|
|
||||||
player_info_s info;
|
|
||||||
powerup_type power;
|
|
||||||
CachedEntity* weapon;
|
|
||||||
const char* weapon_name;
|
|
||||||
ESPData& espdata = data[ent->m_IDX];
|
|
||||||
|
|
||||||
// Entity esp
|
// Entity esp
|
||||||
if (entity_info) {
|
if (entity_info) {
|
||||||
AddEntityString(ent, format(RAW_ENT(ent)->GetClientClass()->m_pNetworkName, " [", ent->m_iClassID, "]"));
|
AddEntityString(ent, format(RAW_ENT(ent)->GetClientClass()->m_pNetworkName, " [", ent->m_iClassID, "]"));
|
||||||
@ -321,6 +313,9 @@ void _FASTCALL ProcessEntity(CachedEntity* ent) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get esp data from current ent
|
||||||
|
ESPData& espdata = data[ent->m_IDX];
|
||||||
|
|
||||||
// Projectile esp
|
// Projectile esp
|
||||||
if (ent->m_Type == ENTITY_PROJECTILE && proj_esp && (ent->m_bEnemy || (teammates && !proj_enemy))) {
|
if (ent->m_Type == ENTITY_PROJECTILE && proj_esp && (ent->m_bEnemy || (teammates && !proj_enemy))) {
|
||||||
|
|
||||||
@ -334,13 +329,14 @@ void _FASTCALL ProcessEntity(CachedEntity* ent) {
|
|||||||
|
|
||||||
// Pills/Stickys
|
// Pills/Stickys
|
||||||
} else if (ent->m_iClassID == CL_CLASS(CTFGrenadePipebombProjectile)) {
|
} else if (ent->m_iClassID == CL_CLASS(CTFGrenadePipebombProjectile)) {
|
||||||
|
// Switch based on pills/stickys
|
||||||
switch (CE_INT(ent, netvar.iPipeType)) {
|
switch (CE_INT(ent, netvar.iPipeType)) {
|
||||||
case 0:
|
case 0:// Pills
|
||||||
if (!proj_pipes) break;
|
if (!proj_pipes) break;
|
||||||
if ((int)proj_pipes == 2 && !ent->m_bCritProjectile) break;
|
if ((int)proj_pipes == 2 && !ent->m_bCritProjectile) break;
|
||||||
AddEntityString(ent, "[ (PP) ]");
|
AddEntityString(ent, "[ (PP) ]");
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1: // Stickys
|
||||||
if (!proj_stickies) break;
|
if (!proj_stickies) break;
|
||||||
if ((int)proj_stickies == 2 && !ent->m_bCritProjectile) break;
|
if ((int)proj_stickies == 2 && !ent->m_bCritProjectile) break;
|
||||||
AddEntityString(ent, "[ {*} ]");
|
AddEntityString(ent, "[ {*} ]");
|
||||||
@ -358,7 +354,7 @@ void _FASTCALL ProcessEntity(CachedEntity* ent) {
|
|||||||
IF_GAME (IsHL2DM()) {
|
IF_GAME (IsHL2DM()) {
|
||||||
if (item_esp && item_dropped_weapons) {
|
if (item_esp && item_dropped_weapons) {
|
||||||
if (CE_BYTE(ent, netvar.hOwner) == (unsigned char)-1) {
|
if (CE_BYTE(ent, netvar.hOwner) == (unsigned char)-1) {
|
||||||
string_count_backup = data[ent->m_IDX].string_count;
|
int string_count_backup = data[ent->m_IDX].string_count;
|
||||||
if (ent->m_iClassID == CL_CLASS(CWeapon_SLAM)) AddEntityString(ent, "SLAM");
|
if (ent->m_iClassID == CL_CLASS(CWeapon_SLAM)) AddEntityString(ent, "SLAM");
|
||||||
else if (ent->m_iClassID == CL_CLASS(CWeapon357)) AddEntityString(ent, ".357");
|
else if (ent->m_iClassID == CL_CLASS(CWeapon357)) AddEntityString(ent, ".357");
|
||||||
else if (ent->m_iClassID == CL_CLASS(CWeaponAR2)) AddEntityString(ent, "AR2");
|
else if (ent->m_iClassID == CL_CLASS(CWeaponAR2)) AddEntityString(ent, "AR2");
|
||||||
@ -398,9 +394,6 @@ void _FASTCALL ProcessEntity(CachedEntity* ent) {
|
|||||||
// Other item esp
|
// Other item esp
|
||||||
} else if (ent->m_ItemType != ITEM_NONE && item_esp) {
|
} else if (ent->m_ItemType != ITEM_NONE && item_esp) {
|
||||||
|
|
||||||
// TODO, what does shown var do
|
|
||||||
shown = false;
|
|
||||||
|
|
||||||
// Health pack esp
|
// Health pack esp
|
||||||
if (item_health_packs && (ent->m_ItemType >= ITEM_HEALTH_SMALL && ent->m_ItemType <= ITEM_HEALTH_LARGE || ent->m_ItemType == ITEM_HL_BATTERY)) {
|
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) AddEntityString(ent, "[+]");
|
if (ent->m_ItemType == ITEM_HEALTH_SMALL) AddEntityString(ent, "[+]");
|
||||||
@ -451,7 +444,7 @@ void _FASTCALL ProcessEntity(CachedEntity* ent) {
|
|||||||
|
|
||||||
// Make a name for the building based on the building type and level
|
// Make a name for the building based on the building type and level
|
||||||
if (show_name || show_class) {
|
if (show_name || show_class) {
|
||||||
const std::string& name = (ent->m_iClassID == CL_CLASS(CObjectTeleporter) ? "Teleporter" : (ent->m_iClassID == CL_CLASS(CObjectSentrygun) ? "Sentry Gun" : "Dispenser"));'
|
const std::string& name = (ent->m_iClassID == CL_CLASS(CObjectTeleporter) ? "Teleporter" : (ent->m_iClassID == CL_CLASS(CObjectSentrygun) ? "Sentry Gun" : "Dispenser"));
|
||||||
int level = CE_INT(ent, netvar.iUpgradeLevel);
|
int level = CE_INT(ent, netvar.iUpgradeLevel);
|
||||||
AddEntityString(ent, format("LV ", level, ' ', name));
|
AddEntityString(ent, format("LV ", level, ' ', name));
|
||||||
}
|
}
|
||||||
@ -474,6 +467,7 @@ void _FASTCALL ProcessEntity(CachedEntity* ent) {
|
|||||||
int pclass = CE_INT(ent, netvar.iClass);
|
int pclass = CE_INT(ent, netvar.iClass);
|
||||||
|
|
||||||
// Attempt to get player info, and if cant, return
|
// Attempt to get player info, and if cant, return
|
||||||
|
player_info_s info;
|
||||||
if (!g_IEngine->GetPlayerInfo(ent->m_IDX, &info)) return;
|
if (!g_IEngine->GetPlayerInfo(ent->m_IDX, &info)) return;
|
||||||
|
|
||||||
// TODO, check if u can just use "ent->m_bEnemy" instead of m_iTeam
|
// TODO, check if u can just use "ent->m_bEnemy" instead of m_iTeam
|
||||||
@ -487,7 +481,7 @@ void _FASTCALL ProcessEntity(CachedEntity* ent) {
|
|||||||
|
|
||||||
// Powerup handling
|
// Powerup handling
|
||||||
if (powerup_esp) {
|
if (powerup_esp) {
|
||||||
power = GetPowerupOnPlayer(ent);
|
powerup_type power = GetPowerupOnPlayer(ent);
|
||||||
if (power != not_powerup)
|
if (power != not_powerup)
|
||||||
AddEntityString(ent, format("^ ", powerups[power], " ^"));
|
AddEntityString(ent, format("^ ", powerups[power], " ^"));
|
||||||
}
|
}
|
||||||
@ -498,6 +492,7 @@ void _FASTCALL ProcessEntity(CachedEntity* ent) {
|
|||||||
// Playername
|
// Playername
|
||||||
if (show_name)
|
if (show_name)
|
||||||
AddEntityString(ent, std::string(info.name));
|
AddEntityString(ent, std::string(info.name));
|
||||||
|
|
||||||
// Player class
|
// Player class
|
||||||
if (show_class) {
|
if (show_class) {
|
||||||
if (pclass > 0 && pclass < 10)
|
if (pclass > 0 && pclass < 10)
|
||||||
@ -520,14 +515,15 @@ void _FASTCALL ProcessEntity(CachedEntity* ent) {
|
|||||||
AddEntityString(ent, format(ent->m_iHealth, '/', ent->m_iMaxHealth, " HP"), 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_GAME (IsTF()) {
|
IF_GAME (IsTF()) {
|
||||||
|
// Medigun Ubercharge esp
|
||||||
if (show_ubercharge) {
|
if (show_ubercharge) {
|
||||||
if (CE_INT(ent, netvar.iClass) == tf_medic) {
|
if (CE_INT(ent, netvar.iClass) == tf_medic) {
|
||||||
weapon_list = (int*)((unsigned)(RAW_ENT(ent)) + netvar.hMyWeapons);
|
int *weapon_list = (int*)((unsigned)(RAW_ENT(ent)) + netvar.hMyWeapons);
|
||||||
for (int i = 0; weapon_list[i]; i++) {
|
for (int i = 0; weapon_list[i]; i++) {
|
||||||
handle = weapon_list[i];
|
int handle = weapon_list[i];
|
||||||
eid = handle & 0xFFF;
|
int eid = handle & 0xFFF;
|
||||||
if (eid >= 32 && eid <= HIGHEST_ENTITY) {
|
if (eid >= 32 && eid <= HIGHEST_ENTITY) {
|
||||||
weapon = ENTITY(eid);
|
CachedEntity* weapon = ENTITY(eid);
|
||||||
if (!CE_BAD(weapon) && weapon->m_iClassID == CL_CLASS(CWeaponMedigun) && weapon) {
|
if (!CE_BAD(weapon) && weapon->m_iClassID == CL_CLASS(CWeaponMedigun) && weapon) {
|
||||||
if (CE_INT(weapon, netvar.iItemDefinitionIndex) != 998) {
|
if (CE_INT(weapon, netvar.iItemDefinitionIndex) != 998) {
|
||||||
AddEntityString(ent, format(floor( CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100 ), '%', " Uber"), colors::Health(( CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100 ), 100));
|
AddEntityString(ent, format(floor( CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100 ), '%', " Uber"), colors::Health(( CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100 ), 100));
|
||||||
@ -538,50 +534,59 @@ void _FASTCALL ProcessEntity(CachedEntity* ent) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Conditions esp
|
||||||
if (show_conditions) {
|
if (show_conditions) {
|
||||||
const auto& clr = colors::EntityF(ent);
|
const auto& clr = colors::EntityF(ent);
|
||||||
if (IsPlayerInvisible(ent)) {
|
// Invis
|
||||||
|
if (IsPlayerInvisible(ent))
|
||||||
AddEntityString(ent, "*CLOAKED*", colors::FromRGBA8(220.0f, 220.0f, 220.0f, 255.0f));
|
AddEntityString(ent, "*CLOAKED*", colors::FromRGBA8(220.0f, 220.0f, 220.0f, 255.0f));
|
||||||
}
|
// Uber/Bonk
|
||||||
if (IsPlayerInvulnerable(ent)) {
|
if (IsPlayerInvulnerable(ent))
|
||||||
AddEntityString(ent, "*INVULNERABLE*");
|
AddEntityString(ent, "*INVULNERABLE*");
|
||||||
}
|
// Vaccinator
|
||||||
if (HasCondition<TFCond_UberBulletResist>(ent)) {
|
if (HasCondition<TFCond_UberBulletResist>(ent)) {
|
||||||
AddEntityString(ent, "*VACCINATOR*");
|
AddEntityString(ent, "*VACCINATOR*");
|
||||||
} else if (HasCondition<TFCond_SmallBulletResist>(ent)) {
|
} else if (HasCondition<TFCond_SmallBulletResist>(ent)) {
|
||||||
AddEntityString(ent, "*PASSIVE RESIST*");
|
AddEntityString(ent, "*PASSIVE RESIST*");
|
||||||
}
|
}
|
||||||
if (IsPlayerCritBoosted(ent)) {
|
// Crit
|
||||||
|
if (IsPlayerCritBoosted(ent))
|
||||||
AddEntityString(ent, "*CRITS*", colors::orange);
|
AddEntityString(ent, "*CRITS*", colors::orange);
|
||||||
}
|
// Zoomed
|
||||||
if (HasCondition<TFCond_Zoomed>(ent)) {
|
if (HasCondition<TFCond_Zoomed>(ent)) {
|
||||||
AddEntityString(ent, "*ZOOMING*", colors::FromRGBA8(220.0f, 220.0f, 220.0f, 255.0f));
|
AddEntityString(ent, "*ZOOMING*", colors::FromRGBA8(220.0f, 220.0f, 220.0f, 255.0f));
|
||||||
|
// Slowed
|
||||||
} else if (HasCondition<TFCond_Slowed>(ent)) {
|
} else if (HasCondition<TFCond_Slowed>(ent)) {
|
||||||
AddEntityString(ent, "*SLOWED*", colors::FromRGBA8(220.0f, 220.0f, 220.0f, 255.0f));
|
AddEntityString(ent, "*SLOWED*", colors::FromRGBA8(220.0f, 220.0f, 220.0f, 255.0f));
|
||||||
}
|
}
|
||||||
if (HasCondition<TFCond_Jarated>(ent)) {
|
// Jarated
|
||||||
|
if (HasCondition<TFCond_Jarated>(ent))
|
||||||
AddEntityString(ent, "*JARATED*", colors::yellow);
|
AddEntityString(ent, "*JARATED*", colors::yellow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
// Hoovy Esp
|
||||||
if (IsHoovy(ent)) AddEntityString(ent, "Hoovy");
|
if (IsHoovy(ent)) AddEntityString(ent, "Hoovy");
|
||||||
|
|
||||||
|
// Active weapon esp
|
||||||
int widx = CE_INT(ent, netvar.hActiveWeapon) & 0xFFF;
|
int widx = CE_INT(ent, netvar.hActiveWeapon) & 0xFFF;
|
||||||
if (IDX_GOOD(widx)) {
|
if (IDX_GOOD(widx)) {
|
||||||
weapon = ENTITY(widx);
|
CachedEntity* weapon = ENTITY(widx);
|
||||||
if (CE_GOOD(weapon)) {
|
if (CE_GOOD(weapon)) {
|
||||||
if (show_weapon) {
|
if (show_weapon) {
|
||||||
weapon_name = vfunc<const char*(*)(IClientEntity*)>(RAW_ENT(weapon), 398, 0)(RAW_ENT(weapon));
|
const char* weapon_name = vfunc<const char*(*)(IClientEntity*)>(RAW_ENT(weapon), 398, 0)(RAW_ENT(weapon));
|
||||||
if (weapon_name) AddEntityString(ent, std::string(weapon_name));
|
if (weapon_name) AddEntityString(ent, std::string(weapon_name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Notify esp to repaint
|
||||||
espdata.needs_paint = true;
|
espdata.needs_paint = true;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Vars to store what bones connect to what
|
||||||
const std::string bonenames_leg_r[] = { "bip_foot_R", "bip_knee_R", "bip_hip_R" };
|
const std::string bonenames_leg_r[] = { "bip_foot_R", "bip_knee_R", "bip_hip_R" };
|
||||||
const std::string bonenames_leg_l[] = { "bip_foot_L", "bip_knee_L", "bip_hip_L" };
|
const std::string bonenames_leg_l[] = { "bip_foot_L", "bip_knee_L", "bip_hip_L" };
|
||||||
const std::string bonenames_bottom[] = { "bip_hip_R", "bip_pelvis", "bip_hip_L" };
|
const std::string bonenames_bottom[] = { "bip_hip_R", "bip_pelvis", "bip_hip_L" };
|
||||||
@ -590,6 +595,9 @@ const std::string bonenames_arm_r[] = { "bip_upperArm_R", "bip_lowerArm_R", "bip
|
|||||||
const std::string bonenames_arm_l[] = { "bip_upperArm_L", "bip_lowerArm_L", "bip_hand_L" };
|
const std::string bonenames_arm_l[] = { "bip_upperArm_L", "bip_lowerArm_L", "bip_hand_L" };
|
||||||
const std::string bonenames_up[] = { "bip_upperArm_R", "bip_spine_3", "bip_upperArm_L" };
|
const std::string bonenames_up[] = { "bip_upperArm_R", "bip_spine_3", "bip_upperArm_L" };
|
||||||
|
|
||||||
|
// Dont fully understand struct but a guess is a group of something.
|
||||||
|
// I will return once I have enough knowlage to reverse this.
|
||||||
|
// NOTE: No idea on why we cant just use gethitbox and use the displacement on that insted of having all this extra code. Shouldnt gethitbox use cached hitboxes, if so it should be nicer on performance
|
||||||
struct bonelist_s {
|
struct bonelist_s {
|
||||||
bool setup { false };
|
bool setup { false };
|
||||||
bool success { false };
|
bool success { false };
|
||||||
@ -693,53 +701,42 @@ CatVar emoji_min_size(CV_INT, "esp_emoji_min_size", "20", "Emoji ESP min size",
|
|||||||
textures::AtlasTexture joy_texture(64 * 4, textures::atlas_height - 64 * 4, 64, 64);
|
textures::AtlasTexture joy_texture(64 * 4, textures::atlas_height - 64 * 4, 64, 64);
|
||||||
textures::AtlasTexture thinking_texture(64 * 5, textures::atlas_height - 64 * 4, 64, 64);
|
textures::AtlasTexture thinking_texture(64 * 5, textures::atlas_height - 64 * 4, 64, 64);
|
||||||
|
|
||||||
|
// Used when processing entitys with cached data from createmove
|
||||||
void _FASTCALL ProcessEntityPT(CachedEntity* ent) {
|
void _FASTCALL ProcessEntityPT(CachedEntity* ent) {
|
||||||
PROF_SECTION(PT_esp_process_entity);
|
PROF_SECTION(PT_esp_process_entity);
|
||||||
|
|
||||||
rgba_t fg, color;
|
// Check to prevent crashes
|
||||||
bool transparent, cloak, origin_is_zero;
|
|
||||||
Vector screen, origin_screen, draw_point;
|
|
||||||
|
|
||||||
if (CE_BAD(ent)) return;
|
if (CE_BAD(ent)) return;
|
||||||
|
|
||||||
transparent = false;
|
// Grab esp data
|
||||||
|
|
||||||
//if (!(local_esp && g_IInput->CAM_IsThirdPerson()) &&
|
|
||||||
// ent->m_IDX == g_IEngine->GetLocalPlayer()) return;
|
|
||||||
|
|
||||||
ESPData& ent_data = data[ent->m_IDX];
|
ESPData& ent_data = data[ent->m_IDX];
|
||||||
fg = ent_data.color;
|
|
||||||
|
// Get color of entity
|
||||||
|
// TODO, check if we can move this after world to screen check
|
||||||
|
rgba_t fg = ent_data.color;
|
||||||
if (!fg || fg.a == 0.0f) fg = ent_data.color = colors::EntityF(ent);
|
if (!fg || fg.a == 0.0f) fg = ent_data.color = colors::EntityF(ent);
|
||||||
|
|
||||||
|
// Check if entity is on screen, then save screen position if true
|
||||||
|
Vector screen, origin_screen;
|
||||||
if (!draw::EntityCenterToScreen(ent, screen) && !draw::WorldToScreen(ent->m_vecOrigin, origin_screen)) return;
|
if (!draw::EntityCenterToScreen(ent, screen) && !draw::WorldToScreen(ent->m_vecOrigin, origin_screen)) return;
|
||||||
|
|
||||||
|
// Unknown
|
||||||
ent_data.esp_origin.Zero();
|
ent_data.esp_origin.Zero();
|
||||||
|
|
||||||
|
// Get if ent should be transparent
|
||||||
|
bool transparent = false;
|
||||||
if (vischeck && !ent->IsVisible()) transparent = true;
|
if (vischeck && !ent->IsVisible()) transparent = true;
|
||||||
|
|
||||||
|
// Bone esp
|
||||||
if (draw_bones && ent->m_Type == ENTITY_PLAYER) {
|
if (draw_bones && ent->m_Type == ENTITY_PLAYER) {
|
||||||
const model_t* model = RAW_ENT(ent)->GetModel();
|
const model_t* model = RAW_ENT(ent)->GetModel();
|
||||||
if (model) {
|
if (model) {
|
||||||
auto hdr = g_IModelInfo->GetStudiomodel(model);
|
auto hdr = g_IModelInfo->GetStudiomodel(model);
|
||||||
bonelist_map[hdr].Draw(ent, fg);
|
bonelist_map[hdr].Draw(ent, fg);
|
||||||
//const Vector& orig = RAW_ENT(ent)->GetAbsOrigin();
|
|
||||||
/*ent->m_bBonesSetup = false;
|
|
||||||
ent->GetBones();
|
|
||||||
for (int i = 0; i < hdr->numbones; i++) {
|
|
||||||
const auto& bone = ent->GetBones()[i];
|
|
||||||
Vector pos(bone[0][3], bone[1][3], bone[2][3]);
|
|
||||||
//pos += orig;
|
|
||||||
Vector screen;
|
|
||||||
if (draw::WorldToScreen(pos, screen)) {
|
|
||||||
if (hdr->pBone(i)->pszName()) {
|
|
||||||
draw::FString(fonts::ESP, screen.x, screen.y, fg, 2, "%s [%d]", hdr->pBone(i)->pszName(), i);
|
|
||||||
} else
|
|
||||||
draw::FString(fonts::ESP, screen.x, screen.y, fg, 2, "%d", i);
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tracers
|
||||||
if (tracers && ent->m_Type == ENTITY_PLAYER) {
|
if (tracers && ent->m_Type == ENTITY_PLAYER) {
|
||||||
|
|
||||||
// Grab the screen resolution and save to some vars
|
// Grab the screen resolution and save to some vars
|
||||||
@ -759,6 +756,7 @@ void _FASTCALL ProcessEntityPT(CachedEntity* ent) {
|
|||||||
drawgl::Line(scn.x, scn.y, width - scn.x, height - scn.y, fg);
|
drawgl::Line(scn.x, scn.y, width - scn.x, height - scn.y, fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Emoji esp
|
||||||
if (ent->m_Type == ENTITY_PLAYER) {
|
if (ent->m_Type == ENTITY_PLAYER) {
|
||||||
if (joy_esp) {
|
if (joy_esp) {
|
||||||
auto hb = ent->hitboxes.GetHitbox(0);
|
auto hb = ent->hitboxes.GetHitbox(0);
|
||||||
@ -780,19 +778,16 @@ void _FASTCALL ProcessEntityPT(CachedEntity* ent) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Box esp
|
||||||
if (box_esp) {
|
if (box_esp) {
|
||||||
switch (ent->m_Type) {
|
switch (ent->m_Type) {
|
||||||
case ENTITY_PLAYER: {
|
case ENTITY_PLAYER:
|
||||||
//cloak = IsPlayerInvisible(ent);
|
|
||||||
//if (!ent->m_bEnemy && !teammates && playerlist::IsDefault(ent)) break;
|
|
||||||
//if (!ent->m_bAlivePlayer) break;
|
|
||||||
if (vischeck && !ent->IsVisible()) transparent = true;
|
if (vischeck && !ent->IsVisible()) transparent = true;
|
||||||
if (!fg) fg = colors::EntityF(ent);
|
if (!fg) fg = colors::EntityF(ent);
|
||||||
if (transparent) fg = colors::Transparent(fg);
|
if (transparent) fg = colors::Transparent(fg);
|
||||||
DrawBox(ent, fg, static_cast<bool>(box_healthbar), CE_INT(ent, netvar.iHealth), ent->m_iMaxHealth);
|
DrawBox(ent, fg, static_cast<bool>(box_healthbar), CE_INT(ent, netvar.iHealth), ent->m_iMaxHealth);
|
||||||
break;
|
break;
|
||||||
}
|
case ENTITY_BUILDING:
|
||||||
case ENTITY_BUILDING: {
|
|
||||||
if (CE_INT(ent, netvar.iTeamNum) == g_pLocalPlayer->team && !teammates) break;
|
if (CE_INT(ent, netvar.iTeamNum) == g_pLocalPlayer->team && !teammates) break;
|
||||||
if (!transparent && vischeck && !ent->IsVisible()) transparent = true;
|
if (!transparent && vischeck && !ent->IsVisible()) transparent = true;
|
||||||
if (!fg) fg = colors::EntityF(ent);
|
if (!fg) fg = colors::EntityF(ent);
|
||||||
@ -801,16 +796,16 @@ void _FASTCALL ProcessEntityPT(CachedEntity* ent) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
// Draw strings ???
|
||||||
origin_is_zero = !box_esp || ent_data.esp_origin.IsZero(1.0f);
|
bool origin_is_zero = !box_esp || ent_data.esp_origin.IsZero(1.0f);
|
||||||
if (origin_is_zero) ent_data.esp_origin = screen;
|
if (origin_is_zero) ent_data.esp_origin = screen;
|
||||||
if (ent_data.string_count) {
|
if (ent_data.string_count) {
|
||||||
PROF_SECTION(PT_esp_drawstrings);
|
PROF_SECTION(PT_esp_drawstrings);
|
||||||
if (vischeck && !ent->IsVisible()) transparent = true;
|
if (vischeck && !ent->IsVisible()) transparent = true;
|
||||||
draw_point = origin_is_zero ? screen : ent_data.esp_origin;
|
Vector draw_point = origin_is_zero ? screen : ent_data.esp_origin;
|
||||||
for (int j = 0; j < ent_data.string_count; j++) {
|
for (int j = 0; j < ent_data.string_count; j++) {
|
||||||
const ESPString& string = ent_data.strings[j];
|
const ESPString& string = ent_data.strings[j];
|
||||||
color = string.color ? string.color : ent_data.color;
|
rgba_t color = string.color ? string.color : ent_data.color;
|
||||||
if (transparent) color = colors::Transparent(color);
|
if (transparent) color = colors::Transparent(color);
|
||||||
if (!origin_is_zero) {
|
if (!origin_is_zero) {
|
||||||
FTGL_Draw(string.data, draw_point.x, draw_point.y, fonts::ftgl_ESP, color);
|
FTGL_Draw(string.data, draw_point.x, draw_point.y, fonts::ftgl_ESP, color);
|
||||||
|
Reference in New Issue
Block a user