Fix some bugs and improve esp performance a little
Before this text would not update on players when the local player was dead, and the esp text was layered based on entity id and not distance, text centering was also missing for above/below text.
This commit is contained in:
parent
1c86a3eff9
commit
b0de6b4c80
@ -82,7 +82,7 @@ std::mutex threadsafe_mutex;
|
|||||||
// Storage array for keeping strings and other data
|
// Storage array for keeping strings and other data
|
||||||
std::array<ESPData, 2048> data;
|
std::array<ESPData, 2048> data;
|
||||||
// Storage vars for entities that need to be re-drawn
|
// Storage vars for entities that need to be re-drawn
|
||||||
std::vector<int> entities_need_repaint{};
|
std::vector<std::pair<int, float>> entities_need_repaint{};
|
||||||
std::mutex entities_need_repaint_mutex{};
|
std::mutex entities_need_repaint_mutex{};
|
||||||
|
|
||||||
// :b:one stuff needs to be up here as puting it in the header for sorting would
|
// :b:one stuff needs to be up here as puting it in the header for sorting would
|
||||||
@ -211,19 +211,73 @@ struct bonelist_s
|
|||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unordered_map<studiohdr_t *, bonelist_s> bonelist_map{};
|
std::unordered_map<studiohdr_t *, bonelist_s> bonelist_map{};
|
||||||
|
|
||||||
|
// These are strings that never change and should only be constructed once
|
||||||
|
const std::string hoovy_str = "Hoovy";
|
||||||
|
const std::string dormant_str = "*DORMANT*";
|
||||||
|
const std::string jarated_str = "*JARATED*";
|
||||||
|
const std::string slowed_str = "*SLOWED*";
|
||||||
|
const std::string zooming_str = "*ZOOMING*";
|
||||||
|
const std::string crit_str = "*CRITS*";
|
||||||
|
const std::string blast_p_str = "*BLAST PASSIVE*";
|
||||||
|
const std::string blast_a_str = "*BLAST VACCINATOR*";
|
||||||
|
const std::string fire_p_str = "*FIRE PASSIVE*";
|
||||||
|
const std::string fire_a_str = "*FIRE VACCINATOR*";
|
||||||
|
const std::string bullet_p_str = "*BULLET PASSIVE*";
|
||||||
|
const std::string bullet_a_str = "*BULLET VACCINATOR*";
|
||||||
|
const std::string invulnerable_str = "*INVULNERABLE*";
|
||||||
|
const std::string ready_ringer_str = "*DEADRINGER OUT*";
|
||||||
|
const std::string cloaked_str = "*CLOAKED*";
|
||||||
|
const std::string in_ringer_str = "*DEADRINGERED*";
|
||||||
|
const std::string botname_str = "BOT #";
|
||||||
|
const std::string tp_ready_str = "Ready";
|
||||||
|
const std::string sapped_str = "*Sapped*";
|
||||||
|
const std::string teleporter_str = "Teleporter";
|
||||||
|
const std::string sentry_str = "Sentry Gun";
|
||||||
|
const std::string dispenser_str = "Dispenser";
|
||||||
|
const std::string rare_spell_str = "Rare Spell";
|
||||||
|
const std::string spell_str = "Spell";
|
||||||
|
const std::string tf2c_spawner_respawn_str = "-- RESPAWNING --";
|
||||||
|
const std::string ammo_big_str = "{iii}";
|
||||||
|
const std::string ammo_medium_str = "{ii}";
|
||||||
|
const std::string ammo_small_str = "{i}";
|
||||||
|
const std::string tf2c_adrenaline_str = "[a]";
|
||||||
|
const std::string hl_battery_str = "[Z]";
|
||||||
|
const std::string health_big_str = "[+++]";
|
||||||
|
const std::string health_medium_str = "[++]";
|
||||||
|
const std::string health_small_str = "[+]";
|
||||||
|
const std::string mvm_money_str = "$$$";
|
||||||
|
const std::string mvm_red_money_str = "~$~";
|
||||||
|
const std::string tank_str = "Tank";
|
||||||
|
const std::string rpg_str = "RPG";
|
||||||
|
const std::string smg_str = "SMG";
|
||||||
|
const std::string shotgun_str = "Shotgun";
|
||||||
|
const std::string crossbow_str = "Crossbow";
|
||||||
|
const std::string bugbait_str = "Bug Bait";
|
||||||
|
const std::string binoculars_str = "Binoculars";
|
||||||
|
const std::string annabelle_str = "Annabelle";
|
||||||
|
const std::string alyx_gun_str = "Alyx Gun";
|
||||||
|
const std::string ar2_str = "AR2";
|
||||||
|
const std::string point357_str = ".357";
|
||||||
|
const std::string slam_str = "SLAM";
|
||||||
|
const std::string arrow_str = "[ >>---> ]";
|
||||||
|
const std::string sticky_str = "[ {*} ]";
|
||||||
|
const std::string pill_str = "[ (PP) ]";
|
||||||
|
const std::string rocket_str = "[ ==> ]";
|
||||||
|
|
||||||
// Function called on draw
|
// Function called on draw
|
||||||
static void Draw()
|
static void Draw()
|
||||||
{
|
{
|
||||||
if (!enable)
|
if (!enable)
|
||||||
return;
|
return;
|
||||||
|
PROF_SECTION(DRAW_ESP_PERFORMANCE);
|
||||||
std::lock_guard<std::mutex> esp_lock(threadsafe_mutex);
|
std::lock_guard<std::mutex> esp_lock(threadsafe_mutex);
|
||||||
for (auto &i : entities_need_repaint)
|
for (auto &i : entities_need_repaint)
|
||||||
{
|
{
|
||||||
ProcessEntityPT(ENTITY(i));
|
ProcessEntityPT(ENTITY(i.first));
|
||||||
#ifndef FEATURE_EMOJI_ESP_DISABLED
|
#ifndef FEATURE_EMOJI_ESP_DISABLED
|
||||||
emoji(ENTITY(i));
|
emoji(ENTITY(i.first));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -234,8 +288,9 @@ static void cm()
|
|||||||
// Check usersettings if enabled
|
// Check usersettings if enabled
|
||||||
if (!*enable)
|
if (!*enable)
|
||||||
return;
|
return;
|
||||||
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W))
|
if (CE_BAD(LOCAL_E))
|
||||||
return;
|
return;
|
||||||
|
PROF_SECTION(DRAW_CM_PERFORMANCE);
|
||||||
// Something
|
// Something
|
||||||
std::lock_guard<std::mutex> esp_lock(threadsafe_mutex);
|
std::lock_guard<std::mutex> esp_lock(threadsafe_mutex);
|
||||||
|
|
||||||
@ -279,7 +334,7 @@ static void cm()
|
|||||||
// If snow distance, add string here
|
// If snow distance, add string here
|
||||||
if (show_distance)
|
if (show_distance)
|
||||||
{
|
{
|
||||||
AddEntityString(ent, format((int) (ENTITY(i)->m_flDistance() / 64 * 1.22f), 'm'));
|
AddEntityString(ent, format((int) ENTITY(i)->m_flDistance() / 64 * 1.22f, 'm'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// No idea, this is confusing
|
// No idea, this is confusing
|
||||||
@ -287,10 +342,12 @@ static void cm()
|
|||||||
{
|
{
|
||||||
if (vischeck)
|
if (vischeck)
|
||||||
data[ent->m_IDX].transparent = !ent->IsVisible();
|
data[ent->m_IDX].transparent = !ent->IsVisible();
|
||||||
entities_need_repaint.push_back(ent->m_IDX);
|
entities_need_repaint.push_back({ ent->m_IDX, ent->m_flDistance() });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Render closer entities later in order to have their text in the foreground
|
||||||
|
std::sort(entities_need_repaint.begin(), entities_need_repaint.end(), [](std::pair<int, float> &a, std::pair<int, float> &b) { return a.second > b.second; });
|
||||||
}
|
}
|
||||||
|
|
||||||
static draw::Texture atlas{ paths::getDataPath("/textures/atlas.png") };
|
static draw::Texture atlas{ paths::getDataPath("/textures/atlas.png") };
|
||||||
@ -817,10 +874,7 @@ void _FASTCALL ProcessEntityPT(CachedEntity *ent)
|
|||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
{ // BOTTOM RIGHT
|
{ // BOTTOM RIGHT
|
||||||
draw_point = Vector(max_x + 2,
|
draw_point = Vector(max_x + 2, max_y - data.at(ent->m_IDX).string_count * 14, 0);
|
||||||
max_y - data.at(ent->m_IDX).string_count *
|
|
||||||
/*((int)fonts::font_main->height)*/ 14,
|
|
||||||
0);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
@ -830,15 +884,12 @@ void _FASTCALL ProcessEntityPT(CachedEntity *ent)
|
|||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
{ // ABOVE
|
{ // ABOVE
|
||||||
draw_point = Vector(min_x,
|
draw_point = Vector((min_x + max_x) / 2.0f, min_y - data.at(ent->m_IDX).string_count * 14, 0);
|
||||||
min_y - data.at(ent->m_IDX).string_count *
|
|
||||||
/*((int)fonts::font_main->height)*/ 14,
|
|
||||||
0);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
{ // BELOW
|
{ // BELOW
|
||||||
draw_point = Vector(min_x, max_y, 0);
|
draw_point = Vector((min_x + max_x) / 2.0f, max_y, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -865,7 +916,15 @@ void _FASTCALL ProcessEntityPT(CachedEntity *ent)
|
|||||||
// If the origin is centered, we use one method. if not, the other
|
// If the origin is centered, we use one method. if not, the other
|
||||||
if (!origin_is_zero || true)
|
if (!origin_is_zero || true)
|
||||||
{
|
{
|
||||||
draw::String(draw_point.x, draw_point.y, color, string.data.c_str(), *fonts::esp);
|
float draw_pointx_tmp = draw_point.x;
|
||||||
|
// Above/Below text should be centered
|
||||||
|
if (*esp_text_position == 3 || *esp_text_position == 4)
|
||||||
|
{
|
||||||
|
float w, h;
|
||||||
|
fonts::esp->stringSize(string.data, &w, &h);
|
||||||
|
draw_pointx_tmp -= w / 2.0f;
|
||||||
|
}
|
||||||
|
draw::String(draw_pointx_tmp, draw_point.y, color, string.data.c_str(), *fonts::esp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /*
|
{ /*
|
||||||
@ -975,7 +1034,7 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
{
|
{
|
||||||
if ((int) proj_rockets != 2 || ent->m_bCritProjectile())
|
if ((int) proj_rockets != 2 || ent->m_bCritProjectile())
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "[ ==> ]");
|
AddEntityString(ent, rocket_str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -991,14 +1050,14 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
break;
|
break;
|
||||||
if ((int) proj_pipes == 2 && !ent->m_bCritProjectile())
|
if ((int) proj_pipes == 2 && !ent->m_bCritProjectile())
|
||||||
break;
|
break;
|
||||||
AddEntityString(ent, "[ (PP) ]");
|
AddEntityString(ent, pill_str);
|
||||||
break;
|
break;
|
||||||
case 1: // Stickys
|
case 1: // Stickys
|
||||||
if (!proj_stickies)
|
if (!proj_stickies)
|
||||||
break;
|
break;
|
||||||
if ((int) proj_stickies == 2 && !ent->m_bCritProjectile())
|
if ((int) proj_stickies == 2 && !ent->m_bCritProjectile())
|
||||||
break;
|
break;
|
||||||
AddEntityString(ent, "[ {*} ]");
|
AddEntityString(ent, sticky_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Huntsman
|
// Huntsman
|
||||||
@ -1007,7 +1066,7 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
{
|
{
|
||||||
if ((int) proj_arrows != 2 || ent->m_bCritProjectile())
|
if ((int) proj_arrows != 2 || ent->m_bCritProjectile())
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "[ >>---> ]");
|
AddEntityString(ent, arrow_str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1021,27 +1080,27 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
{
|
{
|
||||||
int string_count_backup = data[ent->m_IDX].string_count;
|
int string_count_backup = data[ent->m_IDX].string_count;
|
||||||
if (classid == CL_CLASS(CWeapon_SLAM))
|
if (classid == CL_CLASS(CWeapon_SLAM))
|
||||||
AddEntityString(ent, "SLAM");
|
AddEntityString(ent, slam_str);
|
||||||
else if (classid == CL_CLASS(CWeapon357))
|
else if (classid == CL_CLASS(CWeapon357))
|
||||||
AddEntityString(ent, ".357");
|
AddEntityString(ent, point357_str);
|
||||||
else if (classid == CL_CLASS(CWeaponAR2))
|
else if (classid == CL_CLASS(CWeaponAR2))
|
||||||
AddEntityString(ent, "AR2");
|
AddEntityString(ent, ar2_str);
|
||||||
else if (classid == CL_CLASS(CWeaponAlyxGun))
|
else if (classid == CL_CLASS(CWeaponAlyxGun))
|
||||||
AddEntityString(ent, "Alyx Gun");
|
AddEntityString(ent, alyx_gun_str);
|
||||||
else if (classid == CL_CLASS(CWeaponAnnabelle))
|
else if (classid == CL_CLASS(CWeaponAnnabelle))
|
||||||
AddEntityString(ent, "Annabelle");
|
AddEntityString(ent, annabelle_str);
|
||||||
else if (classid == CL_CLASS(CWeaponBinoculars))
|
else if (classid == CL_CLASS(CWeaponBinoculars))
|
||||||
AddEntityString(ent, "Binoculars");
|
AddEntityString(ent, binoculars_str);
|
||||||
else if (classid == CL_CLASS(CWeaponBugBait))
|
else if (classid == CL_CLASS(CWeaponBugBait))
|
||||||
AddEntityString(ent, "Bug Bait");
|
AddEntityString(ent, bugbait_str);
|
||||||
else if (classid == CL_CLASS(CWeaponCrossbow))
|
else if (classid == CL_CLASS(CWeaponCrossbow))
|
||||||
AddEntityString(ent, "Crossbow");
|
AddEntityString(ent, crossbow_str);
|
||||||
else if (classid == CL_CLASS(CWeaponShotgun))
|
else if (classid == CL_CLASS(CWeaponShotgun))
|
||||||
AddEntityString(ent, "Shotgun");
|
AddEntityString(ent, shotgun_str);
|
||||||
else if (classid == CL_CLASS(CWeaponSMG1))
|
else if (classid == CL_CLASS(CWeaponSMG1))
|
||||||
AddEntityString(ent, "SMG");
|
AddEntityString(ent, smg_str);
|
||||||
else if (classid == CL_CLASS(CWeaponRPG))
|
else if (classid == CL_CLASS(CWeaponRPG))
|
||||||
AddEntityString(ent, "RPG");
|
AddEntityString(ent, rpg_str);
|
||||||
if (string_count_backup != data[ent->m_IDX].string_count)
|
if (string_count_backup != data[ent->m_IDX].string_count)
|
||||||
{
|
{
|
||||||
SetEntityColor(ent, colors::yellow);
|
SetEntityColor(ent, colors::yellow);
|
||||||
@ -1054,13 +1113,13 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
// Tank esp
|
// Tank esp
|
||||||
if (classid == CL_CLASS(CTFTankBoss) && tank)
|
if (classid == CL_CLASS(CTFTankBoss) && tank)
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "Tank");
|
AddEntityString(ent, tank_str);
|
||||||
|
|
||||||
// Dropped weapon esp
|
// Dropped weapon esp
|
||||||
}
|
}
|
||||||
else if (classid == CL_CLASS(CTFDroppedWeapon) && item_esp && item_dropped_weapons)
|
else if (classid == CL_CLASS(CTFDroppedWeapon) && item_esp && item_dropped_weapons)
|
||||||
{
|
{
|
||||||
AddEntityString(ent, format("WEAPON ", RAW_ENT(ent)->GetClientClass()->GetName()));
|
AddEntityString(ent, std::string("WEAPON ") + RAW_ENT(ent)->GetClientClass()->GetName());
|
||||||
|
|
||||||
// MVM Money esp
|
// MVM Money esp
|
||||||
}
|
}
|
||||||
@ -1070,12 +1129,12 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
{
|
{
|
||||||
if (item_money_red)
|
if (item_money_red)
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "~$~");
|
AddEntityString(ent, mvm_red_money_str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "$$$");
|
AddEntityString(ent, mvm_money_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Other item esp
|
// Other item esp
|
||||||
@ -1087,44 +1146,44 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
if (item_health_packs && (itemtype >= ITEM_HEALTH_SMALL && itemtype <= ITEM_HEALTH_LARGE || itemtype == ITEM_HL_BATTERY))
|
if (item_health_packs && (itemtype >= ITEM_HEALTH_SMALL && itemtype <= ITEM_HEALTH_LARGE || itemtype == ITEM_HL_BATTERY))
|
||||||
{
|
{
|
||||||
if (itemtype == ITEM_HEALTH_SMALL)
|
if (itemtype == ITEM_HEALTH_SMALL)
|
||||||
AddEntityString(ent, "[+]");
|
AddEntityString(ent, health_small_str);
|
||||||
if (itemtype == ITEM_HEALTH_MEDIUM)
|
if (itemtype == ITEM_HEALTH_MEDIUM)
|
||||||
AddEntityString(ent, "[++]");
|
AddEntityString(ent, health_medium_str);
|
||||||
if (itemtype == ITEM_HEALTH_LARGE)
|
if (itemtype == ITEM_HEALTH_LARGE)
|
||||||
AddEntityString(ent, "[+++]");
|
AddEntityString(ent, health_big_str);
|
||||||
if (itemtype == ITEM_HL_BATTERY)
|
if (itemtype == ITEM_HL_BATTERY)
|
||||||
AddEntityString(ent, "[Z]");
|
AddEntityString(ent, hl_battery_str);
|
||||||
|
|
||||||
// TF2C Adrenaline esp
|
// TF2C Adrenaline esp
|
||||||
}
|
}
|
||||||
else if (item_adrenaline && itemtype == ITEM_TF2C_PILL)
|
else if (item_adrenaline && itemtype == ITEM_TF2C_PILL)
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "[a]");
|
AddEntityString(ent, pill_str);
|
||||||
|
|
||||||
// Ammo pack esp
|
// Ammo pack esp
|
||||||
}
|
}
|
||||||
else if (item_ammo_packs && itemtype >= ITEM_AMMO_SMALL && itemtype <= ITEM_AMMO_LARGE)
|
else if (item_ammo_packs && itemtype >= ITEM_AMMO_SMALL && itemtype <= ITEM_AMMO_LARGE)
|
||||||
{
|
{
|
||||||
if (itemtype == ITEM_AMMO_SMALL)
|
if (itemtype == ITEM_AMMO_SMALL)
|
||||||
AddEntityString(ent, "{i}");
|
AddEntityString(ent, ammo_small_str);
|
||||||
if (itemtype == ITEM_AMMO_MEDIUM)
|
if (itemtype == ITEM_AMMO_MEDIUM)
|
||||||
AddEntityString(ent, "{ii}");
|
AddEntityString(ent, ammo_medium_str);
|
||||||
if (itemtype == ITEM_AMMO_LARGE)
|
if (itemtype == ITEM_AMMO_LARGE)
|
||||||
AddEntityString(ent, "{iii}");
|
AddEntityString(ent, ammo_big_str);
|
||||||
|
|
||||||
// Powerup esp
|
// Powerup esp
|
||||||
}
|
}
|
||||||
else if (item_powerups && itemtype >= ITEM_POWERUP_FIRST && itemtype <= ITEM_POWERUP_LAST)
|
else if (item_powerups && itemtype >= ITEM_POWERUP_FIRST && itemtype <= ITEM_POWERUP_LAST)
|
||||||
{
|
{
|
||||||
AddEntityString(ent, format(powerups[itemtype - ITEM_POWERUP_FIRST], " PICKUP"));
|
AddEntityString(ent, std::string(powerups[itemtype - ITEM_POWERUP_FIRST]) + " PICKUP");
|
||||||
|
|
||||||
// TF2C weapon spawner esp
|
// TF2C weapon spawner esp
|
||||||
}
|
}
|
||||||
else if (item_weapon_spawners && itemtype >= ITEM_TF2C_W_FIRST && itemtype <= ITEM_TF2C_W_LAST)
|
else if (item_weapon_spawners && itemtype >= ITEM_TF2C_W_FIRST && itemtype <= ITEM_TF2C_W_LAST)
|
||||||
{
|
{
|
||||||
AddEntityString(ent, format(tf2c_weapon_names[itemtype - ITEM_TF2C_W_FIRST], " SPAWNER"));
|
AddEntityString(ent, std::string(tf2c_weapon_names[itemtype - ITEM_TF2C_W_FIRST]) + " SPAWNER");
|
||||||
if (CE_BYTE(ent, netvar.bRespawning))
|
if (CE_BYTE(ent, netvar.bRespawning))
|
||||||
AddEntityString(ent, "-- RESPAWNING --");
|
AddEntityString(ent, tf2c_spawner_respawn_str);
|
||||||
|
|
||||||
// Halloween spell esp
|
// Halloween spell esp
|
||||||
}
|
}
|
||||||
@ -1132,11 +1191,11 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
{
|
{
|
||||||
if (itemtype == ITEM_SPELL)
|
if (itemtype == ITEM_SPELL)
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "Spell", colors::green);
|
AddEntityString(ent, spell_str, colors::green);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "Rare Spell", colors::FromRGBA8(139, 31, 221, 255));
|
AddEntityString(ent, rare_spell_str, colors::FromRGBA8(139, 31, 221, 255));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1159,16 +1218,16 @@ 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 = (classid == CL_CLASS(CObjectTeleporter) ? "Teleporter" : (classid == CL_CLASS(CObjectSentrygun) ? "Sentry Gun" : "Dispenser"));
|
const std::string &name = (classid == CL_CLASS(CObjectTeleporter) ? teleporter_str : (classid == CL_CLASS(CObjectSentrygun) ? sentry_str : dispenser_str));
|
||||||
int level = CE_INT(ent, netvar.iUpgradeLevel);
|
int level = CE_INT(ent, netvar.iUpgradeLevel);
|
||||||
bool IsMini = CE_BYTE(ent, netvar.m_bMiniBuilding);
|
bool IsMini = CE_BYTE(ent, netvar.m_bMiniBuilding);
|
||||||
bool IsSapped = CE_BYTE(ent, netvar.m_bHasSapper);
|
bool IsSapped = CE_BYTE(ent, netvar.m_bHasSapper);
|
||||||
if (!IsMini)
|
if (!IsMini)
|
||||||
AddEntityString(ent, format("LV ", level, ' ', name));
|
AddEntityString(ent, format("LVL ", level, ' ', name));
|
||||||
else
|
else
|
||||||
AddEntityString(ent, format("Mini ", name));
|
AddEntityString(ent, std::string("Mini ") + name);
|
||||||
if (IsSapped)
|
if (IsSapped)
|
||||||
AddEntityString(ent, "*Sapped*");
|
AddEntityString(ent, sapped_str);
|
||||||
if (classid == CL_CLASS(CObjectTeleporter))
|
if (classid == CL_CLASS(CObjectTeleporter))
|
||||||
{
|
{
|
||||||
float next_teleport = CE_FLOAT(ent, netvar.m_flTeleRechargeTime);
|
float next_teleport = CE_FLOAT(ent, netvar.m_flTeleRechargeTime);
|
||||||
@ -1176,9 +1235,9 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
if (yaw_to_exit)
|
if (yaw_to_exit)
|
||||||
{
|
{
|
||||||
if (next_teleport < g_GlobalVars->curtime)
|
if (next_teleport < g_GlobalVars->curtime)
|
||||||
AddEntityString(ent, "Ready");
|
AddEntityString(ent, tp_ready_str);
|
||||||
else
|
else
|
||||||
AddEntityString(ent, format(next_teleport - g_GlobalVars->curtime, "s"));
|
AddEntityString(ent, std::to_string(next_teleport - g_GlobalVars->curtime) + "s");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1210,7 +1269,7 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
|
|
||||||
// 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
|
||||||
// Legit mode handling
|
// Legit mode handling
|
||||||
if (legit && ent->m_iTeam() != g_pLocalPlayer->team && playerlist::IsDefault(info.friendsID))
|
if (legit && ent->m_bEnemy() && playerlist::IsDefault(info.friendsID))
|
||||||
{
|
{
|
||||||
if (IsPlayerInvisible(ent))
|
if (IsPlayerInvisible(ent))
|
||||||
return; // Invis check
|
return; // Invis check
|
||||||
@ -1227,13 +1286,11 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
{
|
{
|
||||||
powerup_type power = GetPowerupOnPlayer(ent);
|
powerup_type power = GetPowerupOnPlayer(ent);
|
||||||
if (power != not_powerup)
|
if (power != not_powerup)
|
||||||
AddEntityString(ent, format("^ ", powerups[power], " ^"));
|
AddEntityString(ent, std::string("^ ") + powerups[power] + " ^");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dont understand reasoning for this check
|
|
||||||
if (ent->m_bEnemy() || teammates || player_tools::shouldAlwaysRenderEsp(ent))
|
if (ent->m_bEnemy() || teammates || player_tools::shouldAlwaysRenderEsp(ent))
|
||||||
{
|
{
|
||||||
|
|
||||||
// Playername
|
// Playername
|
||||||
if (show_name)
|
if (show_name)
|
||||||
AddEntityString(ent, std::string(info.name));
|
AddEntityString(ent, std::string(info.name));
|
||||||
@ -1253,7 +1310,7 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
{
|
{
|
||||||
if (!ipc::peer->memory->peer_data[i].free && ipc::peer->memory->peer_user_data[i].friendid == info.friendsID)
|
if (!ipc::peer->memory->peer_data[i].free && ipc::peer->memory->peer_user_data[i].friendid == info.friendsID)
|
||||||
{
|
{
|
||||||
AddEntityString(ent, format("BOT #", i));
|
AddEntityString(ent, botname_str + std::to_string(i));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1262,7 +1319,9 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
// Health esp
|
// Health esp
|
||||||
if (show_health)
|
if (show_health)
|
||||||
{
|
{
|
||||||
AddEntityString(ent, format(g_pPlayerResource->GetHealth(ent), '/', g_pPlayerResource->GetMaxHealth(ent), " HP"), colors::Health(g_pPlayerResource->GetHealth(ent), g_pPlayerResource->GetMaxHealth(ent)));
|
int health = g_pPlayerResource->GetHealth(ent);
|
||||||
|
int max_health = g_pPlayerResource->GetMaxHealth(ent);
|
||||||
|
AddEntityString(ent, format(health, '/', max_health, " HP"), colors::Health(health, max_health));
|
||||||
}
|
}
|
||||||
IF_GAME(IsTF())
|
IF_GAME(IsTF())
|
||||||
{
|
{
|
||||||
@ -1281,12 +1340,14 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
CachedEntity *weapon = ENTITY(eid);
|
CachedEntity *weapon = ENTITY(eid);
|
||||||
if (!CE_INVALID(weapon) && weapon->m_iClassID() == CL_CLASS(CWeaponMedigun) && weapon)
|
if (!CE_INVALID(weapon) && weapon->m_iClassID() == CL_CLASS(CWeaponMedigun) && weapon)
|
||||||
{
|
{
|
||||||
|
std::string charge = std::to_string((int) floor(CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100));
|
||||||
|
|
||||||
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, charge + "% Uber", colors::Health(floor(CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100), 100));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
AddEntityString(ent, format(floor(CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100), '%', " Uber | Charges: ", floor(CE_FLOAT(weapon, netvar.m_flChargeLevel) / 0.25f)), colors::Health((CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100), 100));
|
AddEntityString(ent, charge + "% Uber | Charges: " + std::to_string(floor(CE_FLOAT(weapon, netvar.m_flChargeLevel) / 0.25f)), colors::Health((CE_FLOAT(weapon, netvar.m_flChargeLevel) * 100), 100));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1307,74 +1368,75 @@ void _FASTCALL ProcessEntity(CachedEntity *ent)
|
|||||||
if (IsPlayerInvisible(ent))
|
if (IsPlayerInvisible(ent))
|
||||||
{
|
{
|
||||||
if (HasCondition<TFCond_DeadRingered>(ent))
|
if (HasCondition<TFCond_DeadRingered>(ent))
|
||||||
AddEntityString(ent, "*DEADRINGERED*", colors::FromRGBA8(178.0f, 0.0f, 255.0f, 255.0f));
|
AddEntityString(ent, in_ringer_str, colors::FromRGBA8(178.0f, 0.0f, 255.0f, 255.0f));
|
||||||
else
|
else
|
||||||
AddEntityString(ent, "*CLOAKED*", colors::FromRGBA8(220.0f, 220.0f, 220.0f, 255.0f));
|
AddEntityString(ent, cloaked_str, colors::FromRGBA8(220.0f, 220.0f, 220.0f, 255.0f));
|
||||||
}
|
}
|
||||||
if (CE_BYTE(ent, netvar.m_bFeignDeathReady))
|
if (CE_BYTE(ent, netvar.m_bFeignDeathReady))
|
||||||
AddEntityString(ent, "*DEADRINGER OUT*", colors::FromRGBA8(178.0f, 0.0f, 255.0f, 255.0f));
|
AddEntityString(ent, ready_ringer_str, colors::FromRGBA8(178.0f, 0.0f, 255.0f, 255.0f));
|
||||||
// Uber/Bonk
|
// Uber/Bonk
|
||||||
if (IsPlayerInvulnerable(ent))
|
if (IsPlayerInvulnerable(ent))
|
||||||
AddEntityString(ent, "*INVULNERABLE*");
|
AddEntityString(ent, invulnerable_str);
|
||||||
// Vaccinator
|
// Vaccinator
|
||||||
if (HasCondition<TFCond_UberBulletResist>(ent))
|
if (HasCondition<TFCond_UberBulletResist>(ent))
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "*BULLET VACCINATOR*", colors::FromRGBA8(220, 220, 220, 255));
|
AddEntityString(ent, bullet_a_str, colors::FromRGBA8(220, 220, 220, 255));
|
||||||
}
|
}
|
||||||
else if (HasCondition<TFCond_SmallBulletResist>(ent))
|
else if (HasCondition<TFCond_SmallBulletResist>(ent))
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "*BULLET PASSIVE*");
|
AddEntityString(ent, bullet_p_str);
|
||||||
}
|
}
|
||||||
if (HasCondition<TFCond_UberFireResist>(ent))
|
if (HasCondition<TFCond_UberFireResist>(ent))
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "*FIRE VACCINATOR*", colors::FromRGBA8(220, 220, 220, 255));
|
AddEntityString(ent, fire_a_str, colors::FromRGBA8(220, 220, 220, 255));
|
||||||
}
|
}
|
||||||
else if (HasCondition<TFCond_SmallFireResist>(ent))
|
else if (HasCondition<TFCond_SmallFireResist>(ent))
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "*FIRE PASSIVE*");
|
AddEntityString(ent, fire_p_str);
|
||||||
}
|
}
|
||||||
if (HasCondition<TFCond_UberBlastResist>(ent))
|
if (HasCondition<TFCond_UberBlastResist>(ent))
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "*BLAST VACCINATOR*", colors::FromRGBA8(220, 220, 220, 255));
|
AddEntityString(ent, blast_a_str, colors::FromRGBA8(220, 220, 220, 255));
|
||||||
}
|
}
|
||||||
else if (HasCondition<TFCond_SmallBlastResist>(ent))
|
else if (HasCondition<TFCond_SmallBlastResist>(ent))
|
||||||
{
|
{
|
||||||
AddEntityString(ent, "*BLAST PASSIVE*");
|
AddEntityString(ent, blast_p_str);
|
||||||
}
|
}
|
||||||
// Crit
|
// Crit
|
||||||
if (IsPlayerCritBoosted(ent))
|
if (IsPlayerCritBoosted(ent))
|
||||||
AddEntityString(ent, "*CRITS*", colors::orange);
|
AddEntityString(ent, crit_str, colors::orange);
|
||||||
// Zoomed
|
// 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_str, colors::FromRGBA8(220.0f, 220.0f, 220.0f, 255.0f));
|
||||||
// Slowed
|
// 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_str, colors::FromRGBA8(220.0f, 220.0f, 220.0f, 255.0f));
|
||||||
}
|
}
|
||||||
// Jarated
|
// Jarated
|
||||||
if (HasCondition<TFCond_Jarated>(ent))
|
if (HasCondition<TFCond_Jarated>(ent))
|
||||||
AddEntityString(ent, "*JARATED*", colors::yellow);
|
AddEntityString(ent, jarated_str, colors::yellow);
|
||||||
// Dormant
|
// Dormant
|
||||||
if (CE_VALID(ent) && RAW_ENT(ent)->IsDormant())
|
if (CE_VALID(ent) && RAW_ENT(ent)->IsDormant())
|
||||||
AddEntityString(ent, "*DORMANT*", colors::red);
|
AddEntityString(ent, dormant_str, colors::red);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Hoovy Esp
|
// Hoovy Esp
|
||||||
if (IsHoovy(ent))
|
if (IsHoovy(ent))
|
||||||
AddEntityString(ent, "Hoovy");
|
AddEntityString(ent, hoovy_str);
|
||||||
|
|
||||||
// Active weapon esp
|
// Active weapon esp
|
||||||
|
if (show_weapon)
|
||||||
|
{
|
||||||
int widx = CE_INT(ent, netvar.hActiveWeapon) & 0xFFF;
|
int widx = CE_INT(ent, netvar.hActiveWeapon) & 0xFFF;
|
||||||
if (IDX_GOOD(widx))
|
if (IDX_GOOD(widx))
|
||||||
{
|
{
|
||||||
CachedEntity *weapon = ENTITY(widx);
|
CachedEntity *weapon = ENTITY(widx);
|
||||||
if (CE_VALID(weapon) && re::C_BaseCombatWeapon::IsBaseCombatWeapon(RAW_ENT(weapon)))
|
if (CE_VALID(weapon) && re::C_BaseCombatWeapon::IsBaseCombatWeapon(RAW_ENT(weapon)))
|
||||||
{
|
{
|
||||||
if (show_weapon)
|
|
||||||
{
|
|
||||||
const char *weapon_name = re::C_BaseCombatWeapon::GetPrintName(RAW_ENT(weapon));
|
const char *weapon_name = re::C_BaseCombatWeapon::GetPrintName(RAW_ENT(weapon));
|
||||||
if (weapon_name)
|
if (weapon_name)
|
||||||
AddEntityString(ent, std::string(weapon_name));
|
AddEntityString(ent, std::string(weapon_name));
|
||||||
|
Reference in New Issue
Block a user