refactoring
This commit is contained in:
parent
b670d24700
commit
bf6c8d8fdc
@ -56,7 +56,6 @@
|
||||
#include <visual/atlas.hpp>
|
||||
#include <visual/EffectChams.hpp>
|
||||
#include <visual/drawmgr.hpp>
|
||||
#include "visual/menu/compatlayer.hpp"
|
||||
#endif
|
||||
|
||||
#include "core/profiler.hpp"
|
||||
@ -104,7 +103,7 @@
|
||||
#include "copypasted/CSignature.h"
|
||||
|
||||
#if ENABLE_GUI
|
||||
#include "visual/menu/GUI.h"
|
||||
// FIXME add gui
|
||||
#endif
|
||||
|
||||
#include <core/sdk.hpp>
|
||||
|
@ -9,8 +9,6 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
typedef void(fn_Msg_t)(const char *msg, va_list);
|
||||
|
||||
#ifdef __cplusplus
|
||||
namespace logging
|
||||
{
|
||||
|
@ -8,7 +8,10 @@
|
||||
#pragma once
|
||||
#include <boost/circular_buffer.hpp>
|
||||
#include <time.h>
|
||||
#include <mathlib/vector.h>
|
||||
|
||||
class Vector;
|
||||
class CUserCmd;
|
||||
class ConVar;
|
||||
|
||||
extern int g_AppID;
|
||||
@ -43,7 +46,8 @@ public:
|
||||
brutestruct brute;
|
||||
};
|
||||
|
||||
class CUserCmd;
|
||||
extern CUserCmd *g_pUserCmd;
|
||||
bool isHackActive();
|
||||
|
||||
extern CUserCmd *current_user_cmd;
|
||||
|
||||
extern GlobalSettings g_Settings;
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
namespace hacks::tf::autoheal
|
||||
{
|
||||
// TODO extern CatVar target_only;
|
||||
|
||||
void CreateMove();
|
||||
|
||||
struct patient_data_s
|
||||
|
@ -42,6 +42,7 @@ target_sources(cathook PRIVATE
|
||||
"${CMAKE_CURRENT_LIST_DIR}/ESP.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Radar.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/SkinChanger.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Thirdperson.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/SpyAlert.hpp")
|
||||
endif()
|
||||
|
||||
|
@ -22,50 +22,3 @@ extern int last_number;
|
||||
|
||||
extern float last_bucket;
|
||||
}
|
||||
|
||||
/*class Misc : public IHack {
|
||||
public:
|
||||
Misc();
|
||||
|
||||
virtual void ProcessUserCmd(CUserCmd*) override;
|
||||
virtual void Draw() override;
|
||||
|
||||
CatVar* v_bDebugInfo;
|
||||
ConCommand* c_Name;
|
||||
ConVar* v_bInfoSpam;
|
||||
ConVar* v_bFastCrouch;
|
||||
CatVar* v_bFlashlightSpam;
|
||||
CatVar* v_bMinigunJump; // TF2C
|
||||
CatVar* v_bDebugCrits; // TF2C
|
||||
CatVar* v_bAntiAFK;
|
||||
CatVar* v_bHookInspect;
|
||||
CatVar* v_iFakeLag;
|
||||
CatVar* v_bCritHack;
|
||||
CatVar* v_bTauntSlide;
|
||||
CatVar* v_bSuppressCrits;
|
||||
//ConVar* v_bDumpEventInfo;
|
||||
ConCommand* c_SaveSettings;
|
||||
ConCommand* c_Unrestricted;
|
||||
ConCommand* c_DumpItemAttributes;
|
||||
ConCommand* c_SayLine;
|
||||
ConCommand* c_Shutdown;
|
||||
ConCommand* c_AddFriend;
|
||||
ConCommand* c_AddRage;
|
||||
ConCommand* c_DumpVars;
|
||||
ConCommand* c_DumpPlayers;
|
||||
ConCommand* c_Teamname;
|
||||
ConCommand* c_Lockee;
|
||||
ConCommand* c_Info;
|
||||
ConCommand* c_DumpConds;
|
||||
ConCommand* c_Reset;
|
||||
ConCommand* c_Disconnect;
|
||||
ConCommand* c_Schema;
|
||||
ConCommand* c_DisconnectVAC;
|
||||
|
||||
CatVar* v_bCleanChat;
|
||||
};
|
||||
|
||||
void Schema_Reload();
|
||||
void CC_Misc_Disconnect_VAC();
|
||||
|
||||
DECLARE_HACK_SINGLETON(Misc);*/
|
||||
|
@ -22,7 +22,7 @@ extern const std::vector<std::string> builtin_lmaobox;
|
||||
extern const std::vector<std::string> builtin_lithium;
|
||||
|
||||
bool isActive();
|
||||
void Init();
|
||||
void CreateMove();
|
||||
void Reload();
|
||||
void init();
|
||||
void createMove();
|
||||
void reload();
|
||||
}
|
||||
|
12
include/hacks/Thirdperson.hpp
Normal file
12
include/hacks/Thirdperson.hpp
Normal file
@ -0,0 +1,12 @@
|
||||
/*
|
||||
Created on 29.07.18.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace hacks::tf::thirdperson
|
||||
{
|
||||
|
||||
void frameStageNotify();
|
||||
|
||||
}
|
@ -29,7 +29,6 @@
|
||||
#include "AntiCheat.hpp"
|
||||
#include "AutoDeadringer.hpp"
|
||||
#include "Bunnyhop.hpp"
|
||||
#include "LagExploit.hpp"
|
||||
#include "SeedPrediction.hpp"
|
||||
#endif
|
||||
#if ENABLE_VISUALS
|
||||
@ -43,7 +42,6 @@
|
||||
#include "AntiBackstab.hpp"
|
||||
#include "AutoBackstab.hpp"
|
||||
#include "FollowBot.hpp"
|
||||
#include "HealArrows.hpp"
|
||||
#include "Misc.hpp"
|
||||
#include "Trigger.hpp"
|
||||
#include "KillSay.hpp"
|
||||
|
@ -6,6 +6,7 @@ target_sources(cathook PRIVATE
|
||||
"${CMAKE_CURRENT_LIST_DIR}/EffectChams.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/EffectGlow.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/fidgetspinner.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/EventLogging.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/SDLHooks.hpp")
|
||||
|
||||
if(EnableGUI)
|
||||
|
9
include/visual/EventLogging.hpp
Normal file
9
include/visual/EventLogging.hpp
Normal file
@ -0,0 +1,9 @@
|
||||
/*
|
||||
Created on 29.07.18.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace event_logging
|
||||
{
|
||||
}
|
@ -6,42 +6,10 @@
|
||||
#include "MiscTemporary.hpp"
|
||||
std::array<Timer, 32> timers{};
|
||||
std::array<int, 32> bruteint{};
|
||||
CatVar minigun_jump(CV_SWITCH, "minigun_jump", "0", "TF2C minigun jump",
|
||||
"Allows jumping while shooting with minigun");
|
||||
|
||||
CatVar jointeam(CV_SWITCH, "fb_autoteam", "1",
|
||||
"Joins player team automatically (NYI)");
|
||||
CatVar joinclass(CV_STRING, "fb_autoclass", "spy",
|
||||
"Class that will be picked after joining a team (NYI)");
|
||||
|
||||
CatVar nolerp(CV_SWITCH, "nolerp", "0", "NoLerp mode (experimental)");
|
||||
|
||||
CatVar engine_pred(CV_SWITCH, "engine_prediction", "0", "Engine Prediction");
|
||||
CatVar debug_projectiles(CV_SWITCH, "debug_projectiles", "0",
|
||||
"Debug Projectiles");
|
||||
|
||||
CatVar fakelag_amount(CV_INT, "fakelag", "0", "Bad Fakelag");
|
||||
CatVar serverlag_amount(
|
||||
CV_INT, "serverlag", "0", "serverlag",
|
||||
"Lag the server by spamming this many voicecommands per tick");
|
||||
CatVar servercrash(CV_SWITCH, "servercrash", "0", "crash servers",
|
||||
"Crash servers by spamming signon net messages");
|
||||
CatVar semiauto(CV_INT, "semiauto", "0", "Semiauto");
|
||||
bool *bSendPackets = nullptr;
|
||||
CatVar resolver(CV_SWITCH, "resolver", "0", "Resolve angles");
|
||||
|
||||
CatVar crypt_chat(
|
||||
CV_SWITCH, "chat_crypto", "1", "Crypto chat",
|
||||
"Start message with !! and it will be only visible to cathook users");
|
||||
|
||||
int spectator_target;
|
||||
CLC_VoiceData *voicecrash{};
|
||||
bool firstcm = false;
|
||||
Timer DelayTimer{};
|
||||
CatVar delay(
|
||||
CV_INT, "delay", "0", "Delay",
|
||||
"Delay actions like chat spam and serverlag/crash by this many seconds.");
|
||||
CatVar adjust(CV_INT, "serverlag_ramp", "0", "Ramp lag",
|
||||
"keep lag around this many seconds");
|
||||
float prevflow = 0.0f;
|
||||
int prevflowticks = 0;
|
||||
|
@ -26,7 +26,7 @@ void Update()
|
||||
}
|
||||
if (i == g_IEngine->GetLocalPlayer())
|
||||
{
|
||||
d.push(g_pUserCmd->viewangles);
|
||||
d.push(current_user_cmd->viewangles);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -109,10 +109,10 @@ void LogMessage(int eid, std::string message)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (no_spam && hacks::shared::spam::spam_source and
|
||||
if (no_spam && hacks::shared::spam::isActive() and
|
||||
eid == g_IEngine->GetLocalPlayer())
|
||||
return;
|
||||
player_info_s info;
|
||||
player_info_s info{};
|
||||
if (not g_IEngine->GetPlayerInfo(eid, &info))
|
||||
return;
|
||||
if (no_ipc &&
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
std::stack<void (*)()> &init_stack()
|
||||
{
|
||||
static std::stack<void (*)()> stack;
|
||||
static std::stack<void (*)()> stack{};
|
||||
return stack;
|
||||
}
|
||||
|
||||
|
@ -9,10 +9,13 @@
|
||||
#include <string.h>
|
||||
|
||||
#include <pwd.h>
|
||||
#include <settings/Bool.hpp>
|
||||
|
||||
#include "common.hpp"
|
||||
|
||||
FILE *logging::handle = 0;
|
||||
settings::Bool log_to_console{ "hack.log-console", "false" };
|
||||
|
||||
FILE *logging::handle{ nullptr };
|
||||
|
||||
void logging::Initialize()
|
||||
{
|
||||
@ -24,7 +27,7 @@ void logging::Initialize()
|
||||
|
||||
void logging::Info(const char *fmt, ...)
|
||||
{
|
||||
if (logging::handle == 0)
|
||||
if (logging::handle == nullptr)
|
||||
logging::Initialize();
|
||||
char *buffer = new char[1024];
|
||||
va_list list;
|
||||
@ -45,7 +48,7 @@ void logging::Info(const char *fmt, ...)
|
||||
#if ENABLE_VISUALS
|
||||
if (g_ICvar)
|
||||
{
|
||||
if (console_logging.convar_parent && console_logging)
|
||||
if (*log_to_console)
|
||||
g_ICvar->ConsolePrintf("%s", result);
|
||||
}
|
||||
#endif
|
||||
@ -56,5 +59,5 @@ void logging::Info(const char *fmt, ...)
|
||||
void logging::Shutdown()
|
||||
{
|
||||
fclose(logging::handle);
|
||||
logging::handle = 0;
|
||||
logging::handle = nullptr
|
||||
}
|
||||
|
@ -23,10 +23,10 @@ namespace criticals
|
||||
|
||||
int find_next_random_crit_for_weapon(IClientEntity *weapon)
|
||||
{
|
||||
int tries = 0, number = g_pUserCmd->command_number, found = 0, seed,
|
||||
int tries = 0, number = current_user_cmd->command_number, found = 0, seed,
|
||||
seed_md5, seed_backup;
|
||||
|
||||
crithack_saved_state state;
|
||||
crithack_saved_state state{};
|
||||
state.Save(weapon);
|
||||
|
||||
seed_backup = *g_PredictionRandomSeed;
|
||||
@ -56,7 +56,7 @@ void unfuck_bucket(IClientEntity *weapon)
|
||||
static float last_bucket;
|
||||
static int last_weapon;
|
||||
|
||||
if (g_pUserCmd->command_number)
|
||||
if (current_user_cmd->command_number)
|
||||
changed = false;
|
||||
|
||||
float &bucket = re::C_TFWeaponBase::crit_bucket_(weapon);
|
||||
@ -92,15 +92,17 @@ static const model_t *lastweapon = nullptr;
|
||||
|
||||
bool force_crit(IClientEntity *weapon)
|
||||
{
|
||||
if (lastnumber < g_pUserCmd->command_number ||
|
||||
auto command_number = current_user_cmd->command_number;
|
||||
|
||||
if (lastnumber < command_number ||
|
||||
lastweapon != weapon->GetModel() ||
|
||||
lastnumber - g_pUserCmd->command_number > 1000)
|
||||
lastnumber - command_number > 1000)
|
||||
{
|
||||
if (cached_calculation.init_command > g_pUserCmd->command_number ||
|
||||
g_pUserCmd->command_number - cached_calculation.init_command >
|
||||
if (cached_calculation.init_command > command_number ||
|
||||
command_number - cached_calculation.init_command >
|
||||
4096 ||
|
||||
(g_pUserCmd->command_number &&
|
||||
(cached_calculation.command_number < g_pUserCmd->command_number)))
|
||||
(command_number &&
|
||||
(cached_calculation.command_number < command_number)))
|
||||
cached_calculation.weapon_entity = 0;
|
||||
if (cached_calculation.weapon_entity == weapon->entindex())
|
||||
return bool(cached_calculation.command_number);
|
||||
@ -109,7 +111,7 @@ bool force_crit(IClientEntity *weapon)
|
||||
}
|
||||
else
|
||||
number = lastnumber;
|
||||
logging::Info("Found critical: %d -> %d", g_pUserCmd->command_number,
|
||||
logging::Info("Found critical: %d -> %d", command_number,
|
||||
number);
|
||||
lastweapon = weapon->GetModel();
|
||||
lastnumber = number;
|
||||
@ -117,16 +119,16 @@ bool force_crit(IClientEntity *weapon)
|
||||
{
|
||||
if (!crit_legiter)
|
||||
{
|
||||
if (number && number != g_pUserCmd->command_number)
|
||||
command_number_mod[g_pUserCmd->command_number] = number;
|
||||
if (number && number != command_number)
|
||||
command_number_mod[command_number] = number;
|
||||
|
||||
cached_calculation.command_number = number;
|
||||
cached_calculation.weapon_entity = LOCAL_W->m_IDX;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (number && number - 30 < g_pUserCmd->command_number)
|
||||
command_number_mod[g_pUserCmd->command_number] = number;
|
||||
if (number && number - 30 < command_number)
|
||||
command_number_mod[command_number] = number;
|
||||
|
||||
cached_calculation.command_number = number;
|
||||
cached_calculation.weapon_entity = LOCAL_W->m_IDX;
|
||||
@ -136,22 +138,22 @@ bool force_crit(IClientEntity *weapon)
|
||||
{
|
||||
if (!crit_legiter)
|
||||
{
|
||||
if (g_pUserCmd->command_number != number && number &&
|
||||
number != g_pUserCmd->command_number)
|
||||
g_pUserCmd->buttons &= ~IN_ATTACK;
|
||||
if (command_number != number && number &&
|
||||
number != command_number)
|
||||
current_user_cmd->buttons &= ~IN_ATTACK;
|
||||
else
|
||||
g_pUserCmd->buttons |= IN_ATTACK;
|
||||
current_user_cmd->buttons |= IN_ATTACK;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (g_pUserCmd->command_number + 30 > number && number &&
|
||||
number != g_pUserCmd->command_number)
|
||||
g_pUserCmd->buttons &= ~IN_ATTACK;
|
||||
if (command_number + 30 > number && number &&
|
||||
number != command_number)
|
||||
current_user_cmd->buttons &= ~IN_ATTACK;
|
||||
else
|
||||
g_pUserCmd->buttons |= IN_ATTACK;
|
||||
current_user_cmd->buttons |= IN_ATTACK;
|
||||
}
|
||||
}
|
||||
return !!number;
|
||||
return number != 0;
|
||||
}
|
||||
|
||||
void create_move()
|
||||
@ -162,20 +164,20 @@ void create_move()
|
||||
return;
|
||||
if (CE_BAD(LOCAL_W))
|
||||
return;
|
||||
if (g_pUserCmd->command_number)
|
||||
lastusercmd = g_pUserCmd->command_number;
|
||||
if (current_user_cmd->command_number)
|
||||
lastusercmd = current_user_cmd->command_number;
|
||||
IClientEntity *weapon = RAW_ENT(LOCAL_W);
|
||||
if (!re::C_TFWeaponBase::IsBaseCombatWeapon(weapon))
|
||||
return;
|
||||
if (!re::C_TFWeaponBase::AreRandomCritsEnabled(weapon))
|
||||
return;
|
||||
unfuck_bucket(weapon);
|
||||
if ((g_pUserCmd->buttons & IN_ATTACK) && crit_key && crit_key.isKeyDown() &&
|
||||
g_pUserCmd->command_number)
|
||||
if ((current_user_cmd->buttons & IN_ATTACK) && crit_key && crit_key.isKeyDown() &&
|
||||
current_user_cmd->command_number)
|
||||
{
|
||||
force_crit(weapon);
|
||||
}
|
||||
else if ((g_pUserCmd->buttons & IN_ATTACK) && g_pUserCmd->command_number &&
|
||||
else if ((current_user_cmd->buttons & IN_ATTACK) && current_user_cmd->command_number &&
|
||||
GetWeaponMode() == weapon_melee && crit_melee &&
|
||||
g_pLocalPlayer->weapon()->m_iClassID() != CL_CLASS(CTFKnife))
|
||||
{
|
||||
@ -204,7 +206,7 @@ void draw()
|
||||
return;
|
||||
if (crit_info && CE_GOOD(LOCAL_W))
|
||||
{
|
||||
if (crit_key.KeyDown())
|
||||
if (crit_key.isKeyDown())
|
||||
{
|
||||
AddCenterString("FORCED CRITS!", colors::red);
|
||||
}
|
||||
|
@ -5,21 +5,17 @@
|
||||
* Author: nullifiedcat
|
||||
*/
|
||||
|
||||
#include <globals.h>
|
||||
#include <settings/Bool.hpp>
|
||||
|
||||
#include "common.hpp"
|
||||
|
||||
static settings::Bool global_enable{ "hack.enable", "true" };
|
||||
|
||||
time_t time_injected{ 0 };
|
||||
|
||||
int g_AppID = 0;
|
||||
|
||||
void ThirdpersonCallback(IConVar *var, const char *pOldValue, float flOldValue)
|
||||
{
|
||||
if (force_thirdperson.convar_parent && !force_thirdperson)
|
||||
{
|
||||
if (g_pLocalPlayer && CE_GOOD(g_pLocalPlayer->entity))
|
||||
CE_INT(g_pLocalPlayer->entity, netvar.nForceTauntCam) = 0;
|
||||
}
|
||||
}
|
||||
|
||||
ConVar *sv_client_min_interp_ratio;
|
||||
ConVar *cl_interp_ratio;
|
||||
ConVar *cl_interp;
|
||||
@ -29,28 +25,7 @@ unsigned long tickcount = 0;
|
||||
char *force_name_newlined = new char[32]{ 0 };
|
||||
bool need_name_change = true;
|
||||
int last_cmd_number = 0;
|
||||
CatVar force_name(CV_STRING, "name", "", "Force name");
|
||||
CatVar
|
||||
cathook(CV_SWITCH, "enabled", "1", "CatHook enabled",
|
||||
"Disabling this completely disables cathook (can be re-enabled)");
|
||||
// CatVar send_packets(CV_SWITCH, "sendpackets", "1", "Send packets", "Internal
|
||||
// use");
|
||||
CatVar show_antiaim(CV_SWITCH, "thirdperson_angles", "1", "Real TP angles",
|
||||
"You can see your own AA/Aimbot angles in thirdperson");
|
||||
CatVar force_thirdperson(CV_SWITCH, "thirdperson", "0", "Thirdperson",
|
||||
"Enable thirdperson view");
|
||||
CatVar console_logging(
|
||||
CV_SWITCH, "log", "0", "Debug Log",
|
||||
"Disable this if you don't need cathook messages in your console");
|
||||
// CatVar fast_outline(CV_SWITCH, "fastoutline", "0", "Low quality outline",
|
||||
// "Might increase performance when there is a lot of ESP text to draw");
|
||||
CatVar roll_speedhack(CV_KEY, "rollspeedhack", "0", "Roll Speedhack",
|
||||
"Roll speedhack key");
|
||||
char *disconnect_reason_newlined = new char[256]{ 0 };
|
||||
CatVar disconnect_reason(CV_STRING, "disconnect_reason", "",
|
||||
"Disconnect reason", "A custom disconnect reason");
|
||||
|
||||
CatVar event_log(CV_SWITCH, "events", "0", "Advanced Events");
|
||||
void GlobalSettings::Init()
|
||||
{
|
||||
sv_client_min_interp_ratio = g_ICvar->FindVar("sv_client_min_interp_ratio");
|
||||
@ -58,26 +33,14 @@ void GlobalSettings::Init()
|
||||
cl_interp = g_ICvar->FindVar("cl_interp");
|
||||
cl_interpolate = g_ICvar->FindVar("cl_interpolate");
|
||||
|
||||
force_thirdperson.OnRegister([](CatVar *var) {
|
||||
var->convar_parent->InstallChangeCallback(ThirdpersonCallback);
|
||||
});
|
||||
force_name.InstallChangeCallback(
|
||||
[](IConVar *var, const char *old, float oldfl) {
|
||||
std::string nl(force_name.GetString());
|
||||
ReplaceString(nl, "\\n", "\n");
|
||||
strncpy(force_name_newlined, nl.c_str(), 31);
|
||||
(void) oldfl;
|
||||
});
|
||||
disconnect_reason.InstallChangeCallback(
|
||||
[](IConVar *var, const char *old, float oldfl) {
|
||||
std::string nl(disconnect_reason.GetString());
|
||||
ReplaceString(nl, "\\n", "\n");
|
||||
strncpy(disconnect_reason_newlined, nl.c_str(), 255);
|
||||
(void) oldfl;
|
||||
});
|
||||
bInvalid = true;
|
||||
}
|
||||
|
||||
CUserCmd *g_pUserCmd = nullptr;
|
||||
CUserCmd *current_user_cmd{ nullptr };
|
||||
|
||||
GlobalSettings g_Settings;
|
||||
bool isHackActive()
|
||||
{
|
||||
return *global_enable;
|
||||
}
|
||||
|
||||
GlobalSettings g_Settings{};
|
||||
|
129
src/hack.cpp
129
src/hack.cpp
@ -102,129 +102,6 @@ std::stack<std::string> &hack::command_stack()
|
||||
return stack;
|
||||
}
|
||||
|
||||
#if ENABLE_VISUALS /* Why would we need colored chat stuff in textmode? \
|
||||
*/
|
||||
#define red 184, 56, 59, 255
|
||||
#define blu 88, 133, 162, 255
|
||||
|
||||
class AdvancedEventListener : public IGameEventListener
|
||||
{
|
||||
public:
|
||||
virtual void FireGameEvent(KeyValues *event)
|
||||
{
|
||||
if (!event_log)
|
||||
return;
|
||||
const char *name = event->GetName();
|
||||
if (!strcmp(name, "player_connect_client"))
|
||||
PrintChat("\x07%06X%s\x01 \x07%06X%s\x01 joining", 0xa06ba0,
|
||||
event->GetString("name"), 0x914e65,
|
||||
event->GetString("networkid"));
|
||||
else if (!strcmp(name, "player_activate"))
|
||||
{
|
||||
int uid = event->GetInt("userid");
|
||||
int entity = g_IEngine->GetPlayerForUserID(uid);
|
||||
player_info_s info;
|
||||
if (g_IEngine->GetPlayerInfo(entity, &info))
|
||||
PrintChat("\x07%06X%s\x01 connected", 0xa06ba0, info.name);
|
||||
}
|
||||
else if (!strcmp(name, "player_disconnect"))
|
||||
{
|
||||
CachedEntity *player =
|
||||
ENTITY(g_IEngine->GetPlayerForUserID(event->GetInt("userid")));
|
||||
PrintChat("\x07%06X%s\x01 \x07%06X%s\x01 disconnected",
|
||||
colors::chat::team(player->m_iTeam()),
|
||||
event->GetString("name"), 0x914e65,
|
||||
event->GetString("networkid"));
|
||||
}
|
||||
else if (!strcmp(name, "player_team"))
|
||||
{
|
||||
if (event->GetBool("disconnect") != 1)
|
||||
{
|
||||
int oteam = event->GetInt("oldteam");
|
||||
int nteam = event->GetInt("team");
|
||||
const char *oteam_s = teamname(oteam);
|
||||
const char *nteam_s = teamname(nteam);
|
||||
PrintChat("\x07%06X%s\x01 changed team (\x07%06X%s\x01 -> "
|
||||
"\x07%06X%s\x01)",
|
||||
0xa06ba0, event->GetString("name"),
|
||||
colors::chat::team(oteam), oteam_s,
|
||||
colors::chat::team(nteam), nteam_s);
|
||||
}
|
||||
}
|
||||
else if (!strcmp(name, "player_hurt"))
|
||||
{
|
||||
int victim = event->GetInt("userid");
|
||||
int attacker = event->GetInt("attacker");
|
||||
int health = event->GetInt("health");
|
||||
player_info_s kinfo;
|
||||
player_info_s vinfo;
|
||||
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(victim),
|
||||
&vinfo);
|
||||
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(attacker),
|
||||
&kinfo);
|
||||
CachedEntity *vic = ENTITY(g_IEngine->GetPlayerForUserID(victim));
|
||||
CachedEntity *att = ENTITY(g_IEngine->GetPlayerForUserID(attacker));
|
||||
PrintChat(
|
||||
"\x07%06X%s\x01 hurt \x07%06X%s\x01 down to \x07%06X%d\x01hp",
|
||||
colors::chat::team(att->m_iTeam()), kinfo.name,
|
||||
colors::chat::team(vic->m_iTeam()), vinfo.name, 0x2aaf18,
|
||||
health);
|
||||
}
|
||||
else if (!strcmp(name, "player_death"))
|
||||
{
|
||||
int victim = event->GetInt("userid");
|
||||
int attacker = event->GetInt("attacker");
|
||||
player_info_s kinfo;
|
||||
player_info_s vinfo;
|
||||
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(victim),
|
||||
&vinfo);
|
||||
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(attacker),
|
||||
&kinfo);
|
||||
CachedEntity *vic = ENTITY(g_IEngine->GetPlayerForUserID(victim));
|
||||
CachedEntity *att = ENTITY(g_IEngine->GetPlayerForUserID(attacker));
|
||||
PrintChat("\x07%06X%s\x01 killed \x07%06X%s\x01",
|
||||
colors::chat::team(att->m_iTeam()), kinfo.name,
|
||||
colors::chat::team(vic->m_iTeam()), vinfo.name);
|
||||
}
|
||||
else if (!strcmp(name, "player_spawn"))
|
||||
{
|
||||
int id = event->GetInt("userid");
|
||||
player_info_s info;
|
||||
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(id), &info);
|
||||
CachedEntity *player = ENTITY(g_IEngine->GetPlayerForUserID(id));
|
||||
PrintChat("\x07%06X%s\x01 (re)spawned",
|
||||
colors::chat::team(player->m_iTeam()), info.name);
|
||||
}
|
||||
else if (!strcmp(name, "player_changeclass"))
|
||||
{
|
||||
int id = event->GetInt("userid");
|
||||
player_info_s info;
|
||||
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(id), &info);
|
||||
CachedEntity *player = ENTITY(g_IEngine->GetPlayerForUserID(id));
|
||||
PrintChat("\x07%06X%s\x01 changed to \x07%06X%s\x01",
|
||||
colors::chat::team(player->m_iTeam()), info.name,
|
||||
0xa06ba0, classname(event->GetInt("class")));
|
||||
}
|
||||
else if (!strcmp(name, "vote_cast"))
|
||||
{
|
||||
int vote_option = event->GetInt("vote_option");
|
||||
int team = event->GetInt("team");
|
||||
int idx = event->GetInt("entityid");
|
||||
player_info_s info;
|
||||
const char *team_s = teamname(team);
|
||||
g_IEngine->GetPlayerInfo(idx, &info);
|
||||
PrintChat(
|
||||
"\x07%06X%s\x01 Voted \x07%06X%d\x01 on team \x07%06X%s\x01",
|
||||
colors::chat::team(team), info.name, colors::chat::team(team),
|
||||
vote_option, colors::chat::team(team), team_s);
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
AdvancedEventListener adv_event_listener{};
|
||||
|
||||
#endif /* TEXTMODE */
|
||||
|
||||
void hack::ExecuteCommand(const std::string command)
|
||||
{
|
||||
std::lock_guard<std::mutex> guard(hack::command_stack_mutex);
|
||||
@ -374,10 +251,7 @@ free(logname);*/
|
||||
#if ENABLE_VISUALS
|
||||
draw::Initialize();
|
||||
#if ENABLE_GUI
|
||||
|
||||
g_pGUI = new CatGUI();
|
||||
g_pGUI->Setup();
|
||||
|
||||
// FIXME put gui here
|
||||
#endif
|
||||
|
||||
#endif /* TEXTMODE */
|
||||
@ -505,7 +379,6 @@ free(logname);*/
|
||||
#endif
|
||||
sdl_hooks::applySdlHooks();
|
||||
logging::Info("SDL hooking done");
|
||||
g_IGameEventManager->AddListener(&adv_event_listener, false);
|
||||
|
||||
#endif /* TEXTMODE */
|
||||
#if not LAGBOT_MODE
|
||||
|
@ -38,8 +38,6 @@ bool UnassignedClass()
|
||||
Timer autoqueue_timer{};
|
||||
Timer queuetime{};
|
||||
Timer req_timer{};
|
||||
/*CatVar party_bypass(CV_SWITCH, "party_bypass", "0", "Party Bypass",
|
||||
"Bypass Party restrictions");*/
|
||||
void UpdateSearch()
|
||||
{
|
||||
// segfaults for no reason
|
||||
|
@ -27,14 +27,6 @@ static settings::Float fovcircle_opacity{ "autoreflect.draw-fov-opacity", "0.7"
|
||||
namespace hacks::tf::autoreflect
|
||||
{
|
||||
|
||||
// TODO setup proj sorting
|
||||
// TODO CatVar big_proj(CV_SWITCH, "reflect_big_projectile", "0", "Reflect big
|
||||
// projectiles", "Reflect Rockets");
|
||||
// TODO CatVar small_proj(CV_SWITCH, "reflect_small_projectile", "0", "Reflect
|
||||
// small projectiles", "Reflect Huntsman arrows, Crusaders bolts");
|
||||
// TODO CatVar misc_proj(CV_SWITCH, "reflect_misc_projectile", "0", "Reflect
|
||||
// other", "Reflect jarate, milk");
|
||||
|
||||
// Function called by game for movement
|
||||
void CreateMove()
|
||||
{
|
||||
|
@ -39,5 +39,6 @@ if(EnableVisuals)
|
||||
"${CMAKE_CURRENT_LIST_DIR}/ESP.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Radar.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/SkinChanger.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/SpyAlert.cpp")
|
||||
"${CMAKE_CURRENT_LIST_DIR}/SpyAlert.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Thirdperson.cpp")
|
||||
endif()
|
||||
|
@ -79,8 +79,6 @@ static settings::Bool online_software{ "esp.online.software", "true" };
|
||||
namespace hacks::shared::esp
|
||||
{
|
||||
|
||||
// CatVar draw_hitbox(CV_SWITCH, "esp_hitbox", "1", "Draw Hitbox");
|
||||
|
||||
// Unknown
|
||||
std::mutex threadsafe_mutex;
|
||||
// Storage array for keeping strings and other data
|
||||
|
@ -22,40 +22,6 @@
|
||||
namespace hacks::shared::misc
|
||||
{
|
||||
|
||||
static CatVar debug_info(CV_SWITCH, "debug_info", "0", "Debug info",
|
||||
"Shows some debug info in-game");
|
||||
static CatVar flashlight_spam(CV_SWITCH, "flashlight", "0", "Flashlight spam",
|
||||
"HL2DM flashlight spam");
|
||||
static CatVar
|
||||
auto_balance_spam(CV_SWITCH, "request_balance_spam", "0",
|
||||
"Inf Auto Balance Spam",
|
||||
"Use to send a autobalance request to the server that "
|
||||
"doesnt prevent you from using it again\nCredits to "
|
||||
"Blackfire");
|
||||
static CatVar
|
||||
anti_afk(CV_SWITCH, "anti_afk", "0", "Anti-AFK",
|
||||
"Sends random commands to prevent being kicked from server");
|
||||
static CatVar auto_strafe(CV_SWITCH, "auto_strafe", "0", "Auto-Strafe",
|
||||
"Automaticly airstrafes for you.");
|
||||
static CatVar
|
||||
render_zoomed(CV_SWITCH, "render_zoomed", "0",
|
||||
"Render model when zoomed-in",
|
||||
"Renders player model while being zoomed in as Sniper");
|
||||
static CatVar nopush_enabled(CV_SWITCH, "nopush_enabled", "0", "No Push",
|
||||
"Prevents other players from pushing you around.");
|
||||
|
||||
static CatVar no_homo(CV_SWITCH, "no_homo", "1", "No Homo", "read if gay");
|
||||
// Taunting stuff
|
||||
static CatVar tauntslide(CV_SWITCH, "tauntslide", "0", "TF2C tauntslide",
|
||||
"Allows moving and shooting while taunting");
|
||||
static CatVar tauntslide_tf2(CV_SWITCH, "tauntslide_tf2", "0", "Tauntslide",
|
||||
"Allows free movement while taunting with movable "
|
||||
"taunts\nOnly works in tf2");
|
||||
static CatVar
|
||||
show_spectators(CV_SWITCH, "show_spectators", "0", "Show spectators",
|
||||
"Show who's spectating you\nonly works in valve servers");
|
||||
static CatVar god_mode(CV_SWITCH, "godmode", "0", "no description",
|
||||
"no description");
|
||||
void *C_TFPlayer__ShouldDraw_original = nullptr;
|
||||
|
||||
bool C_TFPlayer__ShouldDraw_hook(IClientEntity *thisptr)
|
||||
|
@ -11,7 +11,6 @@ constexpr double MIN_CLOCKRES = 0.25;
|
||||
constexpr double MAX_CLOCKRES = 8192.5;
|
||||
double clockRes;
|
||||
float seedFraction = 0.0f;
|
||||
//static CatVar enableSeedPrediction(CV_SWITCH, "seed_prediction", "1", "Seed Predcition", "Enable Seed prediction");
|
||||
namespace hacks::tf2::seedprediction
|
||||
{
|
||||
buf bases{9999};
|
||||
|
@ -110,7 +110,7 @@ bool PlayerPassesQuery(Query query, int idx)
|
||||
|
||||
Query QueryFromSubstring(const std::string &string)
|
||||
{
|
||||
Query result;
|
||||
Query result{};
|
||||
bool read = true;
|
||||
for (auto it = string.begin(); read && *it; it++)
|
||||
{
|
||||
@ -211,13 +211,6 @@ int QueryPlayer(Query query)
|
||||
return index_result;
|
||||
}
|
||||
|
||||
void Init()
|
||||
{
|
||||
filename.installChangeCallback([](settings::VariableBase<std::string>& var, std::string after) {
|
||||
file.TryLoad(after);
|
||||
});
|
||||
}
|
||||
|
||||
bool SubstituteQueries(std::string &input)
|
||||
{
|
||||
size_t index = input.find("%query:");
|
||||
@ -252,7 +245,14 @@ bool FormatSpamMessage(std::string &message)
|
||||
return SubstituteQueries(message);
|
||||
}
|
||||
|
||||
void CreateMove()
|
||||
void init()
|
||||
{
|
||||
filename.installChangeCallback([](settings::VariableBase<std::string>& var, std::string after) {
|
||||
file.TryLoad(after);
|
||||
});
|
||||
}
|
||||
|
||||
void createMove()
|
||||
{
|
||||
IF_GAME(IsTF2())
|
||||
{
|
||||
@ -380,11 +380,16 @@ void CreateMove()
|
||||
}
|
||||
}
|
||||
|
||||
void Reload()
|
||||
void reload()
|
||||
{
|
||||
file.Load(std::string(filename.GetString()));
|
||||
}
|
||||
|
||||
bool isActive()
|
||||
{
|
||||
return bool(spam_source);
|
||||
}
|
||||
|
||||
const std::vector<std::string> builtin_default = {
|
||||
"cathook - more fun than a ball of yarn!", "GNU/Linux is the best OS!",
|
||||
"visit youtube.com/c/nullifiedcat for more information!",
|
||||
@ -423,9 +428,4 @@ const std::vector<std::string> builtin_lithium = {
|
||||
"SAVE YOUR MONEY AND GET LITHIUMCHEAT! IT IS FREE!",
|
||||
"GOT ROLLED BY LITHIUM? HEY, THAT MEANS IT'S TIME TO GET LITHIUMCHEAT!!"
|
||||
};
|
||||
|
||||
bool isActive()
|
||||
{
|
||||
return bool(spam_source);
|
||||
}
|
||||
}
|
||||
|
41
src/hacks/Thirdperson.cpp
Normal file
41
src/hacks/Thirdperson.cpp
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
Created on 29.07.18.
|
||||
*/
|
||||
|
||||
#include <hacks/Thirdperson.hpp>
|
||||
#include <settings/Bool.hpp>
|
||||
#include <localplayer.hpp>
|
||||
#include <entitycache.hpp>
|
||||
#include <core/sdk.hpp>
|
||||
|
||||
static settings::Bool enable{ "visual.thirdperson.enable", "false" };
|
||||
static settings::Bool angles{ "visual.thirdperson.real-angles", "false" };
|
||||
static bool was_enabled{ false };
|
||||
|
||||
void hacks::tf::thirdperson::frameStageNotify()
|
||||
{
|
||||
if (CE_BAD(LOCAL_E))
|
||||
return;
|
||||
|
||||
if (enable)
|
||||
{
|
||||
// Add thirdperson
|
||||
if (!g_pLocalPlayer->life_state)
|
||||
CE_INT(LOCAL_E, netvar.nForceTauntCam) = 1;
|
||||
was_enabled = true;
|
||||
}
|
||||
if (!enable && was_enabled)
|
||||
{
|
||||
// Remove thirdperson
|
||||
CE_INT(LOCAL_E, netvar.nForceTauntCam) = 0;
|
||||
was_enabled = false;
|
||||
}
|
||||
if (angles && g_IInput->CAM_IsThirdPerson())
|
||||
{
|
||||
CE_FLOAT(LOCAL_E, netvar.deadflag + 4) =
|
||||
g_Settings.brute.last_angles[LOCAL_E->m_IDX].x;
|
||||
CE_FLOAT(LOCAL_E, netvar.deadflag + 8) =
|
||||
g_Settings.brute.last_angles[LOCAL_E->m_IDX].y;
|
||||
}
|
||||
}
|
||||
|
@ -446,7 +446,7 @@ std::pair<float, float> ComputeMove(const Vector &a, const Vector &b)
|
||||
float speed = sqrt(vsilent.x * vsilent.x + vsilent.y * vsilent.y);
|
||||
Vector ang;
|
||||
VectorAngles(vsilent, ang);
|
||||
float yaw = DEG2RAD(ang.y - g_pUserCmd->viewangles.y);
|
||||
float yaw = DEG2RAD(ang.y - current_user_cmd->viewangles.y);
|
||||
return { cos(yaw) * 450, -sin(yaw) * 450 };
|
||||
}
|
||||
|
||||
|
@ -65,8 +65,3 @@ static CatCommand minus_use_action_slot_item_server(
|
||||
g_IEngine->ServerCmdKeyValues(kv);
|
||||
});
|
||||
|
||||
// TODO replace \\n with \n
|
||||
// TODO name \\n = \n
|
||||
// static CatVar queue_messages(CV_SWITCH, "chat_queue", "0", "Queue messages",
|
||||
// "Use this if you want to use spam/killsay and still be able to chat normally
|
||||
// (without having your msgs eaten by valve cooldown)");
|
||||
|
@ -104,21 +104,7 @@ DEFINE_HOOKED_METHOD(FrameStageNotify, void, void *this_,
|
||||
if (CE_GOOD(LOCAL_E) && no_zoom)
|
||||
RemoveCondition<TFCond_Zoomed>(LOCAL_E);
|
||||
}
|
||||
if (force_thirdperson && !g_pLocalPlayer->life_state &&
|
||||
CE_GOOD(g_pLocalPlayer->entity))
|
||||
{
|
||||
CE_INT(g_pLocalPlayer->entity, netvar.nForceTauntCam) = 1;
|
||||
}
|
||||
if (stage == 5 && show_antiaim && g_IInput->CAM_IsThirdPerson())
|
||||
{
|
||||
if (CE_GOOD(g_pLocalPlayer->entity))
|
||||
{
|
||||
CE_FLOAT(g_pLocalPlayer->entity, netvar.deadflag + 4) =
|
||||
g_Settings.brute.last_angles[LOCAL_E->m_IDX].x;
|
||||
CE_FLOAT(g_pLocalPlayer->entity, netvar.deadflag + 8) =
|
||||
g_Settings.brute.last_angles[LOCAL_E->m_IDX].y;
|
||||
}
|
||||
}
|
||||
hacks::tf::thirdperson::frameStageNotify();
|
||||
}
|
||||
return original::FrameStageNotify(this_, stage);
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ target_sources(cathook PRIVATE
|
||||
"${CMAKE_CURRENT_LIST_DIR}/EffectChams.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/EffectGlow.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/fidgetspinner.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/EventLogging.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/SDLHooks.cpp")
|
||||
|
||||
if(EnableGUI)
|
||||
|
@ -29,9 +29,6 @@ static settings::Bool chamsself{ "chams.self", "true" };
|
||||
static settings::Bool rainbow{ "chams.self-rainbow", "true" };
|
||||
static settings::Bool disco_chams{ "chams.disco", "false" };
|
||||
|
||||
// static CatVar chams_experimental(CV_SWITCH, "chams_effect", "0",
|
||||
// "Experimental Chams");
|
||||
|
||||
namespace effect_chams
|
||||
{
|
||||
|
||||
|
176
src/visual/EventLogging.cpp
Normal file
176
src/visual/EventLogging.cpp
Normal file
@ -0,0 +1,176 @@
|
||||
/*
|
||||
Created on 29.07.18.
|
||||
*/
|
||||
|
||||
#include <EventLogging.hpp>
|
||||
#include <settings/Bool.hpp>
|
||||
#include <helpers.hpp>
|
||||
#include <colors.hpp>
|
||||
#include <init.hpp>
|
||||
|
||||
static settings::Bool enable{ "chat.log-events", "false" };
|
||||
|
||||
static void handlePlayerConnectClient(KeyValues *kv)
|
||||
{
|
||||
PrintChat("\x07%06X%s\x01 \x07%06X%s\x01 joining", 0xa06ba0,
|
||||
kv->GetString("name"), 0x914e65,
|
||||
kv->GetString("networkid"));
|
||||
}
|
||||
|
||||
static void handlePlayerActivate(KeyValues *kv)
|
||||
{
|
||||
int uid = kv->GetInt("userid");
|
||||
int entity = g_IEngine->GetPlayerForUserID(uid);
|
||||
player_info_s info{};
|
||||
if (g_IEngine->GetPlayerInfo(entity, &info))
|
||||
PrintChat("\x07%06X%s\x01 connected", 0xa06ba0, info.name);
|
||||
}
|
||||
|
||||
static void handlePlayerDisconnect(KeyValues *kv)
|
||||
{
|
||||
CachedEntity *player =
|
||||
ENTITY(g_IEngine->GetPlayerForUserID(kv->GetInt("userid")));
|
||||
if (player == nullptr)
|
||||
return;
|
||||
PrintChat("\x07%06X%s\x01 \x07%06X%s\x01 disconnected",
|
||||
colors::chat::team(player->m_iTeam()),
|
||||
kv->GetString("name"), 0x914e65,
|
||||
kv->GetString("networkid"));
|
||||
}
|
||||
|
||||
static void handlePlayerTeam(KeyValues *kv)
|
||||
{
|
||||
if (kv->GetBool("disconnect"))
|
||||
return;
|
||||
|
||||
int oteam = kv->GetInt("oldteam");
|
||||
int nteam = kv->GetInt("team");
|
||||
const char *oteam_s = teamname(oteam);
|
||||
const char *nteam_s = teamname(nteam);
|
||||
PrintChat("\x07%06X%s\x01 changed team (\x07%06X%s\x01 -> "
|
||||
"\x07%06X%s\x01)",
|
||||
0xa06ba0, kv->GetString("name"),
|
||||
colors::chat::team(oteam), oteam_s,
|
||||
colors::chat::team(nteam), nteam_s);
|
||||
}
|
||||
|
||||
static void handlePlayerHurt(KeyValues *kv)
|
||||
{
|
||||
int victim = kv->GetInt("userid");
|
||||
int attacker = kv->GetInt("attacker");
|
||||
int health = kv->GetInt("health");
|
||||
player_info_s kinfo{};
|
||||
player_info_s vinfo{};
|
||||
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(victim),
|
||||
&vinfo);
|
||||
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(attacker),
|
||||
&kinfo);
|
||||
CachedEntity *vic = ENTITY(g_IEngine->GetPlayerForUserID(victim));
|
||||
CachedEntity *att = ENTITY(g_IEngine->GetPlayerForUserID(attacker));
|
||||
|
||||
if (vic == nullptr || att == nullptr)
|
||||
return;
|
||||
|
||||
PrintChat(
|
||||
"\x07%06X%s\x01 hurt \x07%06X%s\x01 down to \x07%06X%d\x01hp",
|
||||
colors::chat::team(att->m_iTeam()), kinfo.name,
|
||||
colors::chat::team(vic->m_iTeam()), vinfo.name, 0x2aaf18,
|
||||
health);
|
||||
}
|
||||
|
||||
static void handlePlayerDeath(KeyValues *kv)
|
||||
{
|
||||
int victim = kv->GetInt("userid");
|
||||
int attacker = kv->GetInt("attacker");
|
||||
player_info_s kinfo{};
|
||||
player_info_s vinfo{};
|
||||
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(victim),
|
||||
&vinfo);
|
||||
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(attacker),
|
||||
&kinfo);
|
||||
CachedEntity *vic = ENTITY(g_IEngine->GetPlayerForUserID(victim));
|
||||
CachedEntity *att = ENTITY(g_IEngine->GetPlayerForUserID(attacker));
|
||||
|
||||
if (vic == nullptr || att == nullptr)
|
||||
return;
|
||||
|
||||
PrintChat("\x07%06X%s\x01 killed \x07%06X%s\x01",
|
||||
colors::chat::team(att->m_iTeam()), kinfo.name,
|
||||
colors::chat::team(vic->m_iTeam()), vinfo.name);
|
||||
}
|
||||
|
||||
static void handlePlayerSpawn(KeyValues *kv)
|
||||
{
|
||||
int id = kv->GetInt("userid");
|
||||
player_info_s info{};
|
||||
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(id), &info);
|
||||
CachedEntity *player = ENTITY(g_IEngine->GetPlayerForUserID(id));
|
||||
if (player == nullptr)
|
||||
return;
|
||||
PrintChat("\x07%06X%s\x01 (re)spawned",
|
||||
colors::chat::team(player->m_iTeam()), info.name);
|
||||
}
|
||||
|
||||
static void handlePlayerChangeClass(KeyValues *kv)
|
||||
{
|
||||
int id = kv->GetInt("userid");
|
||||
player_info_s info{};
|
||||
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(id), &info);
|
||||
CachedEntity *player = ENTITY(g_IEngine->GetPlayerForUserID(id));
|
||||
if (player == nullptr)
|
||||
return;
|
||||
PrintChat("\x07%06X%s\x01 changed to \x07%06X%s\x01",
|
||||
colors::chat::team(player->m_iTeam()), info.name,
|
||||
0xa06ba0, classname(kv->GetInt("class")));
|
||||
}
|
||||
|
||||
static void handleVoteCast(KeyValues *kv)
|
||||
{
|
||||
int vote_option = kv->GetInt("vote_option");
|
||||
int team = kv->GetInt("team");
|
||||
int idx = kv->GetInt("entityid");
|
||||
player_info_s info{};
|
||||
const char *team_s = teamname(team);
|
||||
if (g_IEngine->GetPlayerInfo(idx, &info))
|
||||
PrintChat(
|
||||
"\x07%06X%s\x01 Voted \x07%06X%d\x01 on team \x07%06X%s\x01",
|
||||
colors::chat::team(team), info.name, colors::chat::team(team),
|
||||
vote_option, colors::chat::team(team), team_s);
|
||||
}
|
||||
|
||||
class LoggingEventListener: public IGameEventListener
|
||||
{
|
||||
public:
|
||||
void FireGameEvent(KeyValues *event) override
|
||||
{
|
||||
if (!enable)
|
||||
return;
|
||||
|
||||
const char *name = event->GetName();
|
||||
if (!strcmp(name, "player_connect_client"))
|
||||
handlePlayerConnectClient(event);
|
||||
else if (!strcmp(name, "player_activate"))
|
||||
handlePlayerActivate(event);
|
||||
else if (!strcmp(name, "player_disconnect"))
|
||||
handlePlayerDisconnect(event);
|
||||
else if (!strcmp(name, "player_team"))
|
||||
handlePlayerTeam(event);
|
||||
else if (!strcmp(name, "player_hurt"))
|
||||
handlePlayerHurt(event);
|
||||
else if (!strcmp(name, "player_death"))
|
||||
handlePlayerDeath(event);
|
||||
else if (!strcmp(name, "player_spawn"))
|
||||
handlePlayerSpawn(event);
|
||||
else if (!strcmp(name, "player_changeclass"))
|
||||
handlePlayerChangeClass(event);
|
||||
else if (!strcmp(name, "vote_cast"))
|
||||
handleVoteCast(event);
|
||||
}
|
||||
};
|
||||
|
||||
LoggingEventListener listener{};
|
||||
|
||||
InitRoutine init([]() {
|
||||
g_IGameEventManager->AddListener(&listener, false);
|
||||
});
|
||||
|
Reference in New Issue
Block a user