commit
4eb43f2127
@ -30,7 +30,7 @@ set(DataPath "/opt/cathook/data" CACHE FILEPATH "Data location")
|
|||||||
set(VACBypass 0 CACHE BOOL "Textmode VAC bypass")
|
set(VACBypass 0 CACHE BOOL "Textmode VAC bypass")
|
||||||
set(Textmode 0 CACHE BOOL "Various textmode-only features for bots")
|
set(Textmode 0 CACHE BOOL "Various textmode-only features for bots")
|
||||||
set(EnableTextmodeStdin 0 CACHE BOOL "Textmode Stdin -> Console bridge (EXPERIMENTAL)")
|
set(EnableTextmodeStdin 0 CACHE BOOL "Textmode Stdin -> Console bridge (EXPERIMENTAL)")
|
||||||
set(EnableWarnings 1 CACHE BOOL "Enable compile warnings")
|
set(EnableWarnings 0 CACHE BOOL "Enable compile warnings")
|
||||||
set(EnableNullGraphics 0 CACHE BOOL "Enable experimental textmode hooks (CRASHES)")
|
set(EnableNullGraphics 0 CACHE BOOL "Enable experimental textmode hooks (CRASHES)")
|
||||||
set(EnableOnlineFeatures 0 CACHE BOOL "Enable online features (WIP)")
|
set(EnableOnlineFeatures 0 CACHE BOOL "Enable online features (WIP)")
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ configure_file(include/version.h.in ${CMAKE_SOURCE_DIR}/include/version.h @ONLY)
|
|||||||
|
|
||||||
#set_target_properties(cathook PROPERTIES COMPILE_FLAGS "-m32 -msse -msse2 -msse3 -fexceptions" LINK_FLAGS "-m32 -fno-gnu-unique -fexceptions -DNDEBUG")
|
#set_target_properties(cathook PROPERTIES COMPILE_FLAGS "-m32 -msse -msse2 -msse3 -fexceptions" LINK_FLAGS "-m32 -fno-gnu-unique -fexceptions -DNDEBUG")
|
||||||
set(CMAKE_CXX_FLAGS "-m32 -msse -msse2 -msse3 -fexceptions -fno-gnu-unique -DNDEBUG")
|
set(CMAKE_CXX_FLAGS "-m32 -msse -msse2 -msse3 -fexceptions -fno-gnu-unique -DNDEBUG")
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "-Og -g -ggdb -rdynamic")
|
set(CMAKE_CXX_FLAGS_DEBUG "-Og -rdynamic -ggdb")
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ and a lot of useful features, including
|
|||||||
* Follow Bots
|
* Follow Bots
|
||||||
* Working crit hack (does not work right now (works right now))
|
* Working crit hack (does not work right now (works right now))
|
||||||
|
|
||||||
[FULL LIST OF FEATURES HERE](https://github.com/nullworks/cathook/wiki/List-of-features) (list might be outdated)
|
[FULL LIST OF FEATURES HERE](https://github.com/nullworks/cathook/wiki/Feature-List-and-explanations) (list might be outdated)
|
||||||
|
|
||||||
# INSTALLATION
|
# INSTALLATION
|
||||||
|
|
||||||
|
2
attach
2
attach
@ -58,3 +58,5 @@ rm $FILENAME
|
|||||||
|
|
||||||
sudo killall -18 steamwebhelper
|
sudo killall -18 steamwebhelper
|
||||||
sudo killall -18 steam
|
sudo killall -18 steam
|
||||||
|
|
||||||
|
sudo ./scripts/auto-updater &
|
||||||
|
67
attach-gdb
Executable file
67
attach-gdb
Executable file
@ -0,0 +1,67 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
line=$(pidof hl2_linux)
|
||||||
|
arr=($line)
|
||||||
|
inst=$1
|
||||||
|
if [ $# == 0 ]; then
|
||||||
|
inst=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${#arr[@]} == 0 ]; then
|
||||||
|
echo TF2 isn\'t running!
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $inst -gt ${#arr[@]} ] || [ $inst == ${#arr[@]} ]; then
|
||||||
|
echo wrong index!
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
proc=${arr[$inst]}
|
||||||
|
|
||||||
|
echo Running instances: "${arr[@]}"
|
||||||
|
echo Attaching to "$proc"
|
||||||
|
|
||||||
|
#sudo ./detach $inst bin/libcathook.so
|
||||||
|
|
||||||
|
#if grep -q "$(realpath bin/libcathook.so)" /proc/"$proc"/maps; then
|
||||||
|
# echo already loaded
|
||||||
|
# exit
|
||||||
|
#fi
|
||||||
|
|
||||||
|
# pBypass for crash dumps being sent
|
||||||
|
# You may also want to consider using -nobreakpad in your launch options.
|
||||||
|
sudo rm -rf /tmp/dumps # Remove if it exists
|
||||||
|
sudo mkdir /tmp/dumps # Make it as root
|
||||||
|
sudo chmod 000 /tmp/dumps # No permissions
|
||||||
|
|
||||||
|
FILENAME="/tmp/.gl$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 6 | head -n 1)"
|
||||||
|
|
||||||
|
cp "bin/libcathook.so" "$FILENAME"
|
||||||
|
|
||||||
|
echo loading "$FILENAME" to "$proc"
|
||||||
|
|
||||||
|
sudo killall -19 steam
|
||||||
|
sudo killall -19 steamwebhelper
|
||||||
|
|
||||||
|
gdb -n -q -batch \
|
||||||
|
-ex "attach $proc" \
|
||||||
|
-ex "set \$dlopen = (void*(*)(char*, int)) dlopen" \
|
||||||
|
-ex "call \$dlopen(\"$FILENAME\", 1)" \
|
||||||
|
-ex "call dlerror()" \
|
||||||
|
-ex 'print (char *) $2' \
|
||||||
|
-ex "catch syscall exit exit_group" \
|
||||||
|
-ex "detach" \
|
||||||
|
-ex "quit"
|
||||||
|
|
||||||
|
sudo killall -18 steamwebhelper
|
||||||
|
sudo killall -18 steam
|
||||||
|
|
||||||
|
sudo ./scripts/auto-updater &
|
||||||
|
|
||||||
|
gdb -n -q -batch \
|
||||||
|
-ex "attach $proc" \
|
||||||
|
-ex "continue" \
|
||||||
|
-ex "backtrace"
|
||||||
|
|
||||||
|
rm $FILENAME
|
@ -61,3 +61,5 @@ sudo gdb -n -q -batch \
|
|||||||
-ex "quit"
|
-ex "quit"
|
||||||
|
|
||||||
sudo rm "/lib/i386-linux-gnu/${FILENAME}"
|
sudo rm "/lib/i386-linux-gnu/${FILENAME}"
|
||||||
|
|
||||||
|
sudo ./scripts/auto-updater &
|
||||||
|
11
data/dominatesay.txt
Normal file
11
data/dominatesay.txt
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
replace this file with actual dominatesay.
|
||||||
|
usable macros:
|
||||||
|
%team% %class% %killer% %name% %myteam% %myclass% %dominum% \n
|
||||||
|
|
||||||
|
examples:
|
||||||
|
|
||||||
|
%name% is getting dominated. no big surprise.
|
||||||
|
%team% actually sucks i already have %dominum% dominations wtf?
|
||||||
|
%name%, quit playing %class% dude. i'm already dominating you.
|
||||||
|
lmao adding %name% to my list of idiots
|
||||||
|
%dominum% dominations lol
|
@ -64,13 +64,11 @@
|
|||||||
<List width="170">
|
<List width="170">
|
||||||
<AutoVariable width="fill" target="misc.pathing" label="Enable Pathing"/>
|
<AutoVariable width="fill" target="misc.pathing" label="Enable Pathing"/>
|
||||||
<AutoVariable width="fill" target="misc.pathing.draw" label="Draw Path"/>
|
<AutoVariable width="fill" target="misc.pathing.draw" label="Draw Path"/>
|
||||||
<AutoVariable width="fill" target="navbot.enable" label="Master Switch"/>
|
<AutoVariable width="fill" target="navbot.enable" label="Enable Navbot"/>
|
||||||
<AutoVariable width="fill" target="navbot.sniper-mode" label="Enable Sniper Mode"/>
|
|
||||||
<AutoVariable width="fill" target="navbot.scout-mode" label="Enable Scout Mode"/>
|
<AutoVariable width="fill" target="navbot.scout-mode" label="Enable Scout Mode"/>
|
||||||
<AutoVariable width="fill" target="navbot.spy-mode" label="Enable Spy Mode"/>
|
<AutoVariable width="fill" target="navbot.spy-mode" label="Enable Spy Mode"/>
|
||||||
<AutoVariable width="fill" target="navbot.heavy-mode" label="Enable Heavy Mode"/>
|
<AutoVariable width="fill" target="navbot.heavy-mode" label="Enable Heavy Mode"/>
|
||||||
<AutoVariable width="fill" target="navbot.engi-mode" label="Enable Engie Mode"/>
|
<AutoVariable width="fill" target="navbot.primary-only" label="Best Weapon only"/>
|
||||||
<AutoVariable width="fill" target="navbot.best-slot" label="Best Weapon only"/>
|
|
||||||
<AutoVariable width="fill" target="navbot.jump-distance" label="Jump Distance"/>
|
<AutoVariable width="fill" target="navbot.jump-distance" label="Jump Distance"/>
|
||||||
<AutoVariable width="fill" target="navbot.target-sentry" label="Try to target sentries"/>
|
<AutoVariable width="fill" target="navbot.target-sentry" label="Try to target sentries"/>
|
||||||
<AutoVariable width="fill" target="navbot.stay-near" label="Zone enemies (stay near)"/>
|
<AutoVariable width="fill" target="navbot.stay-near" label="Zone enemies (stay near)"/>
|
||||||
|
2
external/libglez
vendored
2
external/libglez
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 9457ea150e041689c6f38f5720b4d571cf64a943
|
Subproject commit caca15cd63545b43798fc8872611a2e5f78d4668
|
@ -11,15 +11,8 @@
|
|||||||
|
|
||||||
class IClientEntity;
|
class IClientEntity;
|
||||||
|
|
||||||
// Fix clang gay
|
|
||||||
#if defined(__clang__)
|
|
||||||
#define NET_VAR(entity, offset, type) \
|
#define NET_VAR(entity, offset, type) \
|
||||||
(*(reinterpret_cast<type *>(reinterpret_cast<uint64_t>(entity) + (offset))))
|
(*(reinterpret_cast<type *>(reinterpret_cast<uint64_t>(entity) + (offset))))
|
||||||
#elif defined(__GNUC__) || defined(__GNUG__)
|
|
||||||
#define NET_VAR(entity, offset, type) \
|
|
||||||
(*(reinterpret_cast<type *>(reinterpret_cast<uintptr_t>(entity) + \
|
|
||||||
(offset))))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define NET_INT(entity, offset) NET_VAR(entity, offset, int)
|
#define NET_INT(entity, offset) NET_VAR(entity, offset, int)
|
||||||
|
|
||||||
@ -73,6 +66,7 @@ public:
|
|||||||
offset_t m_flTeleCurrentRechargeDuration;
|
offset_t m_flTeleCurrentRechargeDuration;
|
||||||
offset_t m_iTeleTimesUsed;
|
offset_t m_iTeleTimesUsed;
|
||||||
offset_t m_flTeleYawToExit;
|
offset_t m_flTeleYawToExit;
|
||||||
|
offset_t m_bMatchBuilding;
|
||||||
offset_t iPipeType;
|
offset_t iPipeType;
|
||||||
offset_t iBuildingHealth;
|
offset_t iBuildingHealth;
|
||||||
offset_t iBuildingMaxHealth;
|
offset_t iBuildingMaxHealth;
|
||||||
|
@ -62,6 +62,7 @@ extern circular_buf sequences;
|
|||||||
extern BacktrackData headPositions[32][66];
|
extern BacktrackData headPositions[32][66];
|
||||||
|
|
||||||
extern bool isBacktrackEnabled;
|
extern bool isBacktrackEnabled;
|
||||||
|
extern bool Vischeck_Success;
|
||||||
float getLatency();
|
float getLatency();
|
||||||
int getTicks();
|
int getTicks();
|
||||||
bool ValidTick(BacktrackData &i, CachedEntity *ent);
|
bool ValidTick(BacktrackData &i, CachedEntity *ent);
|
||||||
|
@ -27,6 +27,7 @@ target_sources(cathook PRIVATE
|
|||||||
"${CMAKE_CURRENT_LIST_DIR}/FollowBot.hpp"
|
"${CMAKE_CURRENT_LIST_DIR}/FollowBot.hpp"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/hacklist.hpp"
|
"${CMAKE_CURRENT_LIST_DIR}/hacklist.hpp"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/KillSay.hpp"
|
"${CMAKE_CURRENT_LIST_DIR}/KillSay.hpp"
|
||||||
|
"${CMAKE_CURRENT_LIST_DIR}/DominateSay.hpp"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/Killstreak.hpp"
|
"${CMAKE_CURRENT_LIST_DIR}/Killstreak.hpp"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/LightESP.hpp"
|
"${CMAKE_CURRENT_LIST_DIR}/LightESP.hpp"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/Misc.hpp"
|
"${CMAKE_CURRENT_LIST_DIR}/Misc.hpp"
|
||||||
|
20
include/hacks/DominateSay.hpp
Normal file
20
include/hacks/DominateSay.hpp
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* DominateSay.h
|
||||||
|
*
|
||||||
|
* Created on: Oct 30, 2017
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.hpp"
|
||||||
|
|
||||||
|
namespace hacks::shared::dominatesay
|
||||||
|
{
|
||||||
|
|
||||||
|
void init();
|
||||||
|
void shutdown();
|
||||||
|
void reload();
|
||||||
|
|
||||||
|
extern const std::vector<std::string> builtin_default;
|
||||||
|
extern const std::vector<std::string> jp_anime;
|
||||||
|
} // namespace hacks::shared::dominatesay
|
@ -1,26 +1,13 @@
|
|||||||
|
//
|
||||||
|
// Created by bencat07 on 17.08.18.
|
||||||
|
//
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include "common.hpp"
|
#include "common.hpp"
|
||||||
|
#include "config.h"
|
||||||
namespace hacks::shared::NavBot
|
namespace hacks::tf2::NavBot
|
||||||
{
|
{
|
||||||
|
void Init();
|
||||||
// Main Functions
|
void initonce();
|
||||||
void Init(bool from_LevelInit);
|
extern Vector Best_Spot;
|
||||||
|
} // namespace hacks::tf2::NavBot
|
||||||
// Helper
|
|
||||||
bool CanPath();
|
|
||||||
bool HasLowHealth();
|
|
||||||
bool HasLowAmmo();
|
|
||||||
CachedEntity *nearestHealth();
|
|
||||||
CachedEntity *nearestAmmo();
|
|
||||||
CachedEntity *nearestEnemy();
|
|
||||||
CachedEntity *nearestTeleporter();
|
|
||||||
Vector GetClosestValidByDist(CachedEntity *ent, float mindist, float maxdist, bool near);
|
|
||||||
void UpdateSlot();
|
|
||||||
void Jump();
|
|
||||||
|
|
||||||
// Path
|
|
||||||
bool NavToSniperSpot(int priority);
|
|
||||||
bool NavToNearestEnemy();
|
|
||||||
bool NavToBacktrackTick(int priority);
|
|
||||||
|
|
||||||
} // namespace hacks::shared::NavBot
|
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
#include "Misc.hpp"
|
#include "Misc.hpp"
|
||||||
#include "Trigger.hpp"
|
#include "Trigger.hpp"
|
||||||
#include "KillSay.hpp"
|
#include "KillSay.hpp"
|
||||||
|
#include "DominateSay.hpp"
|
||||||
#include "UberSpam.hpp"
|
#include "UberSpam.hpp"
|
||||||
#include "Achievement.hpp"
|
#include "Achievement.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
@ -71,6 +71,7 @@ weaponmode GetWeaponMode();
|
|||||||
|
|
||||||
void FixMovement(CUserCmd &cmd, Vector &viewangles);
|
void FixMovement(CUserCmd &cmd, Vector &viewangles);
|
||||||
void VectorAngles(Vector &forward, Vector &angles);
|
void VectorAngles(Vector &forward, Vector &angles);
|
||||||
|
void AngleVectors2(const QAngle &angles, Vector *forward);
|
||||||
extern std::mutex trace_lock;
|
extern std::mutex trace_lock;
|
||||||
bool IsEntityVisible(CachedEntity *entity, int hb);
|
bool IsEntityVisible(CachedEntity *entity, int hb);
|
||||||
bool IsEntityVectorVisible(CachedEntity *entity, Vector endpos);
|
bool IsEntityVectorVisible(CachedEntity *entity, Vector endpos);
|
||||||
@ -124,6 +125,14 @@ void WhatIAmLookingAt(int *result_eindex, Vector *result_pos);
|
|||||||
|
|
||||||
void Patch(void *address, void *patch, size_t length);
|
void Patch(void *address, void *patch, size_t length);
|
||||||
|
|
||||||
|
inline Vector GetAimAtAngles(Vector origin, Vector target)
|
||||||
|
{
|
||||||
|
Vector angles, tr;
|
||||||
|
tr = (target - origin);
|
||||||
|
VectorAngles(tr, angles);
|
||||||
|
fClampAngle(angles);
|
||||||
|
return angles;
|
||||||
|
}
|
||||||
void AimAt(Vector origin, Vector target, CUserCmd *cmd);
|
void AimAt(Vector origin, Vector target, CUserCmd *cmd);
|
||||||
void AimAtHitbox(CachedEntity *ent, int hitbox, CUserCmd *cmd);
|
void AimAtHitbox(CachedEntity *ent, int hitbox, CUserCmd *cmd);
|
||||||
bool IsProjectileCrit(CachedEntity *ent);
|
bool IsProjectileCrit(CachedEntity *ent);
|
||||||
|
@ -27,7 +27,9 @@ public:
|
|||||||
init = false;
|
init = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline virtual void SetParameters(KeyValues *params){}
|
inline virtual void SetParameters(KeyValues *params)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
virtual void Render(int x, int y, int w, int h);
|
virtual void Render(int x, int y, int w, int h);
|
||||||
|
|
||||||
|
@ -17,7 +17,8 @@ class EffectGlow : public IScreenSpaceEffect
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual void Init();
|
virtual void Init();
|
||||||
inline virtual void Shutdown(){
|
inline virtual void Shutdown()
|
||||||
|
{
|
||||||
mat_unlit.Shutdown();
|
mat_unlit.Shutdown();
|
||||||
mat_unlit_z.Shutdown();
|
mat_unlit_z.Shutdown();
|
||||||
mat_blit.Shutdown();
|
mat_blit.Shutdown();
|
||||||
@ -27,7 +28,9 @@ public:
|
|||||||
mat_blur_y.Shutdown();
|
mat_blur_y.Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline virtual void SetParameters(KeyValues *params){}
|
inline virtual void SetParameters(KeyValues *params)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
virtual void Render(int x, int y, int w, int h);
|
virtual void Render(int x, int y, int w, int h);
|
||||||
|
|
||||||
|
29
scripts/auto-updater
Executable file
29
scripts/auto-updater
Executable file
@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
LOCKFILE=/tmp/chupdater.lock
|
||||||
|
if [ -e ${LOCKFILE} ] && ps -p `cat ${LOCKFILE}` >/dev/null; then
|
||||||
|
echo -e "\033[1;31m \n \nAuto Updater: Auto Updater already running in the background\n\033[0m"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# make sure the lockfile is removed when we exit and then claim it
|
||||||
|
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
|
||||||
|
echo $$ > ${LOCKFILE}
|
||||||
|
|
||||||
|
echo -e "\033[1;34m \n \nAuto Updater: Updating cathook in the background\n\033[0m"
|
||||||
|
|
||||||
|
sudo -u $LOGNAME bash -c 'git fetch && git pull origin >/dev/null && git submodule update --init --recursive >/dev/null' || { echo -e "\033[1;31m \n \nAuto Updater: Failed to pull from github!\n\033[0m"; exit 1; }
|
||||||
|
|
||||||
|
pushd build >/dev/null || exit 1
|
||||||
|
|
||||||
|
if [ $(id -u) -eq 0 ]; then
|
||||||
|
cmake --build . --target data >/dev/null || { echo -e "\033[1;31m \n \nAuto Updater:Failed to update /opt/cathook/data directory\n\033[0m"; exit 1; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
sudo -u $LOGNAME bash -c 'cmake .. >/dev/null && nice -n 10 cmake --build . --target cathook -- -j 1 >/dev/null' || { echo -e "\033[1;31m \n \nAuto Updater: Failed to compile cathook\n\033[0m"; exit 1; }
|
||||||
|
|
||||||
|
rm -f ${LOCKFILE}
|
||||||
|
|
||||||
|
popd >/dev/null
|
||||||
|
|
||||||
|
echo -e "\n\n\033[1;34mAuto Updater: Cathook updated successfully\033[0m" && exit 0
|
@ -138,6 +138,9 @@ void NetVars::Init()
|
|||||||
gNetvars.get_offset("DT_ObjectTeleporter", "m_iTimesUsed");
|
gNetvars.get_offset("DT_ObjectTeleporter", "m_iTimesUsed");
|
||||||
this->m_flTeleYawToExit =
|
this->m_flTeleYawToExit =
|
||||||
gNetvars.get_offset("DT_ObjectTeleporter", "m_flYawToExit");
|
gNetvars.get_offset("DT_ObjectTeleporter", "m_flYawToExit");
|
||||||
|
this->m_bMatchBuilding =
|
||||||
|
gNetvars.get_offset("DT_ObjectTeleporter", "m_bMatchBuilding");
|
||||||
|
;
|
||||||
this->iPipeType =
|
this->iPipeType =
|
||||||
gNetvars.get_offset("DT_TFProjectile_Pipebomb", "m_iType");
|
gNetvars.get_offset("DT_TFProjectile_Pipebomb", "m_iType");
|
||||||
this->iBuildingHealth =
|
this->iBuildingHealth =
|
||||||
|
126
src/hack.cpp
126
src/hack.cpp
@ -5,22 +5,14 @@
|
|||||||
* Author: nullifiedcat
|
* Author: nullifiedcat
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// The code below was obtained from:
|
|
||||||
// http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes/1925461#1925461
|
|
||||||
#ifndef _GNU_SOURCE
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#endif
|
|
||||||
#ifndef __USE_GNU
|
|
||||||
#define __USE_GNU
|
#define __USE_GNU
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <execinfo.h>
|
#include <execinfo.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ucontext.h>
|
#include <dlfcn.h>
|
||||||
#include <unistd.h>
|
#include <boost/stacktrace.hpp>
|
||||||
|
#include <cxxabi.h>
|
||||||
#include <visual/SDLHooks.hpp>
|
#include <visual/SDLHooks.hpp>
|
||||||
#include "hack.hpp"
|
#include "hack.hpp"
|
||||||
#include "common.hpp"
|
#include "common.hpp"
|
||||||
@ -33,6 +25,7 @@
|
|||||||
|
|
||||||
#include "copypasted/CDumper.hpp"
|
#include "copypasted/CDumper.hpp"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
#include <cxxabi.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Credits to josh33901 aka F1ssi0N for butifel F1Public and Darkstorm 2015
|
* Credits to josh33901 aka F1ssi0N for butifel F1Public and Darkstorm 2015
|
||||||
@ -105,85 +98,56 @@ void hack::ExecuteCommand(const std::string command)
|
|||||||
hack::command_stack().push(command);
|
hack::command_stack().push(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This structure mirrors the one found in /usr/include/asm/ucontext.h */
|
void my_signal_handler(int signum)
|
||||||
typedef struct _sig_ucontext
|
|
||||||
{
|
{
|
||||||
unsigned long uc_flags;
|
namespace st = boost::stacktrace;
|
||||||
struct ucontext *uc_link;
|
::signal(signum, SIG_DFL);
|
||||||
stack_t uc_stack;
|
passwd *pwd = getpwuid(getuid());
|
||||||
struct sigcontext uc_mcontext;
|
std::ofstream out(
|
||||||
sigset_t uc_sigmask;
|
strfmt("/tmp/cathook-%s-%d-segfault.log", pwd->pw_name, getpid())
|
||||||
} sig_ucontext_t;
|
.get());
|
||||||
|
|
||||||
void crit_err_hdlr(int sig_num, siginfo_t *info, void *ucontext)
|
Dl_info info;
|
||||||
{
|
if (!dladdr(reinterpret_cast<void *>(SetCanshootStatus), &info))
|
||||||
void *array[50];
|
return;
|
||||||
void *caller_address;
|
unsigned int baseaddr = (unsigned int) info.dli_fbase;
|
||||||
char **messages;
|
|
||||||
int size, i;
|
|
||||||
sig_ucontext_t *uc;
|
|
||||||
|
|
||||||
uc = (sig_ucontext_t *) ucontext;
|
for (auto i : st::stacktrace())
|
||||||
|
|
||||||
/* Get the address at the time the signal was raised */
|
|
||||||
#if defined(__i386__) // gcc specific
|
|
||||||
caller_address = (void *) uc->uc_mcontext.eip; // EIP: x86 specific
|
|
||||||
#elif defined(__x86_64__) // gcc specific
|
|
||||||
caller_address = (void *) uc->uc_mcontext.rip; // RIP: x86_64 specific
|
|
||||||
#else
|
|
||||||
#error Unsupported architecture. // TODO: Add support for other arch.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
FILE *backtraceFile;
|
|
||||||
|
|
||||||
// In this example we write the stacktrace to a file. However, we can also
|
|
||||||
// just fprintf to stderr (or do both).
|
|
||||||
passwd *pwd = getpwuid(getuid());
|
|
||||||
backtraceFile = fopen(
|
|
||||||
strfmt("/tmp/cathook-%s-%d-segfault.log", pwd->pw_name, getpid()).get(),
|
|
||||||
"w");
|
|
||||||
|
|
||||||
if (sig_num == SIGSEGV)
|
|
||||||
fprintf(backtraceFile, "signal %d (%s), address is %p from %p\n",
|
|
||||||
sig_num, strsignal(sig_num), info->si_addr,
|
|
||||||
(void *) caller_address);
|
|
||||||
else
|
|
||||||
fprintf(backtraceFile, "signal %d (%s)\n", sig_num, strsignal(sig_num));
|
|
||||||
|
|
||||||
size = backtrace(array, 50);
|
|
||||||
/* overwrite sigaction with caller's address */
|
|
||||||
array[1] = caller_address;
|
|
||||||
messages = backtrace_symbols(array, size);
|
|
||||||
/* skip first stack frame (points here) */
|
|
||||||
for (i = 1; i < size && messages != NULL; ++i)
|
|
||||||
{
|
{
|
||||||
fprintf(backtraceFile, "[bt]: (%d) %s\n", i, messages[i]);
|
unsigned int offset = (unsigned int) (i.address()) - baseaddr;
|
||||||
|
Dl_info info2;
|
||||||
|
out << (void *)offset;
|
||||||
|
if (!dladdr(i.address(), &info2))
|
||||||
|
{
|
||||||
|
out << std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
out << " " << info2.dli_fname << ": ";
|
||||||
|
if (info2.dli_sname)
|
||||||
|
{
|
||||||
|
int status = -4;
|
||||||
|
char *realname =
|
||||||
|
abi::__cxa_demangle(info2.dli_sname, 0, 0, &status);
|
||||||
|
if (status == 0)
|
||||||
|
{
|
||||||
|
out << realname << std::endl;
|
||||||
|
free(realname);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
out << info2.dli_sname << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
out << "Not found!" << std ::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(backtraceFile);
|
out.close();
|
||||||
free(messages);
|
::raise(SIGABRT);
|
||||||
|
|
||||||
std::abort();
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void installSignal(int __sig)
|
|
||||||
{
|
|
||||||
struct sigaction sigact;
|
|
||||||
sigact.sa_sigaction = crit_err_hdlr;
|
|
||||||
sigact.sa_flags = SA_RESTART | SA_SIGINFO;
|
|
||||||
if (sigaction(__sig, &sigact, (struct sigaction *) NULL) != 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error setting signal handler for %d (%s)\n", __sig,
|
|
||||||
strsignal(__sig));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void hack::Initialize()
|
void hack::Initialize()
|
||||||
{
|
{
|
||||||
signal(SIGPIPE, SIG_IGN);
|
::signal(SIGSEGV, &my_signal_handler);
|
||||||
installSignal(SIGSEGV);
|
//::signal(SIGABRT, &my_signal_handler);
|
||||||
time_injected = time(nullptr);
|
time_injected = time(nullptr);
|
||||||
/*passwd *pwd = getpwuid(getuid());
|
/*passwd *pwd = getpwuid(getuid());
|
||||||
char *logname = strfmt("/tmp/cathook-game-stdout-%s-%u.log", pwd->pw_name,
|
char *logname = strfmt("/tmp/cathook-game-stdout-%s-%u.log", pwd->pw_name,
|
||||||
@ -339,6 +303,7 @@ free(logname);*/
|
|||||||
#if not LAGBOT_MODE
|
#if not LAGBOT_MODE
|
||||||
// FIXME [MP]
|
// FIXME [MP]
|
||||||
hacks::shared::killsay::init();
|
hacks::shared::killsay::init();
|
||||||
|
hacks::shared::dominatesay::init();
|
||||||
hacks::shared::announcer::init();
|
hacks::shared::announcer::init();
|
||||||
hacks::tf2::killstreak::init();
|
hacks::tf2::killstreak::init();
|
||||||
#endif
|
#endif
|
||||||
@ -431,6 +396,7 @@ void hack::Shutdown()
|
|||||||
#if not LAGBOT_MODE
|
#if not LAGBOT_MODE
|
||||||
logging::Info("Shutting down killsay...");
|
logging::Info("Shutting down killsay...");
|
||||||
hacks::shared::killsay::shutdown();
|
hacks::shared::killsay::shutdown();
|
||||||
|
hacks::shared::dominatesay::shutdown();
|
||||||
hacks::shared::announcer::shutdown();
|
hacks::shared::announcer::shutdown();
|
||||||
#endif
|
#endif
|
||||||
logging::Info("Success..");
|
logging::Info("Success..");
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* HAimbot.cpp
|
* HAimbot.cpp
|
||||||
*
|
*
|
||||||
* Created on: Oct 9, 2016
|
* Created on: Oct 9, 2016
|
||||||
@ -83,7 +83,7 @@ bool shouldBacktrack()
|
|||||||
|
|
||||||
bool IsBacktracking()
|
bool IsBacktracking()
|
||||||
{
|
{
|
||||||
return !(!aimkey || !aimkey.isKeyDown()) && shouldBacktrack();
|
return (aimkey ? aimkey.isKeyDown() : true) && shouldBacktrack();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Current Entity
|
// Current Entity
|
||||||
@ -118,7 +118,9 @@ void CreateMove()
|
|||||||
current_user_cmd->buttons |= IN_ATTACK2;
|
current_user_cmd->buttons |= IN_ATTACK2;
|
||||||
|
|
||||||
if (g_pLocalPlayer->weapon()->m_iClassID() == CL_CLASS(CTFMinigun))
|
if (g_pLocalPlayer->weapon()->m_iClassID() == CL_CLASS(CTFMinigun))
|
||||||
if (auto_spin_up && CE_INT(g_pLocalPlayer->weapon(), netvar.m_iClip1) != 0 && !zoomTime.check(1000))
|
if (auto_spin_up &&
|
||||||
|
CE_INT(g_pLocalPlayer->weapon(), netvar.m_iAmmo + 4) != 0 &&
|
||||||
|
!zoomTime.check(1000))
|
||||||
current_user_cmd->buttons |= IN_ATTACK2;
|
current_user_cmd->buttons |= IN_ATTACK2;
|
||||||
|
|
||||||
// We do this as we need to pass whether the aimkey allows aiming to both
|
// We do this as we need to pass whether the aimkey allows aiming to both
|
||||||
@ -406,7 +408,7 @@ CachedEntity *RetrieveBestTarget(bool aimkey_state)
|
|||||||
break;
|
break;
|
||||||
case 4: // Distance Priority (Furthest Away)
|
case 4: // Distance Priority (Furthest Away)
|
||||||
scr = calculated_data_array[i].aim_position.DistTo(
|
scr = calculated_data_array[i].aim_position.DistTo(
|
||||||
g_pLocalPlayer->v_Eye);
|
g_pLocalPlayer->v_Eye);
|
||||||
break;
|
break;
|
||||||
case 6: // Health Priority (Highest)
|
case 6: // Health Priority (Highest)
|
||||||
scr = ent->m_iHealth() * 4;
|
scr = ent->m_iHealth() * 4;
|
||||||
@ -428,7 +430,9 @@ CachedEntity *RetrieveBestTarget(bool aimkey_state)
|
|||||||
else if (hacks::shared::backtrack::iBestTarget != -1)
|
else if (hacks::shared::backtrack::iBestTarget != -1)
|
||||||
{
|
{
|
||||||
target_highest_ent = ENTITY(hacks::shared::backtrack::iBestTarget);
|
target_highest_ent = ENTITY(hacks::shared::backtrack::iBestTarget);
|
||||||
foundTarget = true;
|
if (!IsTargetStateGood(target_highest_ent))
|
||||||
|
target_highest_ent = nullptr;
|
||||||
|
foundTarget = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the ent for future use with target lock
|
// Save the ent for future use with target lock
|
||||||
@ -813,7 +817,7 @@ void DoAutoshoot()
|
|||||||
begancharge)
|
begancharge)
|
||||||
{
|
{
|
||||||
current_user_cmd->buttons &= ~IN_ATTACK;
|
current_user_cmd->buttons &= ~IN_ATTACK;
|
||||||
hacks::shared::antiaim::SetSafeSpace(3);
|
hacks::shared::antiaim::SetSafeSpace(5);
|
||||||
begancharge = false;
|
begancharge = false;
|
||||||
// Pull string if charge isnt enough
|
// Pull string if charge isnt enough
|
||||||
}
|
}
|
||||||
@ -836,7 +840,7 @@ void DoAutoshoot()
|
|||||||
if ((chargetime >= 3.85f * *sticky_autoshoot) && begansticky > 3)
|
if ((chargetime >= 3.85f * *sticky_autoshoot) && begansticky > 3)
|
||||||
{
|
{
|
||||||
current_user_cmd->buttons &= ~IN_ATTACK;
|
current_user_cmd->buttons &= ~IN_ATTACK;
|
||||||
hacks::shared::antiaim::SetSafeSpace(3);
|
hacks::shared::antiaim::SetSafeSpace(5);
|
||||||
begansticky = 0;
|
begansticky = 0;
|
||||||
}
|
}
|
||||||
// Else just keep charging
|
// Else just keep charging
|
||||||
@ -1149,20 +1153,17 @@ bool VischeckPredictedEntity(CachedEntity *entity)
|
|||||||
// Retrieve predicted data
|
// Retrieve predicted data
|
||||||
AimbotCalculatedData_s &cd = calculated_data_array[entity->m_IDX];
|
AimbotCalculatedData_s &cd = calculated_data_array[entity->m_IDX];
|
||||||
if (cd.vcheck_tick == tickcount)
|
if (cd.vcheck_tick == tickcount)
|
||||||
return cd.visible;
|
{
|
||||||
|
if (!shouldBacktrack() || projectile_mode)
|
||||||
|
return cd.visible;
|
||||||
|
}
|
||||||
|
|
||||||
// Update info
|
// Update info
|
||||||
cd.vcheck_tick = tickcount;
|
cd.vcheck_tick = tickcount;
|
||||||
if (!shouldBacktrack() || projectile_mode)
|
if (!shouldBacktrack() || projectile_mode)
|
||||||
cd.visible = IsEntityVectorVisible(entity, PredictEntity(entity));
|
cd.visible = IsEntityVectorVisible(entity, PredictEntity(entity));
|
||||||
else
|
else
|
||||||
cd.visible = IsVectorVisible(
|
cd.visible = hacks::shared::backtrack::Vischeck_Success;
|
||||||
g_pLocalPlayer->v_Eye,
|
|
||||||
hacks::shared::backtrack::headPositions
|
|
||||||
[entity->m_IDX][hacks::shared::backtrack::BestTick]
|
|
||||||
.hitboxes[cd.hitbox]
|
|
||||||
.center,
|
|
||||||
true);
|
|
||||||
return cd.visible;
|
return cd.visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1277,7 +1278,7 @@ float EffectiveTargetingRange()
|
|||||||
if (GetWeaponMode() == weapon_melee)
|
if (GetWeaponMode() == weapon_melee)
|
||||||
return (float) re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
|
return (float) re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
|
||||||
if (g_pLocalPlayer->weapon()->m_iClassID() == CL_CLASS(CTFFlameThrower))
|
if (g_pLocalPlayer->weapon()->m_iClassID() == CL_CLASS(CTFFlameThrower))
|
||||||
return 185.0f; // Pyros only have so much untill their flames hit
|
return 310.0f; // Pyros only have so much until their flames hit
|
||||||
|
|
||||||
return (float) max_range;
|
return (float) max_range;
|
||||||
}
|
}
|
||||||
|
@ -66,19 +66,36 @@ CachedEntity *ClosestSpy()
|
|||||||
continue;
|
continue;
|
||||||
if (CE_BYTE(ent, netvar.iLifeState))
|
if (CE_BYTE(ent, netvar.iLifeState))
|
||||||
continue;
|
continue;
|
||||||
|
bool ispyro = false;
|
||||||
|
bool isheavy = false;
|
||||||
if (CE_INT(ent, netvar.iClass) != tf_class::tf_spy)
|
if (CE_INT(ent, netvar.iClass) != tf_class::tf_spy)
|
||||||
continue;
|
{
|
||||||
|
if (CE_INT(ent, netvar.iClass) != tf_class::tf_pyro && CE_INT(ent, netvar.iClass) != tf_class::tf_heavy)
|
||||||
|
continue;
|
||||||
|
int idx = CE_INT(ent, netvar.hActiveWeapon) & 0xFFF;
|
||||||
|
if (IDX_BAD(idx))
|
||||||
|
continue;
|
||||||
|
CachedEntity *pyro_weapon = ENTITY(idx);
|
||||||
|
int widx = CE_INT(pyro_weapon, netvar.iItemDefinitionIndex);
|
||||||
|
if (widx != 40 && widx != 1146 && widx != 656)
|
||||||
|
continue;
|
||||||
|
if (widx == 656)
|
||||||
|
isheavy = true;
|
||||||
|
ispyro = true;
|
||||||
|
}
|
||||||
if (CE_INT(ent, netvar.iTeamNum) == g_pLocalPlayer->team)
|
if (CE_INT(ent, netvar.iTeamNum) == g_pLocalPlayer->team)
|
||||||
continue;
|
continue;
|
||||||
if (IsPlayerInvisible(ent))
|
if (IsPlayerInvisible(ent))
|
||||||
continue;
|
continue;
|
||||||
dist = ent->m_flDistance();
|
dist = ent->m_flDistance();
|
||||||
if (fabs(GetAngle(ent)) > (float) angle)
|
if (fabs(GetAngle(ent)) > (float) angle || (ispyro && !isheavy && fabs(GetAngle(ent)) > 90.0f) || (isheavy && fabs(GetAngle(ent)) > 132.0f))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
// logging::Info("Backstab???");
|
// logging::Info("Backstab???");
|
||||||
}
|
}
|
||||||
if (dist < (float) distance && (dist < closest_dist || !closest_dist))
|
if ((((!ispyro && dist < (float) distance)) ||
|
||||||
|
(ispyro && !isheavy && dist < 314.0f) || (isheavy && dist < 120.0f)) &&
|
||||||
|
(dist < closest_dist || !closest_dist))
|
||||||
{
|
{
|
||||||
closest_dist = dist;
|
closest_dist = dist;
|
||||||
closest = ent;
|
closest = ent;
|
||||||
@ -97,8 +114,14 @@ void CreateMove()
|
|||||||
spy = ClosestSpy();
|
spy = ClosestSpy();
|
||||||
if (spy)
|
if (spy)
|
||||||
{
|
{
|
||||||
noaa = true;
|
noaa = true;
|
||||||
current_user_cmd->viewangles.x = 160.0f;
|
if (current_user_cmd->buttons & IN_ATTACK)
|
||||||
|
return;
|
||||||
|
const Vector &A = LOCAL_E->m_vecOrigin();
|
||||||
|
const Vector &B = spy->m_vecOrigin();
|
||||||
|
diff = (A - B);
|
||||||
|
if (diff.y < 0 || CE_INT(spy, netvar.iClass) == tf_class::tf_heavy)
|
||||||
|
current_user_cmd->viewangles.x = 180.0f;
|
||||||
if (silent)
|
if (silent)
|
||||||
g_pLocalPlayer->bUseSilentAngles = true;
|
g_pLocalPlayer->bUseSilentAngles = true;
|
||||||
if (sayno)
|
if (sayno)
|
||||||
|
@ -19,17 +19,6 @@ namespace backtrack = hacks::shared::backtrack;
|
|||||||
static settings::Bool enable{ "autobackstab.enable", "0" };
|
static settings::Bool enable{ "autobackstab.enable", "0" };
|
||||||
static settings::Bool silent{ "autobackstab.silent", "1" };
|
static settings::Bool silent{ "autobackstab.silent", "1" };
|
||||||
void testingFunc();
|
void testingFunc();
|
||||||
void AngleVectors2(const QAngle &angles, Vector *forward)
|
|
||||||
{
|
|
||||||
float sp, sy, cp, cy;
|
|
||||||
|
|
||||||
SinCos(DEG2RAD(angles[YAW]), &sy, &cy);
|
|
||||||
SinCos(DEG2RAD(angles[PITCH]), &sp, &cp);
|
|
||||||
|
|
||||||
forward->x = cp * cy;
|
|
||||||
forward->y = cp * sy;
|
|
||||||
forward->z = -sp;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not required anymore, keeping for future reference
|
// Not required anymore, keeping for future reference
|
||||||
Vector rotateVector(Vector center, float radianAngle, Vector p)
|
Vector rotateVector(Vector center, float radianAngle, Vector p)
|
||||||
@ -233,7 +222,6 @@ void CreateMove()
|
|||||||
current_user_cmd->buttons |= IN_ATTACK;
|
current_user_cmd->buttons |= IN_ATTACK;
|
||||||
if (silent)
|
if (silent)
|
||||||
g_pLocalPlayer->bUseSilentAngles = true;
|
g_pLocalPlayer->bUseSilentAngles = true;
|
||||||
logging::Info("Success on tick %i", j);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ bool IsProjectile(CachedEntity *ent)
|
|||||||
int NearbyEntities()
|
int NearbyEntities()
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
if (CE_BAD(LOCAL_E))
|
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W))
|
||||||
return ret;
|
return ret;
|
||||||
for (int i = 0; i < HIGHEST_ENTITY; i++)
|
for (int i = 0; i < HIGHEST_ENTITY; i++)
|
||||||
{
|
{
|
||||||
@ -48,7 +48,7 @@ void CreateMove()
|
|||||||
{
|
{
|
||||||
if (!enable)
|
if (!enable)
|
||||||
return;
|
return;
|
||||||
if (CE_BAD(LOCAL_E))
|
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W))
|
||||||
return;
|
return;
|
||||||
if (g_pLocalPlayer->clazz != tf_spy)
|
if (g_pLocalPlayer->clazz != tf_spy)
|
||||||
return;
|
return;
|
||||||
|
@ -232,7 +232,7 @@ bool IsProjectile(CachedEntity *ent)
|
|||||||
int NearbyEntities()
|
int NearbyEntities()
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
if (CE_BAD(LOCAL_E))
|
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W))
|
||||||
return ret;
|
return ret;
|
||||||
for (int i = 0; i < HIGHEST_ENTITY; i++)
|
for (int i = 0; i < HIGHEST_ENTITY; i++)
|
||||||
{
|
{
|
||||||
|
@ -32,6 +32,7 @@ BacktrackData headPositions[32][66]{};
|
|||||||
int highesttick[32]{};
|
int highesttick[32]{};
|
||||||
int lastincomingsequencenumber = 0;
|
int lastincomingsequencenumber = 0;
|
||||||
bool isBacktrackEnabled = false;
|
bool isBacktrackEnabled = false;
|
||||||
|
bool Vischeck_Success = false;
|
||||||
|
|
||||||
circular_buf sequences{ 2048 };
|
circular_buf sequences{ 2048 };
|
||||||
void UpdateIncomingSequences()
|
void UpdateIncomingSequences()
|
||||||
@ -88,7 +89,7 @@ void Run()
|
|||||||
}
|
}
|
||||||
isBacktrackEnabled = true;
|
isBacktrackEnabled = true;
|
||||||
|
|
||||||
if (CE_BAD(LOCAL_E))
|
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W))
|
||||||
return;
|
return;
|
||||||
if (g_Settings.bInvalid)
|
if (g_Settings.bInvalid)
|
||||||
return;
|
return;
|
||||||
@ -307,8 +308,10 @@ void EmptyBacktrackData(BacktrackData &i)
|
|||||||
// This func is internal only
|
// This func is internal only
|
||||||
std::pair<int, int> getBestEntBestTick()
|
std::pair<int, int> getBestEntBestTick()
|
||||||
{
|
{
|
||||||
int bestEnt = -1;
|
int bestEnt = -1;
|
||||||
int bestTick = -1;
|
int bestTick = -1;
|
||||||
|
bool vischeck_priority = false;
|
||||||
|
Vischeck_Success = false;
|
||||||
if (GetWeaponMode() == weapon_melee)
|
if (GetWeaponMode() == weapon_melee)
|
||||||
{
|
{
|
||||||
float bestDist = 9999.0f;
|
float bestDist = 9999.0f;
|
||||||
@ -328,11 +331,25 @@ std::pair<int, int> getBestEntBestTick()
|
|||||||
headPositions[i][j]
|
headPositions[i][j]
|
||||||
.hitboxes.at(spine_3)
|
.hitboxes.at(spine_3)
|
||||||
.center.DistTo(g_pLocalPlayer->v_Eye);
|
.center.DistTo(g_pLocalPlayer->v_Eye);
|
||||||
if (dist < bestDist && dist > *mindistance)
|
if (dist > bestDist && vischeck_priority)
|
||||||
|
continue;
|
||||||
|
bool Vischeck_suceeded = IsVectorVisible(
|
||||||
|
g_pLocalPlayer->v_Eye,
|
||||||
|
headPositions[i][j].hitboxes.at(0).center,
|
||||||
|
true);
|
||||||
|
if (((dist < bestDist) ||
|
||||||
|
(Vischeck_suceeded && !vischeck_priority)) &&
|
||||||
|
dist > *mindistance &&
|
||||||
|
(vischeck_priority ? Vischeck_suceeded : true))
|
||||||
{
|
{
|
||||||
bestEnt = i;
|
bestEnt = i;
|
||||||
bestTick = j;
|
bestTick = j;
|
||||||
bestDist = dist;
|
bestDist = dist;
|
||||||
|
if (Vischeck_suceeded)
|
||||||
|
{
|
||||||
|
Vischeck_Success = true;
|
||||||
|
vischeck_priority = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -358,6 +375,7 @@ std::pair<int, int> getBestEntBestTick()
|
|||||||
g_pLocalPlayer->v_OrigViewangles,
|
g_pLocalPlayer->v_OrigViewangles,
|
||||||
g_pLocalPlayer->v_Eye,
|
g_pLocalPlayer->v_Eye,
|
||||||
headPositions[i][j].hitboxes.at(head).center);
|
headPositions[i][j].hitboxes.at(head).center);
|
||||||
|
Vischeck_Success = true;
|
||||||
if (bestFov > FOVDistance)
|
if (bestFov > FOVDistance)
|
||||||
{
|
{
|
||||||
bestFov = FOVDistance;
|
bestFov = FOVDistance;
|
||||||
|
@ -26,6 +26,7 @@ if(NOT LagbotMode)
|
|||||||
"${CMAKE_CURRENT_LIST_DIR}/Backtrack.cpp"
|
"${CMAKE_CURRENT_LIST_DIR}/Backtrack.cpp"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/FollowBot.cpp"
|
"${CMAKE_CURRENT_LIST_DIR}/FollowBot.cpp"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/KillSay.cpp"
|
"${CMAKE_CURRENT_LIST_DIR}/KillSay.cpp"
|
||||||
|
"${CMAKE_CURRENT_LIST_DIR}/DominateSay.cpp"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/Killstreak.cpp"
|
"${CMAKE_CURRENT_LIST_DIR}/Killstreak.cpp"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/LightESP.cpp"
|
"${CMAKE_CURRENT_LIST_DIR}/LightESP.cpp"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/Misc.cpp"
|
"${CMAKE_CURRENT_LIST_DIR}/Misc.cpp"
|
||||||
|
@ -301,7 +301,7 @@ static HookedFunction cm(HF_CreateMove, "catbot", 5, []() {
|
|||||||
if (g_Settings.bInvalid)
|
if (g_Settings.bInvalid)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (CE_BAD(LOCAL_E))
|
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (*auto_crouch)
|
if (*auto_crouch)
|
||||||
|
141
src/hacks/DominateSay.cpp
Normal file
141
src/hacks/DominateSay.cpp
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
/*
|
||||||
|
* DominateSay.cpp
|
||||||
|
*
|
||||||
|
* Created on: October 30, 2018
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <hacks/DominateSay.hpp>
|
||||||
|
#include <settings/Int.hpp>
|
||||||
|
#include "common.hpp"
|
||||||
|
|
||||||
|
static settings::Int dominatesay_mode{ "dominatesay.mode", "0" };
|
||||||
|
static settings::String filename{ "dominatesay.file", "dominatesay.txt" };
|
||||||
|
|
||||||
|
static CatCommand reload_command("dominatesay_reload", "Reload dominatesays",
|
||||||
|
[]() {
|
||||||
|
hacks::shared::dominatesay::reload();
|
||||||
|
});
|
||||||
|
|
||||||
|
namespace hacks::shared::dominatesay
|
||||||
|
{
|
||||||
|
|
||||||
|
const std::string tf_classes_dominatesay[] = { "class", "scout", "sniper",
|
||||||
|
"soldier", "demoman", "medic",
|
||||||
|
"heavy", "pyro", "spy",
|
||||||
|
"engineer" };
|
||||||
|
|
||||||
|
const std::string tf_teams_dominatesay[] = { "RED", "BLU" };
|
||||||
|
|
||||||
|
static std::string lastmsg{};
|
||||||
|
|
||||||
|
TextFile file{};
|
||||||
|
|
||||||
|
std::string ComposeDominateSay(IGameEvent *event)
|
||||||
|
{
|
||||||
|
const std::vector<std::string> *source = nullptr;
|
||||||
|
switch (*dominatesay_mode)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
source = &file.lines;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
source = &builtin_default;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
source = &jp_anime;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!source || source->empty())
|
||||||
|
return "";
|
||||||
|
if (!event)
|
||||||
|
return "";
|
||||||
|
int vid = event->GetInt("dominated");
|
||||||
|
int kid = event->GetInt("dominator");
|
||||||
|
int dnum = event->GetInt("dominations");
|
||||||
|
|
||||||
|
// this is actually impossible but just in case.
|
||||||
|
if (g_IEngine->GetPlayerForUserID(kid) != g_IEngine->GetLocalPlayer())
|
||||||
|
return "";
|
||||||
|
|
||||||
|
std::string msg = source->at(rand() % source->size());
|
||||||
|
|
||||||
|
while (msg == lastmsg && source->size() > 1)
|
||||||
|
msg = source->at(rand() % source->size());
|
||||||
|
lastmsg = msg;
|
||||||
|
player_info_s info{};
|
||||||
|
|
||||||
|
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(vid), &info);
|
||||||
|
ReplaceString(msg, "%name%", std::string(info.name));
|
||||||
|
|
||||||
|
CachedEntity *ent = ENTITY(g_IEngine->GetPlayerForUserID(vid));
|
||||||
|
int clz = g_pPlayerResource->GetClass(ent);
|
||||||
|
|
||||||
|
ReplaceString(msg, "%class%", tf_classes_dominatesay[clz]);
|
||||||
|
player_info_s infok{};
|
||||||
|
g_IEngine->GetPlayerInfo(g_IEngine->GetPlayerForUserID(kid), &infok);
|
||||||
|
|
||||||
|
ReplaceString(msg, "%dominum%", std::to_string(dnum));
|
||||||
|
ReplaceString(msg, "%killer%", std::string(infok.name));
|
||||||
|
ReplaceString(msg, "%team%", tf_teams_dominatesay[ent->m_iTeam() - 2]);
|
||||||
|
ReplaceString(msg, "%myteam%",
|
||||||
|
tf_teams_dominatesay[LOCAL_E->m_iTeam() - 2]);
|
||||||
|
ReplaceString(msg, "%myclass%",
|
||||||
|
tf_classes_dominatesay[g_pPlayerResource->GetClass(LOCAL_E)]);
|
||||||
|
ReplaceString(msg, "\\n", "\n");
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DominateSayEventListener : public IGameEventListener2
|
||||||
|
{
|
||||||
|
void FireGameEvent(IGameEvent *event) override
|
||||||
|
{
|
||||||
|
if (!dominatesay_mode)
|
||||||
|
return;
|
||||||
|
std::string message =
|
||||||
|
hacks::shared::dominatesay::ComposeDominateSay(event);
|
||||||
|
if (!message.empty())
|
||||||
|
chat_stack::Say(message, false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static DominateSayEventListener listener{};
|
||||||
|
|
||||||
|
void reload()
|
||||||
|
{
|
||||||
|
file.Load(*filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
g_IEventManager2->AddListener(&listener, (const char *) "player_domination",
|
||||||
|
false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void shutdown()
|
||||||
|
{
|
||||||
|
g_IEventManager2->RemoveListener(&listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
// a much better default dominatesay would be appreciated.
|
||||||
|
const std::vector<std::string> builtin_default = {
|
||||||
|
"dominating %name%! (%dominum% dominations)",
|
||||||
|
"%name%, getting tapped?",
|
||||||
|
"%killer% is dominating the server with %dominum% dominations!",
|
||||||
|
};
|
||||||
|
|
||||||
|
// same goes to this one
|
||||||
|
const std::vector<std::string> jp_anime = {
|
||||||
|
"Get d-dominated %name%-senpai >:3",
|
||||||
|
"g- gomenasai! %name%-san!",
|
||||||
|
"Wow! hey hey hey H~ ey !!! I found you again~~!",
|
||||||
|
"%name%-san please don't get mad at me.. ><",
|
||||||
|
// https://youtu.be/sW3RT0tF020?t=207
|
||||||
|
"kore kara mo douzo yoroshiku ne.",
|
||||||
|
"konna watashi dakedo waratte yurushite ne.",
|
||||||
|
"zutto taisetsu ni shite ne.",
|
||||||
|
"eikyuu hoshou no watashi dakara.",
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace hacks::shared::dominatesay
|
@ -252,7 +252,7 @@ static HookedFunction
|
|||||||
// Check usersettings if enabled
|
// Check usersettings if enabled
|
||||||
if (!*enable)
|
if (!*enable)
|
||||||
return;
|
return;
|
||||||
if (CE_BAD(LOCAL_E))
|
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W))
|
||||||
return;
|
return;
|
||||||
// Something
|
// Something
|
||||||
std::lock_guard<std::mutex> esp_lock(threadsafe_mutex);
|
std::lock_guard<std::mutex> esp_lock(threadsafe_mutex);
|
||||||
|
@ -208,7 +208,7 @@ static HookedFunction
|
|||||||
init();
|
init();
|
||||||
|
|
||||||
// We need a local player to control
|
// We need a local player to control
|
||||||
if (CE_BAD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer())
|
if (CE_BAD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer() || CE_BAD(LOCAL_W))
|
||||||
{
|
{
|
||||||
follow_target = 0;
|
follow_target = 0;
|
||||||
return;
|
return;
|
||||||
@ -231,7 +231,8 @@ static HookedFunction
|
|||||||
}
|
}
|
||||||
if (CE_GOOD(ENTITY(follow_target)) && navtime.test_and_set(2000))
|
if (CE_GOOD(ENTITY(follow_target)) && navtime.test_and_set(2000))
|
||||||
{
|
{
|
||||||
if (nav::navTo(ENTITY(follow_target)->m_vecOrigin(), 5, true, false))
|
if (nav::navTo(ENTITY(follow_target)->m_vecOrigin(), 5, true,
|
||||||
|
false))
|
||||||
{
|
{
|
||||||
navtimeout.update();
|
navtimeout.update();
|
||||||
}
|
}
|
||||||
@ -264,180 +265,184 @@ static HookedFunction
|
|||||||
// Target Selection
|
// Target Selection
|
||||||
{
|
{
|
||||||
|
|
||||||
if (steamid &&
|
if (steamid &&
|
||||||
((follow_target &&
|
((follow_target &&
|
||||||
ENTITY(follow_target)->player_info.friendsID != steamid) ||
|
ENTITY(follow_target)->player_info.friendsID != steamid) ||
|
||||||
!follow_target))
|
!follow_target))
|
||||||
{
|
|
||||||
// Find a target with the steam id, as it is prioritized
|
|
||||||
auto ent_count = g_IEngine->GetMaxClients();
|
|
||||||
for (int i = 0; i < ent_count; i++)
|
|
||||||
{
|
{
|
||||||
auto entity = ENTITY(i);
|
// Find a target with the steam id, as it is prioritized
|
||||||
if (CE_BAD(entity)) // Exist + dormant
|
auto ent_count = g_IEngine->GetMaxClients();
|
||||||
continue;
|
for (int i = 0; i < ent_count; i++)
|
||||||
if (i == follow_target)
|
|
||||||
continue;
|
|
||||||
if (entity->m_Type() != ENTITY_PLAYER)
|
|
||||||
continue;
|
|
||||||
if (steamid != entity->player_info.friendsID) // steamid check
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!entity->m_bAlivePlayer()) // Dont follow dead players
|
|
||||||
continue;
|
|
||||||
bool found = false;
|
|
||||||
if (corneractivate)
|
|
||||||
{
|
{
|
||||||
Vector indirectOrigin = VischeckCorner(
|
auto entity = ENTITY(i);
|
||||||
LOCAL_E, entity, *follow_activation / 2,
|
if (CE_BAD(entity)) // Exist + dormant
|
||||||
true); // get the corner location that the
|
|
||||||
// future target is visible from
|
|
||||||
std::pair<Vector, Vector> corners;
|
|
||||||
if (!indirectOrigin.z &&
|
|
||||||
entity->m_IDX == lastent) // if we couldn't find it, run
|
|
||||||
// wallcheck instead
|
|
||||||
{
|
|
||||||
corners =
|
|
||||||
VischeckWall(LOCAL_E, entity,
|
|
||||||
float(follow_activation) / 2, true);
|
|
||||||
if (!corners.first.z || !corners.second.z)
|
|
||||||
continue;
|
|
||||||
// addCrumbs(LOCAL_E, corners.first);
|
|
||||||
// addCrumbs(entity, corners.second);
|
|
||||||
addCrumbPair(LOCAL_E, entity, corners);
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
if (indirectOrigin.z)
|
|
||||||
{
|
|
||||||
addCrumbs(entity, indirectOrigin);
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (VisCheckEntFromEnt(LOCAL_E, entity))
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
if (isNavBotCM && !found)
|
|
||||||
{
|
|
||||||
if (!nav::navTo(entity->m_vecOrigin()))
|
|
||||||
continue;
|
continue;
|
||||||
navtimeout.update();
|
if (i == follow_target)
|
||||||
found = true;
|
continue;
|
||||||
|
if (entity->m_Type() != ENTITY_PLAYER)
|
||||||
|
continue;
|
||||||
|
if (steamid !=
|
||||||
|
entity->player_info.friendsID) // steamid check
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!entity->m_bAlivePlayer()) // Dont follow dead players
|
||||||
|
continue;
|
||||||
|
bool found = false;
|
||||||
|
if (corneractivate)
|
||||||
|
{
|
||||||
|
Vector indirectOrigin = VischeckCorner(
|
||||||
|
LOCAL_E, entity, *follow_activation / 2,
|
||||||
|
true); // get the corner location that the
|
||||||
|
// future target is visible from
|
||||||
|
std::pair<Vector, Vector> corners;
|
||||||
|
if (!indirectOrigin.z &&
|
||||||
|
entity->m_IDX ==
|
||||||
|
lastent) // if we couldn't find it, run
|
||||||
|
// wallcheck instead
|
||||||
|
{
|
||||||
|
corners = VischeckWall(LOCAL_E, entity,
|
||||||
|
float(follow_activation) / 2,
|
||||||
|
true);
|
||||||
|
if (!corners.first.z || !corners.second.z)
|
||||||
|
continue;
|
||||||
|
// addCrumbs(LOCAL_E, corners.first);
|
||||||
|
// addCrumbs(entity, corners.second);
|
||||||
|
addCrumbPair(LOCAL_E, entity, corners);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if (indirectOrigin.z)
|
||||||
|
{
|
||||||
|
addCrumbs(entity, indirectOrigin);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (VisCheckEntFromEnt(LOCAL_E, entity))
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if (isNavBotCM && !found)
|
||||||
|
{
|
||||||
|
if (!nav::navTo(entity->m_vecOrigin()))
|
||||||
|
continue;
|
||||||
|
navtimeout.update();
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
continue;
|
||||||
|
follow_target = entity->m_IDX;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (!found)
|
|
||||||
continue;
|
|
||||||
follow_target = entity->m_IDX;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// If we dont have a follow target from that, we look again for someone
|
// If we dont have a follow target from that, we look again for someone
|
||||||
// else who is suitable
|
// else who is suitable
|
||||||
{
|
{
|
||||||
if ((!follow_target || change ||
|
if ((!follow_target || change ||
|
||||||
(ClassPriority(ENTITY(follow_target)) < 6 &&
|
(ClassPriority(ENTITY(follow_target)) < 6 &&
|
||||||
ENTITY(follow_target)->player_info.friendsID != steamid)) &&
|
ENTITY(follow_target)->player_info.friendsID != steamid)) &&
|
||||||
roambot)
|
roambot)
|
||||||
{
|
|
||||||
// Try to get a new target
|
|
||||||
auto ent_count =
|
|
||||||
followcart ? HIGHEST_ENTITY : g_IEngine->GetMaxClients();
|
|
||||||
for (int i = 0; i < ent_count; i++)
|
|
||||||
{
|
{
|
||||||
auto entity = ENTITY(i);
|
// Try to get a new target
|
||||||
if (CE_BAD(entity)) // Exist + dormant
|
auto ent_count =
|
||||||
continue;
|
followcart ? HIGHEST_ENTITY : g_IEngine->GetMaxClients();
|
||||||
if (!followcart)
|
for (int i = 0; i < ent_count; i++)
|
||||||
|
{
|
||||||
|
auto entity = ENTITY(i);
|
||||||
|
if (CE_BAD(entity)) // Exist + dormant
|
||||||
|
continue;
|
||||||
|
if (!followcart)
|
||||||
|
if (entity->m_Type() != ENTITY_PLAYER)
|
||||||
|
continue;
|
||||||
|
if (entity == LOCAL_E) // Follow self lol
|
||||||
|
continue;
|
||||||
|
if (entity->m_bEnemy())
|
||||||
|
continue;
|
||||||
|
if (afk && afkTicks[i].check(
|
||||||
|
int(afktime))) // don't follow target that
|
||||||
|
// was determined afk
|
||||||
|
continue;
|
||||||
|
if (IsPlayerDisguised(entity) || IsPlayerInvisible(entity))
|
||||||
|
continue;
|
||||||
|
if (!entity->m_bAlivePlayer()) // Dont follow dead players
|
||||||
|
continue;
|
||||||
|
if (follow_activation &&
|
||||||
|
entity->m_flDistance() > (float) follow_activation)
|
||||||
|
continue;
|
||||||
|
const model_t *model =
|
||||||
|
ENTITY(follow_target)->InternalEntity()->GetModel();
|
||||||
|
// FIXME follow cart/point
|
||||||
|
/*if (followcart && model &&
|
||||||
|
(lagexploit::pointarr[0] || lagexploit::pointarr[1] ||
|
||||||
|
lagexploit::pointarr[2] || lagexploit::pointarr[3] ||
|
||||||
|
lagexploit::pointarr[4]) &&
|
||||||
|
(model == lagexploit::pointarr[0] ||
|
||||||
|
model == lagexploit::pointarr[1] ||
|
||||||
|
model == lagexploit::pointarr[2] ||
|
||||||
|
model == lagexploit::pointarr[3] ||
|
||||||
|
model == lagexploit::pointarr[4]))
|
||||||
|
follow_target = entity->m_IDX;*/
|
||||||
if (entity->m_Type() != ENTITY_PLAYER)
|
if (entity->m_Type() != ENTITY_PLAYER)
|
||||||
continue;
|
continue;
|
||||||
if (entity == LOCAL_E) // Follow self lol
|
// favor closer entitys
|
||||||
continue;
|
if (follow_target &&
|
||||||
if (entity->m_bEnemy())
|
ENTITY(follow_target)->m_flDistance() <
|
||||||
continue;
|
entity->m_flDistance()) // favor closer entitys
|
||||||
if (afk &&
|
|
||||||
afkTicks[i].check(int(afktime))) // don't follow target that
|
|
||||||
// was determined afk
|
|
||||||
continue;
|
|
||||||
if (IsPlayerDisguised(entity) || IsPlayerInvisible(entity))
|
|
||||||
continue;
|
|
||||||
if (!entity->m_bAlivePlayer()) // Dont follow dead players
|
|
||||||
continue;
|
|
||||||
if (follow_activation &&
|
|
||||||
entity->m_flDistance() > (float) follow_activation)
|
|
||||||
continue;
|
|
||||||
const model_t *model =
|
|
||||||
ENTITY(follow_target)->InternalEntity()->GetModel();
|
|
||||||
// FIXME follow cart/point
|
|
||||||
/*if (followcart && model &&
|
|
||||||
(lagexploit::pointarr[0] || lagexploit::pointarr[1] ||
|
|
||||||
lagexploit::pointarr[2] || lagexploit::pointarr[3] ||
|
|
||||||
lagexploit::pointarr[4]) &&
|
|
||||||
(model == lagexploit::pointarr[0] ||
|
|
||||||
model == lagexploit::pointarr[1] ||
|
|
||||||
model == lagexploit::pointarr[2] ||
|
|
||||||
model == lagexploit::pointarr[3] ||
|
|
||||||
model == lagexploit::pointarr[4]))
|
|
||||||
follow_target = entity->m_IDX;*/
|
|
||||||
if (entity->m_Type() != ENTITY_PLAYER)
|
|
||||||
continue;
|
|
||||||
// favor closer entitys
|
|
||||||
if (follow_target &&
|
|
||||||
ENTITY(follow_target)->m_flDistance() <
|
|
||||||
entity->m_flDistance()) // favor closer entitys
|
|
||||||
continue;
|
|
||||||
// check if new target has a higher priority than current target
|
|
||||||
if (ClassPriority(ENTITY(follow_target)) >=
|
|
||||||
ClassPriority(ENTITY(i)))
|
|
||||||
continue;
|
|
||||||
bool found = false;
|
|
||||||
if (corneractivate)
|
|
||||||
{
|
|
||||||
Vector indirectOrigin = VischeckCorner(
|
|
||||||
LOCAL_E, entity, *follow_activation / 2,
|
|
||||||
true); // get the corner location that the
|
|
||||||
// future target is visible from
|
|
||||||
std::pair<Vector, Vector> corners;
|
|
||||||
if (!indirectOrigin.z &&
|
|
||||||
entity->m_IDX == lastent) // if we couldn't find it, run
|
|
||||||
// wallcheck instead
|
|
||||||
{
|
|
||||||
corners =
|
|
||||||
VischeckWall(LOCAL_E, entity,
|
|
||||||
float(follow_activation) / 2, true);
|
|
||||||
if (!corners.first.z || !corners.second.z)
|
|
||||||
continue;
|
|
||||||
// addCrumbs(LOCAL_E, corners.first);
|
|
||||||
// addCrumbs(entity, corners.second);
|
|
||||||
addCrumbPair(LOCAL_E, entity, corners);
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
if (indirectOrigin.z)
|
|
||||||
{
|
|
||||||
addCrumbs(entity, indirectOrigin);
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (VisCheckEntFromEnt(LOCAL_E, entity))
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
if (isNavBotCM && !found)
|
|
||||||
{
|
|
||||||
if (!nav::navTo(entity->m_vecOrigin()))
|
|
||||||
continue;
|
continue;
|
||||||
navtimeout.update();
|
// check if new target has a higher priority than current
|
||||||
found = true;
|
// target
|
||||||
|
if (ClassPriority(ENTITY(follow_target)) >=
|
||||||
|
ClassPriority(ENTITY(i)))
|
||||||
|
continue;
|
||||||
|
bool found = false;
|
||||||
|
if (corneractivate)
|
||||||
|
{
|
||||||
|
Vector indirectOrigin = VischeckCorner(
|
||||||
|
LOCAL_E, entity, *follow_activation / 2,
|
||||||
|
true); // get the corner location that the
|
||||||
|
// future target is visible from
|
||||||
|
std::pair<Vector, Vector> corners;
|
||||||
|
if (!indirectOrigin.z &&
|
||||||
|
entity->m_IDX ==
|
||||||
|
lastent) // if we couldn't find it, run
|
||||||
|
// wallcheck instead
|
||||||
|
{
|
||||||
|
corners = VischeckWall(LOCAL_E, entity,
|
||||||
|
float(follow_activation) / 2,
|
||||||
|
true);
|
||||||
|
if (!corners.first.z || !corners.second.z)
|
||||||
|
continue;
|
||||||
|
// addCrumbs(LOCAL_E, corners.first);
|
||||||
|
// addCrumbs(entity, corners.second);
|
||||||
|
addCrumbPair(LOCAL_E, entity, corners);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if (indirectOrigin.z)
|
||||||
|
{
|
||||||
|
addCrumbs(entity, indirectOrigin);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (VisCheckEntFromEnt(LOCAL_E, entity))
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if (isNavBotCM && !found)
|
||||||
|
{
|
||||||
|
if (!nav::navTo(entity->m_vecOrigin()))
|
||||||
|
continue;
|
||||||
|
navtimeout.update();
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
continue;
|
||||||
|
// ooooo, a target
|
||||||
|
follow_target = i;
|
||||||
|
afkTicks[i].update(); // set afk time to 0
|
||||||
}
|
}
|
||||||
if (!found)
|
|
||||||
continue;
|
|
||||||
// ooooo, a target
|
|
||||||
follow_target = i;
|
|
||||||
afkTicks[i].update(); // set afk time to 0
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
lastent++;
|
lastent++;
|
||||||
if (lastent > g_IEngine->GetMaxClients())
|
if (lastent > g_IEngine->GetMaxClients())
|
||||||
lastent = 0;
|
lastent = 0;
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
#include "hack.hpp"
|
#include "hack.hpp"
|
||||||
|
|
||||||
static settings::Bool render_zoomed{ "visuals.render-local-zoomed", "false" };
|
static settings::Bool render_zoomed{ "visual.render-local-zoomed", "false" };
|
||||||
static settings::Bool anti_afk{ "misc.anti-afk", "false" };
|
static settings::Bool anti_afk{ "misc.anti-afk", "false" };
|
||||||
static settings::Bool auto_strafe{ "misc.autostrafe", "false" };
|
static settings::Bool auto_strafe{ "misc.autostrafe", "false" };
|
||||||
static settings::Bool tauntslide{ "misc.tauntslide-tf2c", "false" };
|
static settings::Bool tauntslide{ "misc.tauntslide-tf2c", "false" };
|
||||||
|
@ -3,12 +3,15 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include "common.hpp"
|
#include "common.hpp"
|
||||||
#include <settings/Bool.hpp>
|
#include "settings/Bool.hpp"
|
||||||
#include <settings/Int.hpp>
|
#include "settings/Int.hpp"
|
||||||
#include <settings/Key.hpp>
|
#include "settings/Key.hpp"
|
||||||
static settings::Bool enable{ "sandwichaim.enable", "false" };
|
#include "PlayerTools.hpp"
|
||||||
static settings::Button aimkey{ "sandwichaim.aimkey", "<null>" };
|
#include "hacks/Trigger.hpp"
|
||||||
static settings::Int aimkey_mode{ "sandwichaim.aimkey-mode", "0" };
|
|
||||||
|
static settings::Bool sandwichaim_enabled{ "sandwichaim.enable", "false" };
|
||||||
|
static settings::Button sandwichaim_aimkey{ "sandwichaim.aimkey", "<null>" };
|
||||||
|
static settings::Int sandwichaim_aimkey_mode{ "sandwichaim.aimkey-mode", "0" };
|
||||||
|
|
||||||
float sandwich_speed = 350.0f;
|
float sandwich_speed = 350.0f;
|
||||||
float grav = 0.25f;
|
float grav = 0.25f;
|
||||||
@ -32,6 +35,9 @@ std::pair<CachedEntity *, Vector> FindBestEnt(bool teammate, bool Predict,
|
|||||||
continue;
|
continue;
|
||||||
if (!ent->hitboxes.GetHitbox(1))
|
if (!ent->hitboxes.GetHitbox(1))
|
||||||
continue;
|
continue;
|
||||||
|
if (!teammate && player_tools::shouldTarget(ent) !=
|
||||||
|
player_tools::IgnoreReason::DO_NOT_IGNORE)
|
||||||
|
continue;
|
||||||
Vector target{};
|
Vector target{};
|
||||||
if (Predict)
|
if (Predict)
|
||||||
target = ProjectilePrediction(ent, 1, sandwich_speed, grav,
|
target = ProjectilePrediction(ent, 1, sandwich_speed, grav,
|
||||||
@ -151,21 +157,21 @@ void DoSlowAim(Vector &input_angle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static HookedFunction
|
static HookedFunction
|
||||||
SandwichAim(HookedFunctions_types::HF_CreateMove, "SandwichAim", 1, []() {
|
SandwichAim(HookedFunctions_types::HF_CreateMove, "SandwichAim", 5, []() {
|
||||||
if (!*enable)
|
if (!*sandwichaim_enabled)
|
||||||
return;
|
return;
|
||||||
if (CE_BAD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer())
|
if (CE_BAD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer() || CE_BAD(LOCAL_W))
|
||||||
return;
|
return;
|
||||||
if (aimkey)
|
if (sandwichaim_aimkey)
|
||||||
{
|
{
|
||||||
switch (*aimkey_mode)
|
switch (*sandwichaim_aimkey_mode)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
if (!aimkey.isKeyDown())
|
if (!sandwichaim_aimkey.isKeyDown())
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
if (aimkey.isKeyDown())
|
if (sandwichaim_aimkey.isKeyDown())
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -202,7 +208,7 @@ static HookedFunction
|
|||||||
return;
|
return;
|
||||||
if (charge_key && !charge_key.isKeyDown())
|
if (charge_key && !charge_key.isKeyDown())
|
||||||
return;
|
return;
|
||||||
if (CE_BAD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer())
|
if (CE_BAD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer() || CE_BAD(LOCAL_W))
|
||||||
return;
|
return;
|
||||||
if (!HasCondition<TFCond_Charging>(LOCAL_E))
|
if (!HasCondition<TFCond_Charging>(LOCAL_E))
|
||||||
return;
|
return;
|
||||||
@ -221,18 +227,64 @@ static HookedFunction
|
|||||||
charge_aimbotted = true;
|
charge_aimbotted = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
static settings::Bool charge_control{ "chargecontrol.enable", "false" };
|
static settings::Bool charge_control{ "chargecontrol.enable", "false" };
|
||||||
static settings::Int charge_int{ "chargecontrol.strength", "1" };
|
static settings::Float charge_float{ "chargecontrol.strength", "3.0f" };
|
||||||
static HookedFunction ChargeControl(
|
static HookedFunction ChargeControl(
|
||||||
HookedFunctions_types::HF_CreateMove, "ChargeControl", 1, []() {
|
HookedFunctions_types::HF_CreateMove, "chargecontrol", 5, []() {
|
||||||
if (!*charge_control || charge_aimbotted)
|
if (!*charge_control || charge_aimbotted)
|
||||||
return;
|
return;
|
||||||
if (CE_BAD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer())
|
if (CE_BAD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer() || CE_BAD(LOCAL_W))
|
||||||
return;
|
return;
|
||||||
if (!HasCondition<TFCond_Charging>(LOCAL_E))
|
if (!HasCondition<TFCond_Charging>(LOCAL_E))
|
||||||
return;
|
return;
|
||||||
float offset = 0.0f;
|
float offset = 0.0f;
|
||||||
if (current_user_cmd->mousedx > 1 || current_user_cmd->mousedx < -1)
|
if (current_user_cmd->buttons & IN_MOVELEFT)
|
||||||
offset = -(current_user_cmd->mousedx / 100 * *charge_int);
|
offset = *charge_float;
|
||||||
|
if (current_user_cmd->buttons & IN_MOVERIGHT)
|
||||||
|
offset = -*charge_float;
|
||||||
current_user_cmd->viewangles.y += offset;
|
current_user_cmd->viewangles.y += offset;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
static settings::Bool autosapper_enabled("autosapper.enabled", "false");
|
||||||
|
static settings::Bool autosapper_silent("autosapper.silent", "true");
|
||||||
|
|
||||||
|
static HookedFunction SapperAimbot(HF_CreateMove, "sapperaimbot", 5, []() {
|
||||||
|
if (!autosapper_enabled)
|
||||||
|
return;
|
||||||
|
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W) || !g_pLocalPlayer->holding_sapper)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CachedEntity *target = nullptr;
|
||||||
|
float fov = FLT_MAX;
|
||||||
|
float range = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
|
||||||
|
for (int i = 0; i < entity_cache::max; i++)
|
||||||
|
{
|
||||||
|
CachedEntity *ent = ENTITY(i);
|
||||||
|
if (CE_BAD(ent))
|
||||||
|
continue;
|
||||||
|
if (ent->m_Type() != ENTITY_BUILDING)
|
||||||
|
continue;
|
||||||
|
if (!ent->m_bEnemy())
|
||||||
|
continue;
|
||||||
|
if (CE_BYTE(ent, netvar.m_bHasSapper))
|
||||||
|
continue;
|
||||||
|
if (GetBuildingPosition(ent).DistTo(g_pLocalPlayer->v_Eye) > range)
|
||||||
|
continue;
|
||||||
|
float new_fov = GetFov(g_pLocalPlayer->v_OrigViewangles,
|
||||||
|
g_pLocalPlayer->v_Eye, GetBuildingPosition(ent));
|
||||||
|
if (fov <= new_fov)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
fov = new_fov;
|
||||||
|
target = ent;
|
||||||
|
}
|
||||||
|
if (target)
|
||||||
|
{
|
||||||
|
AimAt(g_pLocalPlayer->v_Eye, GetBuildingPosition(target),
|
||||||
|
current_user_cmd);
|
||||||
|
if (autosapper_silent)
|
||||||
|
g_pLocalPlayer->bUseSilentAngles = true;
|
||||||
|
current_user_cmd->buttons |= IN_ATTACK;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
1102
src/hacks/NavBot.cpp
1102
src/hacks/NavBot.cpp
File diff suppressed because it is too large
Load Diff
@ -279,7 +279,7 @@ void createMove()
|
|||||||
static float last_voice_spam = 0.0f;
|
static float last_voice_spam = 0.0f;
|
||||||
if (g_GlobalVars->curtime - 4.0F > last_voice_spam)
|
if (g_GlobalVars->curtime - 4.0F > last_voice_spam)
|
||||||
{
|
{
|
||||||
switch ((int) voicecommand_spam)
|
switch (*voicecommand_spam)
|
||||||
{
|
{
|
||||||
case 1: // RANDOM
|
case 1: // RANDOM
|
||||||
g_IEngine->ServerCmd(
|
g_IEngine->ServerCmd(
|
||||||
@ -312,10 +312,10 @@ void createMove()
|
|||||||
static int safety_ticks = 0;
|
static int safety_ticks = 0;
|
||||||
static int last_source = 0;
|
static int last_source = 0;
|
||||||
static float last_message = 0;
|
static float last_message = 0;
|
||||||
if ((int) spam_source != last_source)
|
if (*spam_source != last_source)
|
||||||
{
|
{
|
||||||
safety_ticks = 300;
|
safety_ticks = 300;
|
||||||
last_source = (int) spam_source;
|
last_source = *spam_source;
|
||||||
}
|
}
|
||||||
if (safety_ticks > 0)
|
if (safety_ticks > 0)
|
||||||
{
|
{
|
||||||
@ -328,7 +328,7 @@ void createMove()
|
|||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<std::string> *source = nullptr;
|
const std::vector<std::string> *source = nullptr;
|
||||||
switch ((int) spam_source)
|
switch (*spam_source)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
source = &file.lines;
|
source = &file.lines;
|
||||||
@ -364,10 +364,11 @@ void createMove()
|
|||||||
{
|
{
|
||||||
if (current_index >= source->size())
|
if (current_index >= source->size())
|
||||||
current_index = 0;
|
current_index = 0;
|
||||||
if (random_order)
|
if (random_order && source->size())
|
||||||
{
|
{
|
||||||
current_index = rand() % source->size();
|
current_index = rand() % source->size();
|
||||||
while (current_index == last_index)
|
int tries = 0;
|
||||||
|
while (current_index == last_index && tries++ < 1000)
|
||||||
{
|
{
|
||||||
current_index = rand() % source->size();
|
current_index = rand() % source->size();
|
||||||
}
|
}
|
||||||
|
@ -589,7 +589,7 @@ float EffectiveTargetingRange()
|
|||||||
// Pyros only have so much untill their flames hit
|
// Pyros only have so much untill their flames hit
|
||||||
else if (g_pLocalPlayer->weapon()->m_iClassID() ==
|
else if (g_pLocalPlayer->weapon()->m_iClassID() ==
|
||||||
CL_CLASS(CTFFlameThrower))
|
CL_CLASS(CTFFlameThrower))
|
||||||
return 200.0f;
|
return 300.0f;
|
||||||
// If user has set a max range, then use their setting,
|
// If user has set a max range, then use their setting,
|
||||||
if (max_range)
|
if (max_range)
|
||||||
return *max_range;
|
return *max_range;
|
||||||
|
@ -1218,7 +1218,7 @@ Timer map_check{};
|
|||||||
int erasedelay = 0;
|
int erasedelay = 0;
|
||||||
static HookedFunction
|
static HookedFunction
|
||||||
Move(HookedFunctions_types::HF_CreateMove, "Walkbot", 16, []() {
|
Move(HookedFunctions_types::HF_CreateMove, "Walkbot", 16, []() {
|
||||||
if (CE_BAD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer())
|
if (CE_BAD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer() || CE_BAD(LOCAL_W))
|
||||||
return;
|
return;
|
||||||
if (state::state == WB_DISABLED)
|
if (state::state == WB_DISABLED)
|
||||||
return;
|
return;
|
||||||
|
@ -600,6 +600,19 @@ void VectorAngles(Vector &forward, Vector &angles)
|
|||||||
angles[2] = 0;
|
angles[2] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get forward vector
|
||||||
|
void AngleVectors2(const QAngle &angles, Vector *forward)
|
||||||
|
{
|
||||||
|
float sp, sy, cp, cy;
|
||||||
|
|
||||||
|
SinCos(DEG2RAD(angles[YAW]), &sy, &cy);
|
||||||
|
SinCos(DEG2RAD(angles[PITCH]), &sp, &cp);
|
||||||
|
|
||||||
|
forward->x = cp * cy;
|
||||||
|
forward->y = cp * sy;
|
||||||
|
forward->z = -sp;
|
||||||
|
}
|
||||||
|
|
||||||
char GetUpperChar(ButtonCode_t button)
|
char GetUpperChar(ButtonCode_t button)
|
||||||
{
|
{
|
||||||
switch (button)
|
switch (button)
|
||||||
@ -878,62 +891,7 @@ bool IsProjectileCrit(CachedEntity *ent)
|
|||||||
|
|
||||||
weaponmode GetWeaponMode()
|
weaponmode GetWeaponMode()
|
||||||
{
|
{
|
||||||
int weapon_handle, slot;
|
return g_pLocalPlayer->weapon_mode;
|
||||||
CachedEntity *weapon;
|
|
||||||
|
|
||||||
if (CE_BAD(LOCAL_E))
|
|
||||||
return weapon_invalid;
|
|
||||||
weapon_handle = CE_INT(LOCAL_E, netvar.hActiveWeapon);
|
|
||||||
if (IDX_BAD((weapon_handle & 0xFFF)))
|
|
||||||
{
|
|
||||||
// logging::Info("IDX_BAD: %i", weapon_handle & 0xFFF);
|
|
||||||
return weaponmode::weapon_invalid;
|
|
||||||
}
|
|
||||||
weapon = (ENTITY(weapon_handle & 0xFFF));
|
|
||||||
if (CE_BAD(weapon))
|
|
||||||
return weaponmode::weapon_invalid;
|
|
||||||
int classid = weapon->m_iClassID();
|
|
||||||
slot = re::C_BaseCombatWeapon::GetSlot(RAW_ENT(weapon));
|
|
||||||
if (slot == 2)
|
|
||||||
return weaponmode::weapon_melee;
|
|
||||||
if (slot > 2)
|
|
||||||
{
|
|
||||||
return weaponmode::weapon_pda;
|
|
||||||
}
|
|
||||||
else if (classid == CL_CLASS(CTFLunchBox) ||
|
|
||||||
classid == CL_CLASS(CTFLunchBox_Drink) ||
|
|
||||||
classid == CL_CLASS(CTFBuffItem))
|
|
||||||
{
|
|
||||||
return weaponmode::weapon_consumable;
|
|
||||||
}
|
|
||||||
else if (classid == CL_CLASS(CTFRocketLauncher_DirectHit) ||
|
|
||||||
classid == CL_CLASS(CTFRocketLauncher) ||
|
|
||||||
classid == CL_CLASS(CTFGrenadeLauncher) ||
|
|
||||||
classid == CL_CLASS(CTFPipebombLauncher) ||
|
|
||||||
classid == CL_CLASS(CTFCompoundBow) ||
|
|
||||||
classid == CL_CLASS(CTFBat_Wood) ||
|
|
||||||
classid == CL_CLASS(CTFBat_Giftwrap) ||
|
|
||||||
classid == CL_CLASS(CTFFlareGun) ||
|
|
||||||
classid == CL_CLASS(CTFFlareGun_Revenge) ||
|
|
||||||
classid == CL_CLASS(CTFSyringeGun) ||
|
|
||||||
classid == CL_CLASS(CTFCrossbow) ||
|
|
||||||
classid == CL_CLASS(CTFShotgunBuildingRescue) ||
|
|
||||||
classid == CL_CLASS(CTFDRGPomson) ||
|
|
||||||
classid == CL_CLASS(CTFWeaponFlameBall) ||
|
|
||||||
classid == CL_CLASS(CTFRaygun) ||
|
|
||||||
classid == CL_CLASS(CTFGrapplingHook))
|
|
||||||
{
|
|
||||||
return weaponmode::weapon_projectile;
|
|
||||||
}
|
|
||||||
else if (classid == CL_CLASS(CTFJar) || classid == CL_CLASS(CTFJarMilk))
|
|
||||||
{
|
|
||||||
return weaponmode::weapon_throwable;
|
|
||||||
}
|
|
||||||
else if (classid == CL_CLASS(CWeaponMedigun))
|
|
||||||
{
|
|
||||||
return weaponmode::weapon_medigun;
|
|
||||||
}
|
|
||||||
return weaponmode::weapon_hitscan;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LineIntersectsBox(Vector &bmin, Vector &bmax, Vector &lmin, Vector &lmax)
|
bool LineIntersectsBox(Vector &bmin, Vector &bmax, Vector &lmin, Vector &lmax)
|
||||||
@ -1282,11 +1240,7 @@ Vector QAngleToVector(QAngle in)
|
|||||||
|
|
||||||
void AimAt(Vector origin, Vector target, CUserCmd *cmd)
|
void AimAt(Vector origin, Vector target, CUserCmd *cmd)
|
||||||
{
|
{
|
||||||
Vector angles, tr;
|
cmd->viewangles = GetAimAtAngles(origin, target);
|
||||||
tr = (target - origin);
|
|
||||||
VectorAngles(tr, angles);
|
|
||||||
fClampAngle(angles);
|
|
||||||
cmd->viewangles = angles;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AimAtHitbox(CachedEntity *ent, int hitbox, CUserCmd *cmd)
|
void AimAtHitbox(CachedEntity *ent, int hitbox, CUserCmd *cmd)
|
||||||
|
@ -163,6 +163,14 @@ DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Disabled because this causes EXTREME aimbot inaccuracy
|
||||||
|
// Actually dont disable it. It causes even more inaccuracy
|
||||||
|
if (!cmd->command_number)
|
||||||
|
{
|
||||||
|
g_Settings.is_create_move = false;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (!isHackActive())
|
if (!isHackActive())
|
||||||
{
|
{
|
||||||
g_Settings.is_create_move = false;
|
g_Settings.is_create_move = false;
|
||||||
@ -245,8 +253,7 @@ DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time,
|
|||||||
{
|
{
|
||||||
entity_cache::Invalidate();
|
entity_cache::Invalidate();
|
||||||
}
|
}
|
||||||
// Disabled because this causes EXTREME aimbot inaccuracy
|
|
||||||
// if (!cmd->command_number) return ret;
|
|
||||||
// PROF_BEGIN();
|
// PROF_BEGIN();
|
||||||
{
|
{
|
||||||
PROF_SECTION(EntityCache);
|
PROF_SECTION(EntityCache);
|
||||||
@ -279,7 +286,7 @@ DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time,
|
|||||||
// hacks::tf2::NavBot::initonce();
|
// hacks::tf2::NavBot::initonce();
|
||||||
nav::status = nav::off;
|
nav::status = nav::off;
|
||||||
IRC::auth();
|
IRC::auth();
|
||||||
hacks::shared::NavBot::Init(true);
|
hacks::tf2::NavBot::initonce();
|
||||||
firstcm = false;
|
firstcm = false;
|
||||||
}
|
}
|
||||||
g_Settings.bInvalid = false;
|
g_Settings.bInvalid = false;
|
||||||
@ -447,7 +454,7 @@ DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time,
|
|||||||
{
|
{
|
||||||
speedapplied = false;
|
speedapplied = false;
|
||||||
if (roll_speedhack && cmd->buttons & IN_DUCK &&
|
if (roll_speedhack && cmd->buttons & IN_DUCK &&
|
||||||
!(cmd->buttons & IN_ATTACK))
|
!(cmd->buttons & IN_ATTACK) && !HasCondition<TFCond_Charging>(LOCAL_E))
|
||||||
{
|
{
|
||||||
speed = Vector{ cmd->forwardmove, cmd->sidemove, 0.0f }.Length();
|
speed = Vector{ cmd->forwardmove, cmd->sidemove, 0.0f }.Length();
|
||||||
static float prevspeedang = 0.0f;
|
static float prevspeedang = 0.0f;
|
||||||
|
@ -40,7 +40,17 @@ CatCommand spectate("spectate", "Spectate", [](const CCommand &args) {
|
|||||||
spectator_target = 0;
|
spectator_target = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int id = atoi(args.Arg(1));
|
int id;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
id = std::stoi(args.Arg(1));
|
||||||
|
}
|
||||||
|
catch (const std::exception &e)
|
||||||
|
{
|
||||||
|
logging::Info("Error while setting spectate target. Error: %s",
|
||||||
|
e.what());
|
||||||
|
id = 0;
|
||||||
|
}
|
||||||
if (!id)
|
if (!id)
|
||||||
spectator_target = 0;
|
spectator_target = 0;
|
||||||
else
|
else
|
||||||
|
@ -12,6 +12,65 @@ CatCommand printfov("fov_print", "Dump achievements to file (development)",
|
|||||||
if (CE_GOOD(LOCAL_E))
|
if (CE_GOOD(LOCAL_E))
|
||||||
logging::Info("%d", CE_INT(LOCAL_E, netvar.iFOV));
|
logging::Info("%d", CE_INT(LOCAL_E, netvar.iFOV));
|
||||||
});
|
});
|
||||||
|
weaponmode GetWeaponModeloc()
|
||||||
|
{
|
||||||
|
int weapon_handle, slot;
|
||||||
|
CachedEntity *weapon;
|
||||||
|
|
||||||
|
if (CE_BAD(LOCAL_E) | CE_BAD(LOCAL_W))
|
||||||
|
return weapon_invalid;
|
||||||
|
weapon_handle = CE_INT(LOCAL_E, netvar.hActiveWeapon);
|
||||||
|
if (IDX_BAD((weapon_handle & 0xFFF)))
|
||||||
|
{
|
||||||
|
// logging::Info("IDX_BAD: %i", weapon_handle & 0xFFF);
|
||||||
|
return weaponmode::weapon_invalid;
|
||||||
|
}
|
||||||
|
weapon = (ENTITY(weapon_handle & 0xFFF));
|
||||||
|
if (CE_BAD(weapon))
|
||||||
|
return weaponmode::weapon_invalid;
|
||||||
|
int classid = weapon->m_iClassID();
|
||||||
|
slot = re::C_BaseCombatWeapon::GetSlot(RAW_ENT(weapon));
|
||||||
|
if (slot == 2)
|
||||||
|
return weaponmode::weapon_melee;
|
||||||
|
if (slot > 2)
|
||||||
|
{
|
||||||
|
return weaponmode::weapon_pda;
|
||||||
|
}
|
||||||
|
else if (classid == CL_CLASS(CTFLunchBox) ||
|
||||||
|
classid == CL_CLASS(CTFLunchBox_Drink) ||
|
||||||
|
classid == CL_CLASS(CTFBuffItem))
|
||||||
|
{
|
||||||
|
return weaponmode::weapon_consumable;
|
||||||
|
}
|
||||||
|
else if (classid == CL_CLASS(CTFRocketLauncher_DirectHit) ||
|
||||||
|
classid == CL_CLASS(CTFRocketLauncher) ||
|
||||||
|
classid == CL_CLASS(CTFGrenadeLauncher) ||
|
||||||
|
classid == CL_CLASS(CTFPipebombLauncher) ||
|
||||||
|
classid == CL_CLASS(CTFCompoundBow) ||
|
||||||
|
classid == CL_CLASS(CTFBat_Wood) ||
|
||||||
|
classid == CL_CLASS(CTFBat_Giftwrap) ||
|
||||||
|
classid == CL_CLASS(CTFFlareGun) ||
|
||||||
|
classid == CL_CLASS(CTFFlareGun_Revenge) ||
|
||||||
|
classid == CL_CLASS(CTFSyringeGun) ||
|
||||||
|
classid == CL_CLASS(CTFCrossbow) ||
|
||||||
|
classid == CL_CLASS(CTFShotgunBuildingRescue) ||
|
||||||
|
classid == CL_CLASS(CTFDRGPomson) ||
|
||||||
|
classid == CL_CLASS(CTFWeaponFlameBall) ||
|
||||||
|
classid == CL_CLASS(CTFRaygun) ||
|
||||||
|
classid == CL_CLASS(CTFGrapplingHook))
|
||||||
|
{
|
||||||
|
return weaponmode::weapon_projectile;
|
||||||
|
}
|
||||||
|
else if (classid == CL_CLASS(CTFJar) || classid == CL_CLASS(CTFJarMilk))
|
||||||
|
{
|
||||||
|
return weaponmode::weapon_throwable;
|
||||||
|
}
|
||||||
|
else if (classid == CL_CLASS(CWeaponMedigun))
|
||||||
|
{
|
||||||
|
return weaponmode::weapon_medigun;
|
||||||
|
}
|
||||||
|
return weaponmode::weapon_hitscan;
|
||||||
|
}
|
||||||
void LocalPlayer::Update()
|
void LocalPlayer::Update()
|
||||||
{
|
{
|
||||||
CachedEntity *wep;
|
CachedEntity *wep;
|
||||||
@ -28,7 +87,7 @@ void LocalPlayer::Update()
|
|||||||
wep = weapon();
|
wep = weapon();
|
||||||
if (CE_GOOD(wep))
|
if (CE_GOOD(wep))
|
||||||
{
|
{
|
||||||
weapon_mode = GetWeaponMode();
|
weapon_mode = GetWeaponModeloc();
|
||||||
if (wep->m_iClassID() == CL_CLASS(CTFSniperRifle) ||
|
if (wep->m_iClassID() == CL_CLASS(CTFSniperRifle) ||
|
||||||
wep->m_iClassID() == CL_CLASS(CTFSniperRifleDecap))
|
wep->m_iClassID() == CL_CLASS(CTFSniperRifleDecap))
|
||||||
holding_sniper_rifle = true;
|
holding_sniper_rifle = true;
|
||||||
|
@ -279,7 +279,7 @@ public:
|
|||||||
{
|
{
|
||||||
i.second.status = unknown;
|
i.second.status = unknown;
|
||||||
i.second.stucktime = 0;
|
i.second.stucktime = 0;
|
||||||
reset_pather = true;
|
reset_pather = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case unknown:
|
case unknown:
|
||||||
@ -288,7 +288,7 @@ public:
|
|||||||
if (i.second.ignoreTimeout.check(20000))
|
if (i.second.ignoreTimeout.check(20000))
|
||||||
{
|
{
|
||||||
i.second.status = unknown;
|
i.second.status = unknown;
|
||||||
reset_pather = true;
|
reset_pather = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case vischeck_failed:
|
case vischeck_failed:
|
||||||
@ -298,7 +298,7 @@ public:
|
|||||||
{
|
{
|
||||||
i.second.status = unknown;
|
i.second.status = unknown;
|
||||||
i.second.stucktime = 0;
|
i.second.stucktime = 0;
|
||||||
reset_pather = true;
|
reset_pather = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -542,6 +542,10 @@ bool navTo(Vector destination, int priority, bool should_repath,
|
|||||||
std::vector<Vector> path = findPath(g_pLocalPlayer->v_Origin, destination);
|
std::vector<Vector> path = findPath(g_pLocalPlayer->v_Origin, destination);
|
||||||
if (path.empty())
|
if (path.empty())
|
||||||
return false;
|
return false;
|
||||||
|
if (!crumbs.empty())
|
||||||
|
{
|
||||||
|
ignoremanager::addTime(last_area, crumbs.at(0), inactivity);
|
||||||
|
}
|
||||||
last_area = path.at(0);
|
last_area = path.at(0);
|
||||||
if (!nav_to_local)
|
if (!nav_to_local)
|
||||||
{
|
{
|
||||||
@ -554,10 +558,6 @@ bool navTo(Vector destination, int priority, bool should_repath,
|
|||||||
{
|
{
|
||||||
findClosestNavSquare_localAreas.clear();
|
findClosestNavSquare_localAreas.clear();
|
||||||
}
|
}
|
||||||
if (!crumbs.empty())
|
|
||||||
{
|
|
||||||
ignoremanager::addTime(last_area, crumbs.at(0), inactivity);
|
|
||||||
}
|
|
||||||
ensureArrival = should_repath;
|
ensureArrival = should_repath;
|
||||||
ReadyForCommands = false;
|
ReadyForCommands = false;
|
||||||
curr_priority = priority;
|
curr_priority = priority;
|
||||||
@ -583,7 +583,7 @@ static HookedFunction
|
|||||||
CreateMove(HookedFunctions_types::HF_CreateMove, "NavParser", 17, []() {
|
CreateMove(HookedFunctions_types::HF_CreateMove, "NavParser", 17, []() {
|
||||||
if (!enabled || status != on)
|
if (!enabled || status != on)
|
||||||
return;
|
return;
|
||||||
if (CE_BAD(LOCAL_E))
|
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W))
|
||||||
return;
|
return;
|
||||||
if (!LOCAL_E->m_bAlivePlayer())
|
if (!LOCAL_E->m_bAlivePlayer())
|
||||||
{
|
{
|
||||||
@ -636,7 +636,7 @@ static HookedFunction drawcrumbs(HF_Draw, "navparser", 10, []() {
|
|||||||
return;
|
return;
|
||||||
if (!enabled)
|
if (!enabled)
|
||||||
return;
|
return;
|
||||||
if (CE_BAD(LOCAL_E))
|
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W))
|
||||||
return;
|
return;
|
||||||
if (!LOCAL_E->m_bAlivePlayer())
|
if (!LOCAL_E->m_bAlivePlayer())
|
||||||
return;
|
return;
|
||||||
@ -695,6 +695,9 @@ static CatCommand nav_init("nav_init", "Debug nav init", []() {
|
|||||||
|
|
||||||
static CatCommand nav_path("nav_path", "Debug nav path", []() { navTo(loc); });
|
static CatCommand nav_path("nav_path", "Debug nav path", []() { navTo(loc); });
|
||||||
|
|
||||||
|
static CatCommand nav_path_no_local("nav_path_no_local", "Debug nav path",
|
||||||
|
[]() { navTo(loc, 5, false, false); });
|
||||||
|
|
||||||
static CatCommand nav_reset_ignores("nav_reset_ignores", "Reset all ignores.",
|
static CatCommand nav_reset_ignores("nav_reset_ignores", "Reset all ignores.",
|
||||||
[]() { ignoremanager::reset(); });
|
[]() { ignoremanager::reset(); });
|
||||||
|
|
||||||
|
6
src/trace.cpp
Executable file → Normal file
6
src/trace.cpp
Executable file → Normal file
@ -141,9 +141,9 @@ bool trace::FilterNoEntity::ShouldHitEntity(IHandleEntity *handle, int mask)
|
|||||||
// Hit doors, carts, etc
|
// Hit doors, carts, etc
|
||||||
switch (clazz->m_ClassID)
|
switch (clazz->m_ClassID)
|
||||||
{
|
{
|
||||||
case 6:
|
case 6:
|
||||||
case 7:
|
case 7:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ static settings::Bool disco_chams{ "chams.disco", "false" };
|
|||||||
|
|
||||||
namespace effect_chams
|
namespace effect_chams
|
||||||
{
|
{
|
||||||
CatCommand fix_black_chams("fix_black_chams", "Fix Black Chams", [](){
|
CatCommand fix_black_chams("fix_black_chams", "Fix Black Chams", []() {
|
||||||
effect_chams::g_EffectChams.Shutdown();
|
effect_chams::g_EffectChams.Shutdown();
|
||||||
effect_chams::g_EffectChams.Init();
|
effect_chams::g_EffectChams.Init();
|
||||||
});
|
});
|
||||||
@ -82,7 +82,7 @@ void EffectChams::EndRenderChams()
|
|||||||
CMatRenderContextPtr ptr(GET_RENDER_CONTEXT);
|
CMatRenderContextPtr ptr(GET_RENDER_CONTEXT);
|
||||||
g_IVModelRender->ForcedMaterialOverride(nullptr);
|
g_IVModelRender->ForcedMaterialOverride(nullptr);
|
||||||
}
|
}
|
||||||
static rgba_t data[32] = {colors::empty};
|
static rgba_t data[32] = { colors::empty };
|
||||||
void EffectChams::SetEntityColor(CachedEntity *ent, rgba_t color)
|
void EffectChams::SetEntityColor(CachedEntity *ent, rgba_t color)
|
||||||
{
|
{
|
||||||
if (ent->m_IDX > 31 || ent->m_IDX < 0)
|
if (ent->m_IDX > 31 || ent->m_IDX < 0)
|
||||||
@ -156,7 +156,7 @@ rgba_t EffectChams::ChamsColor(IClientEntity *entity)
|
|||||||
}
|
}
|
||||||
if (data[entity->entindex()] != colors::empty)
|
if (data[entity->entindex()] != colors::empty)
|
||||||
{
|
{
|
||||||
auto toret = data[entity->entindex()];
|
auto toret = data[entity->entindex()];
|
||||||
data[entity->entindex()] = colors::empty;
|
data[entity->entindex()] = colors::empty;
|
||||||
return toret;
|
return toret;
|
||||||
}
|
}
|
||||||
|
@ -138,7 +138,7 @@ static ShaderStencilState_t SS_SolidInvisible{};
|
|||||||
static ShaderStencilState_t SS_Null{};
|
static ShaderStencilState_t SS_Null{};
|
||||||
static ShaderStencilState_t SS_Drawing{};
|
static ShaderStencilState_t SS_Drawing{};
|
||||||
|
|
||||||
CatCommand fix_black_glow("fix_black_glow", "Fix Black Glow", [](){
|
CatCommand fix_black_glow("fix_black_glow", "Fix Black Glow", []() {
|
||||||
effect_glow::g_EffectGlow.Shutdown();
|
effect_glow::g_EffectGlow.Shutdown();
|
||||||
effect_glow::g_EffectGlow.Init();
|
effect_glow::g_EffectGlow.Init();
|
||||||
});
|
});
|
||||||
|
@ -15,23 +15,20 @@
|
|||||||
|
|
||||||
#ifndef FEATURE_FIDGET_SPINNER_ENABLED
|
#ifndef FEATURE_FIDGET_SPINNER_ENABLED
|
||||||
|
|
||||||
static settings::Bool enable_spinner{ "visuals.fidget-spinner.enable",
|
static settings::Bool enable_spinner{ "visual.fidget-spinner.enable", "false" };
|
||||||
"false" };
|
static settings::Bool v9mode{ "visual.fidget-spinner.v952-mode", "false" };
|
||||||
static settings::Bool v9mode{ "visuals.fidget-spinner.v952-mode", "false" };
|
static settings::Float spinner_speed_cap{ "visual.fidget-spinner.speed-cap",
|
||||||
static settings::Float spinner_speed_cap{ "visuals.fidget-spinner.speed-cap",
|
|
||||||
"30" };
|
"30" };
|
||||||
static settings::Float spinner_speed_scale{
|
static settings::Float spinner_speed_scale{ "visual.fidget-spinner.speed-scale",
|
||||||
"visuals.fidget-spinner.speed-scale", "0.03"
|
"0.03" };
|
||||||
};
|
static settings::Float spinner_decay_speed{ "visual.fidget-spinner.decay-speed",
|
||||||
static settings::Float spinner_decay_speed{
|
"0.1" };
|
||||||
"visuals.fidget-spinner.decay-speed", "0.1"
|
static settings::Float spinner_scale{ "visual.fidget-spinner.scale", "32" };
|
||||||
};
|
static settings::Float spinner_min_speed{ "visual.fidget-spinner.min-speed",
|
||||||
static settings::Float spinner_scale{ "visuals.fidget-spinner.scale", "32" };
|
|
||||||
static settings::Float spinner_min_speed{ "visuals.fidget-spinner.min-speed",
|
|
||||||
"2" };
|
"2" };
|
||||||
|
|
||||||
float spinning_speed = 0.0f;
|
static float spinning_speed = 0.0f;
|
||||||
float angle = 0;
|
static float angle = 0;
|
||||||
|
|
||||||
// DEBUG
|
// DEBUG
|
||||||
/*CatCommand add_spinner_speed("fidgetspinner_debug_speedup", "Add speed", []()
|
/*CatCommand add_spinner_speed("fidgetspinner_debug_speedup", "Add speed", []()
|
||||||
@ -41,7 +38,7 @@ float angle = 0;
|
|||||||
class SpinnerListener : public IGameEventListener
|
class SpinnerListener : public IGameEventListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual void FireGameEvent(KeyValues *event)
|
void FireGameEvent(KeyValues *event) override
|
||||||
{
|
{
|
||||||
std::string name(event->GetName());
|
std::string name(event->GetName());
|
||||||
if (name == "player_death")
|
if (name == "player_death")
|
||||||
@ -64,7 +61,7 @@ void InitSpinner()
|
|||||||
g_IGameEventManager->AddListener(&listener, false);
|
g_IGameEventManager->AddListener(&listener, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Timer retrytimer{};
|
static Timer retrytimer{};
|
||||||
|
|
||||||
void DrawSpinner()
|
void DrawSpinner()
|
||||||
{
|
{
|
||||||
@ -95,10 +92,10 @@ void DrawSpinner()
|
|||||||
angle += speed_scale * real_speed;
|
angle += speed_scale * real_speed;
|
||||||
int state = min(3, int(spinning_speed / 250));
|
int state = min(3, int(spinning_speed / 250));
|
||||||
|
|
||||||
glez::draw::rect_textured(draw::width / 2, draw::height / 2, size, size,
|
glez::draw::rect_textured(
|
||||||
colors::white, textures::atlas().texture,
|
draw::width / 2 - size * 0.5f, draw::height / 2 - size * 0.5f, size,
|
||||||
64 * state, (3 + (v9mode ? 0 : 1)) * 64, 64, 64,
|
size, colors::white, textures::atlas().texture, 64 * state,
|
||||||
angle);
|
(3 + (v9mode ? 0 : 1)) * 64, 64, 64, angle);
|
||||||
if (angle > PI * 4)
|
if (angle > PI * 4)
|
||||||
angle -= PI * 4;
|
angle -= PI * 4;
|
||||||
}
|
}
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
printf "\n\n";printf '\e[1;34m%-6s\e' "Your cathook version is out of date! Please reinstall by using \"wget https://raw.githubusercontent.com/nullworks/One-in-all-cathook-install/master/install-all && bash install-all\"";printf "\n\n"
|
|
Reference in New Issue
Block a user