diff --git a/data/menu/nullifiedcat/catbot.xml b/data/menu/nullifiedcat/catbot.xml
index 9ecace83..e873011d 100755
--- a/data/menu/nullifiedcat/catbot.xml
+++ b/data/menu/nullifiedcat/catbot.xml
@@ -64,7 +64,7 @@
-
+
diff --git a/include/tfmm.hpp b/include/tfmm.hpp
index fd7f252a..43236a2d 100644
--- a/include/tfmm.hpp
+++ b/include/tfmm.hpp
@@ -14,5 +14,6 @@ void startQueue();
void leaveQueue();
void disconnectAndAbandon();
void abandon();
+bool isMMBanned();
int getQueue();
} // namespace tfmm
diff --git a/src/core/netvars.cpp b/src/core/netvars.cpp
index d94f25b9..6e057904 100644
--- a/src/core/netvars.cpp
+++ b/src/core/netvars.cpp
@@ -120,8 +120,7 @@ void NetVars::Init()
"DT_TFSniperRifle", "SniperRifleLocalData", "m_flChargedDamage");
this->iUpgradeLevel =
gNetvars.get_offset("DT_BaseObject", "m_iUpgradeLevel");
- this->m_hBuilder =
- gNetvars.get_offset("DT_BaseObject", "m_hBuilder");
+ this->m_hBuilder = gNetvars.get_offset("DT_BaseObject", "m_hBuilder");
this->iPipeType =
gNetvars.get_offset("DT_TFProjectile_Pipebomb", "m_iType");
this->iBuildingHealth =
diff --git a/src/hacks/AutoJoin.cpp b/src/hacks/AutoJoin.cpp
index 6c662090..5397ff92 100644
--- a/src/hacks/AutoJoin.cpp
+++ b/src/hacks/AutoJoin.cpp
@@ -97,7 +97,7 @@ void updateSearch()
logging::Info("Starting queue");
tfmm::startQueue();
}
-#if LAGBOT_MODE
+#if not ENABLE_VISUALS
if (req_timer.test_and_set(1800000))
{
logging::Info("Stuck in queue, segfaulting");
diff --git a/src/hacks/NavBot.cpp b/src/hacks/NavBot.cpp
index 26efd86d..d498a7aa 100644
--- a/src/hacks/NavBot.cpp
+++ b/src/hacks/NavBot.cpp
@@ -125,10 +125,12 @@ CachedEntity *nearestAmmo()
int last_tar = -1;
CachedEntity *NearestEnemy()
{
- if (last_tar == -1 || nav::ReadyForCommands) {
- float bestscr = FLT_MAX;
+ if (last_tar == -1 || nav::ReadyForCommands)
+ {
+ float bestscr = FLT_MAX;
CachedEntity *bestent = nullptr;
- for (int i = 0; i < g_IEngine->GetMaxClients(); i++) {
+ for (int i = 0; i < g_IEngine->GetMaxClients(); i++)
+ {
CachedEntity *ent = ENTITY(i);
if (CE_BAD(ent) || ent->m_Type() != ENTITY_PLAYER)
continue;
@@ -140,7 +142,8 @@ CachedEntity *NearestEnemy()
scr *= 5.0f;
if (g_pPlayerResource->GetClass(ent) == tf_pyro)
scr *= 7.0f;
- if (scr < bestscr) {
+ if (scr < bestscr)
+ {
bestscr = scr;
bestent = ent;
}
@@ -178,7 +181,9 @@ void Init()
hide.IsExposed())
sniper_spots.push_back(hide.m_pos);
}
- logging::Info("Sniper spots: %d, Manual Sniper Spots: %d, Sentry Spots: %d", sniper_spots.size(), preferred_sniper_spots.size(), nest_spots.size());
+ logging::Info("Sniper spots: %d, Manual Sniper Spots: %d, Sentry Spots: %d",
+ sniper_spots.size(), preferred_sniper_spots.size(),
+ nest_spots.size());
}
void initonce()
{
@@ -220,27 +225,28 @@ enum BuildingNum
TELEPORT_EXT,
};
std::vector GetBuildings()
+{
+ float bestscr = FLT_MAX;
+ std::vector buildings;
+ for (int i = 0; i < HIGHEST_ENTITY; i++)
{
- float bestscr = FLT_MAX;
- std::vector buildings;
- for (int i = 0; i < HIGHEST_ENTITY; i++)
+ CachedEntity *ent = ENTITY(i);
+ if (CE_BAD(ent))
+ continue;
+ if (ent->m_Type() != ENTITY_BUILDING)
+ continue;
+ if ((CE_INT(ent, netvar.m_hBuilder) & 0xFFF) !=
+ g_pLocalPlayer->entity_idx)
+ continue;
+ if (ent->m_vecOrigin().DistTo(LOCAL_E->m_vecOrigin()) < bestscr)
{
- CachedEntity *ent = ENTITY(i);
- if (CE_BAD(ent))
- continue;
- if (ent->m_Type() != ENTITY_BUILDING)
- continue;
- if ((CE_INT(ent, netvar.m_hBuilder) & 0xFFF) != g_pLocalPlayer->entity_idx)
- continue;
- if (ent->m_vecOrigin().DistTo(LOCAL_E->m_vecOrigin()) < bestscr)
- {
- buildings.push_back(i);
- bestscr = ent->m_vecOrigin().DistTo(LOCAL_E->m_vecOrigin());
- }
+ buildings.push_back(i);
+ bestscr = ent->m_vecOrigin().DistTo(LOCAL_E->m_vecOrigin());
}
- return buildings;
+ }
+ return buildings;
}
-int cost[4] = {100, 50, 130, 50};
+int cost[4] = { 100, 50, 130, 50 };
int GetBestBuilding(int metal)
{
bool hasSentry, hasDispenser;
@@ -263,7 +269,7 @@ int GetBestBuilding(int metal)
}
int GetClosestBuilding()
{
- float bestscr = FLT_MAX;
+ float bestscr = FLT_MAX;
int BestBuilding = -1;
for (int i = 0; i < HIGHEST_ENTITY; i++)
{
@@ -272,12 +278,13 @@ int GetClosestBuilding()
continue;
if (ent->m_Type() != ENTITY_BUILDING)
continue;
- if ((CE_INT(ent, netvar.m_hBuilder) & 0xFFF) != g_pLocalPlayer->entity_idx)
+ if ((CE_INT(ent, netvar.m_hBuilder) & 0xFFF) !=
+ g_pLocalPlayer->entity_idx)
continue;
if (ent->m_vecOrigin().DistTo(LOCAL_E->m_vecOrigin()) < bestscr)
{
BestBuilding = i;
- bestscr = ent->m_vecOrigin().DistTo(LOCAL_E->m_vecOrigin());
+ bestscr = ent->m_vecOrigin().DistTo(LOCAL_E->m_vecOrigin());
}
}
return BestBuilding;
@@ -303,13 +310,15 @@ void CreateMove()
if (CE_GOOD(ammo))
nav::NavTo(ammo->m_vecOrigin(), true, true, 6);
}
- if ((!HasLowHealth() && nav::priority == 7) || (!HasLowAmmo() && nav::priority == 6))
+ if ((!HasLowHealth() && nav::priority == 7) ||
+ (!HasLowAmmo() && nav::priority == 6))
nav::clearInstructions();
if (enable)
{
if (!nav::ReadyForCommands && !spy_mode && !heavy_mode && !engi_mode)
cd3.update();
- bool isready = (spy_mode || heavy_mode || engi_mode) ? 1 : nav::ReadyForCommands;
+ bool isready =
+ (spy_mode || heavy_mode || engi_mode) ? 1 : nav::ReadyForCommands;
int waittime = (spy_mode || heavy_mode || engi_mode) ? 100 : 5000;
if (isready && cd3.test_and_set(waittime))
{
@@ -321,7 +330,9 @@ void CreateMove()
Init();
if (!sniper_spots.size() && !preferred_sniper_spots.size())
return;
- auto snip_spot = preferred_sniper_spots.size() ? preferred_sniper_spots : sniper_spots;
+ auto snip_spot = preferred_sniper_spots.size()
+ ? preferred_sniper_spots
+ : sniper_spots;
int rng = rand() % snip_spot.size();
random_spot = snip_spot.at(rng);
if (random_spot.z)
@@ -338,7 +349,9 @@ void CreateMove()
Init();
if (!sniper_spots.size() && !preferred_sniper_spots.size())
return;
- auto snip_spot = preferred_sniper_spots.size() ? preferred_sniper_spots : sniper_spots;
+ auto snip_spot = preferred_sniper_spots.size()
+ ? preferred_sniper_spots
+ : sniper_spots;
int rng = rand() % snip_spot.size();
random_spot = snip_spot.at(rng);
if (random_spot.z)
@@ -347,11 +360,13 @@ void CreateMove()
}
if (CE_GOOD(tar))
{
- if (!spy_mode || !hacks::shared::backtrack::isBacktrackEnabled)
+ if (!spy_mode ||
+ !hacks::shared::backtrack::isBacktrackEnabled)
nav::NavTo(tar->m_vecOrigin(), false);
else
{
- for (auto i : hacks::shared::backtrack::headPositions[tar->m_IDX])
+ for (auto i : hacks::shared::backtrack::headPositions
+ [tar->m_IDX])
{
if (!hacks::shared::backtrack::ValidTick(i, tar))
continue;
@@ -382,7 +397,7 @@ void CreateMove()
{
if (spot.DistTo(LOCAL_E->m_vecOrigin()) < bestscr)
{
- bestscr = spot.DistTo(LOCAL_E->m_vecOrigin());
+ bestscr = spot.DistTo(LOCAL_E->m_vecOrigin());
best_spot = spot;
}
}
@@ -397,7 +412,8 @@ void CreateMove()
}
}
// If Near The best spot and ready for commands
- if (best_spot.DistTo(LOCAL_E->m_vecOrigin()) < 300.0f && (nav::ReadyForCommands || nav::priority == 1))
+ if (best_spot.DistTo(LOCAL_E->m_vecOrigin()) < 300.0f &&
+ (nav::ReadyForCommands || nav::priority == 1))
{
// Get the closest Building
int ClosestBuilding = GetClosestBuilding();
@@ -405,23 +421,46 @@ void CreateMove()
if (ClosestBuilding != -1)
{
CachedEntity *ent = ENTITY(ClosestBuilding);
- // If we have more than 25 metal and the building is damaged or not fully upgraded hit it with the wrench
- if (metal > 25 && (CE_INT(ent, netvar.iUpgradeLevel) < 3 || CE_INT(ent, netvar.iBuildingHealth) < CE_INT(ent, netvar.iBuildingMaxHealth)))
+ // If we have more than 25 metal and the building is
+ // damaged or not fully upgraded hit it with the wrench
+ if (metal > 25 &&
+ (CE_INT(ent, netvar.iUpgradeLevel) < 3 ||
+ CE_INT(ent, netvar.iBuildingHealth) <
+ CE_INT(ent, netvar.iBuildingMaxHealth)))
{
auto collide = RAW_ENT(ent)->GetCollideable();
- Vector min = ent->m_vecOrigin() + collide->OBBMins();
- Vector max = ent->m_vecOrigin() + collide->OBBMaxs();
+ Vector min =
+ ent->m_vecOrigin() + collide->OBBMins();
+ Vector max =
+ ent->m_vecOrigin() + collide->OBBMaxs();
// Distance check
- if (min.DistTo(g_pLocalPlayer->v_Eye) > re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W)) && max.DistTo(g_pLocalPlayer->v_Eye) > re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W)) && GetBuildingPosition(ent).DistTo(g_pLocalPlayer->v_Eye) > re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W)))
+ if (min.DistTo(g_pLocalPlayer->v_Eye) >
+ re::C_TFWeaponBaseMelee::GetSwingRange(
+ RAW_ENT(LOCAL_W)) &&
+ max.DistTo(g_pLocalPlayer->v_Eye) >
+ re::C_TFWeaponBaseMelee::GetSwingRange(
+ RAW_ENT(LOCAL_W)) &&
+ GetBuildingPosition(ent).DistTo(
+ g_pLocalPlayer->v_Eye) >
+ re::C_TFWeaponBaseMelee::GetSwingRange(
+ RAW_ENT(LOCAL_W)))
{
float minf = min.DistTo(g_pLocalPlayer->v_Eye);
float maxf = max.DistTo(g_pLocalPlayer->v_Eye);
- float center = GetBuildingPosition(ent).DistTo(g_pLocalPlayer->v_Eye);
- float closest = fminf(minf, fminf(maxf, center));
- Vector tonav = (minf == closest) ? min : (maxf == closest) ? max : GetBuildingPosition(ent);
+ float center = GetBuildingPosition(ent).DistTo(
+ g_pLocalPlayer->v_Eye);
+ float closest =
+ fminf(minf, fminf(maxf, center));
+ Vector tonav =
+ (minf == closest)
+ ? min
+ : (maxf == closest)
+ ? max
+ : GetBuildingPosition(ent);
nav::NavTo(tonav, false, false);
}
- Vector tr = GetBuildingPosition(ent) - g_pLocalPlayer->v_Eye;
+ Vector tr = GetBuildingPosition(ent) -
+ g_pLocalPlayer->v_Eye;
Vector angles;
VectorAngles(tr, angles);
// Clamping is important
@@ -449,9 +488,12 @@ void CreateMove()
Vector random_spot;
if (cd2.test_and_set(5000))
Init();
- if (!sniper_spots.size() && !preferred_sniper_spots.size())
+ if (!sniper_spots.size() &&
+ !preferred_sniper_spots.size())
return;
- auto snip_spot = preferred_sniper_spots.size() ? preferred_sniper_spots : sniper_spots;
+ auto snip_spot = preferred_sniper_spots.size()
+ ? preferred_sniper_spots
+ : sniper_spots;
int rng = rand() % snip_spot.size();
random_spot = snip_spot.at(rng);
if (random_spot.z)
@@ -467,7 +509,8 @@ void CreateMove()
// Build buildings in a 360° angle around player
current_user_cmd->viewangles.y = 90.0f * (tobuild + 1);
// Build new one
- g_IEngine->ServerCmd(format("build ", tobuild).c_str(), true);
+ g_IEngine->ServerCmd(format("build ", tobuild).c_str(),
+ true);
current_user_cmd->buttons |= IN_ATTACK;
g_pLocalPlayer->bUseSilentAngles = true;
}
diff --git a/src/hooks/Shutdown.cpp b/src/hooks/Shutdown.cpp
index ad18fd3f..80ad2fb4 100644
--- a/src/hooks/Shutdown.cpp
+++ b/src/hooks/Shutdown.cpp
@@ -21,11 +21,11 @@ DEFINE_HOOKED_METHOD(Shutdown, void, INetChannel *this_, const char *reason)
// This is a INetChannel hook - it SHOULDN'T be static because netchannel
// changes.
logging::Info("Disconnect: %s", reason);
- if (strstr(reason, "banned"))
+ if (strstr(reason, "banned") || strstr(reason, "Generic_Kicked"))
{
if (die_if_vac)
{
- logging::Info("VAC banned");
+ logging::Info("VAC/Matchmaking banned");
*(int *) 0 = 0;
exit(1);
}
diff --git a/src/hooks/visual/PaintTraverse.cpp b/src/hooks/visual/PaintTraverse.cpp
index 627dfa2c..23f65dfe 100644
--- a/src/hooks/visual/PaintTraverse.cpp
+++ b/src/hooks/visual/PaintTraverse.cpp
@@ -70,7 +70,7 @@ and no [])", [](const CCommand &args) {
bool replaced = false;
namespace hooked_methods
{
-
+Timer checkmmban{};
DEFINE_HOOKED_METHOD(PaintTraverse, void, vgui::IPanel *this_,
unsigned int panel, bool force, bool allow_force)
{
@@ -96,21 +96,28 @@ DEFINE_HOOKED_METHOD(PaintTraverse, void, vgui::IPanel *this_,
if (switcherido && spamdur && !joinspam.check(spamdur * 1000))
{
auto gc = re::CTFGCClientSystem::GTFGCClientSystem();
- if (!gc)
- goto label1;
- gc->JoinMMMatch();
+ if (gc)
+ gc->JoinMMMatch();
}
else if (!joinspam.check(spamdur * 1000) && spamdur)
{
INetChannel *ch = (INetChannel *) g_IEngine->GetNetChannelInfo();
- if (!ch)
- goto label1;
- ch->Shutdown("");
+ if (ch)
+ ch->Shutdown("");
}
}
-label1:
scndwait++;
switcherido = !switcherido;
+#if not ENABLE_VISUALS
+ if (checkmmban.test_and_set(1000))
+ {
+ if (tfmm::isMMBanned())
+ {
+ *(int *) nullptr = 0;
+ exit(1);
+ }
+ }
+#endif
/*static bool replacedparty = false;
static int callcnt = 0;
if (party_bypass && !replacedparty && callcnt < 5)
diff --git a/src/navparser.cpp b/src/navparser.cpp
index 758f5058..1c39a9f8 100644
--- a/src/navparser.cpp
+++ b/src/navparser.cpp
@@ -181,9 +181,9 @@ bool Prepare()
}
else
{
- lastmap = g_IEngine->GetLevelName();
- pathfinding = false;
- init = true;
+ lastmap = g_IEngine->GetLevelName();
+ pathfinding = false;
+ init = true;
threadingFinished = false;
std::thread initer(Init);
initer.detach();
@@ -211,7 +211,7 @@ int findClosestNavSquare(Vector vec)
// Make sure we're not stuck on the same area for too long
if (std::count(findClosestNavSquare_localAreas.begin(),
findClosestNavSquare_localAreas.end(), i) < 3)
- overlapping.emplace_back( i, &areas.at(i) );
+ overlapping.emplace_back(i, &areas.at(i));
}
}
@@ -320,7 +320,7 @@ bool NavTo(Vector dest, bool navToLocalCenter, bool persistent,
TF2MAP->pather->Reset();
}
crumbs.clear();
- crumbs = std::move(path);
+ crumbs = std::move(path);
lastArea = crumbs.at(0);
if (!navToLocalCenter && crumbs.size() > 1)
crumbs.erase(crumbs.begin());
@@ -490,15 +490,17 @@ CatCommand navpath("nav_path", "Debug nav path", [](const CCommand &args) {
}
});
-CatCommand navpathnolocal("nav_path_nolocal", "Debug nav path", [](const CCommand &args) {
- if (NavTo(loc, false, true, 50 + priority))
- {
- logging::Info("Pathing: Success! Walking to path...");
- }
- else
- {
- logging::Info("Pathing: Failed!");
- }
-});
+CatCommand navpathnolocal("nav_path_nolocal", "Debug nav path",
+ [](const CCommand &args) {
+ if (NavTo(loc, false, true, 50 + priority))
+ {
+ logging::Info(
+ "Pathing: Success! Walking to path...");
+ }
+ else
+ {
+ logging::Info("Pathing: Failed!");
+ }
+ });
} // namespace nav
diff --git a/src/online/Online.cpp b/src/online/Online.cpp
index a9080929..6addb4a6 100644
--- a/src/online/Online.cpp
+++ b/src/online/Online.cpp
@@ -13,7 +13,6 @@
#undef null
-
#include
#include
#include
diff --git a/src/textmode.cpp b/src/textmode.cpp
old mode 100755
new mode 100644
index 925fe849..63620d44
--- a/src/textmode.cpp
+++ b/src/textmode.cpp
@@ -21,8 +21,8 @@ void EXPOSED_Epic_VACBypass_1337_DoNotSteal_xXx_$1_xXx_MLG()
static unsigned char patch[] = { 0x55, 0x89, 0xE5, 0x83, 0xEC, 0x18, 0xB8,
0x01, 0x00, 0x00, 0x00, 0xC9, 0xC3 };
uintptr_t Host_IsSecureServerAllowed_addr = gSignatures.GetEngineSignature(
- "55 89 E5 83 EC 18 E8 ? ? ? ? 8B 10 C7 44 24 04 ? ? ? ? 89 04 24 FF 52 "
- "2C 85 C0 74 11");
+ "55 89 E5 83 EC ? E8 ? ? ? ? 8B 10 C7 44 24 ? ? ? ? ? 89 04 24 FF 52 ? "
+ "85 C0 74 ? C6 05");
// +0x21 = allowSecureServers
// logging::Info("1337 VAC bypass: 0x%08x",
// Host_IsSecureServerAllowed_addr);
diff --git a/src/tfmm.cpp b/src/tfmm.cpp
index c4f9deb4..81617b0c 100644
--- a/src/tfmm.cpp
+++ b/src/tfmm.cpp
@@ -32,7 +32,17 @@ CatCommand get_state("mm_state", "Get party state", []() {
namespace tfmm
{
-
+int queuecount = 0;
+bool isMMBanned()
+{
+ auto client = re::CTFPartyClient::GTFPartyClient();
+ if (!client || (client->BInQueueForMatchGroup(7) && queuecount < 10))
+ {
+ queuecount = 0;
+ return false;
+ }
+ return true;
+}
int getQueue()
{
return *queue;
@@ -47,6 +57,7 @@ void startQueue()
client->LoadSavedCasualCriteria();
client->RequestQueueForMatch((int) queue);
hacks::shared::autojoin::resetQueueTimer();
+ queuecount++;
}
else
logging::Info("queue_start: CTFPartyClient == null!");