From ca95f5a96142a23b6722711dfbf9499c59a87b26 Mon Sep 17 00:00:00 2001 From: jenz Date: Wed, 8 Jul 2026 16:34:41 +0200 Subject: [PATCH] replacing reliance on alias for connecting with steam native connect command. downloading maps through sourcemod saying the nextmap. should assure that bots are connected much faster from now on in almost all cases. --- AutismBotIngame/README.md | 8 +- AutismBotIngame/python/ingamefollowct.py | 95 +- AutismBotIngame/python/new_ingame_followct.py | 237 --- AutismBotIngame/scripting/autism_bot_info.sp | 1346 ----------------- .../scripting/autism_bot_simulate_movement.sp | 219 ++- 5 files changed, 263 insertions(+), 1642 deletions(-) delete mode 100644 AutismBotIngame/python/new_ingame_followct.py delete mode 100755 AutismBotIngame/scripting/autism_bot_info.sp diff --git a/AutismBotIngame/README.md b/AutismBotIngame/README.md index 56307d1..b89ca58 100644 --- a/AutismBotIngame/README.md +++ b/AutismBotIngame/README.md @@ -11,6 +11,8 @@ apt-get install xvfb xserver-xephyr tigervnc-standalone-server x11-utils gnumeric + apt-get install xdotool + #NOTICE: steam might not be able to launch in case of the tmpfs /dev/shm filesystem being full. it seems safe to just delete u1001-Shm_* files and u1002-Shm_ files. It should be fine because the files exists as long as at least one process has them open. So until steam is killed i assume. You dont need to be root for killing them, the user running the bot has permissions to rm the files #intel specific: @@ -34,7 +36,7 @@ apt install libgtk2.0-0:i386 /home/gameservers/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/cfg/autoexec.cfg:
- alias loop "exec looptest.cfg; wait 5; loop;"; wait 5; loop;
+ alias loop "exec looptest.cfg; wait 5; loop;"; wait 5; loop; exporting correct SDL_VIDEO_X11_VISUALID value is important before steam login for starting games correctly

With the virtual desktop related to the VNC/x2go/nomachine client you can log into steam using the normal GUI ->
@@ -46,6 +48,7 @@ echo 'SDL_VIDEO_X11_VISUALID: ' $SDL_VIDEO_X11_VISUALID export SDL_VIDEO_X11_VISUALID=0x205 echo 'SDL_VIDEO_X11_VISUALID: ' $SDL_VIDEO_X11_VISUALID + echo "DISPLAY=$DISPLAY" > /home/$(whoami)/ze_runner/display.txt dbus-run-session /usr/games/steam -applaunch 240 -novid -noipx -nojoy -noshaderapi fi @@ -88,5 +91,4 @@ limiting cpu can throttle the download speed as well. if bots cant connect and a #pip3 extra pip3 install watchdog - - +pip3 install requests diff --git a/AutismBotIngame/python/ingamefollowct.py b/AutismBotIngame/python/ingamefollowct.py index 7c5bf9b..8582403 100644 --- a/AutismBotIngame/python/ingamefollowct.py +++ b/AutismBotIngame/python/ingamefollowct.py @@ -7,16 +7,18 @@ import pwd from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import random +import bz2 import signal import socket import codecs import json +import requests import datetime import time import glob import pwd -restart_time = datetime.datetime.now() + datetime.timedelta(hours=3) +restart_time = datetime.datetime.now() + datetime.timedelta(hours=6) whoami = subprocess.getoutput("whoami") with open(f'/home/{whoami}/ze_runner/config.json') as jsonfile: @@ -24,10 +26,6 @@ with open(f'/home/{whoami}/ze_runner/config.json') as jsonfile: looptestPath = f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/cfg/looptest.cfg" chatmsg = "" -def overwrite_file_access(): - #setting defaults with setfacl for the download directory does not work seemingly - subprocess.Popen(["chmod", "-R", "g+rwx", f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).communicate() - def writeCfgInput(Input_user): with open(looptestPath, 'w') as f: f.write(Input_user) @@ -39,6 +37,36 @@ def writeCfgInput(Input_user): time.sleep(0.35) open(looptestPath, 'w').close() #clearing file. +def get_display_env_from_file(): + display_path = f"/home/{whoami}/ze_runner/display.txt" + env = {} + try: + with open(display_path) as f: + for line in f: + line = line.strip() + if "=" in line: + key, _, value = line.partition("=") + env[key] = value + except FileNotFoundError: + return None + return env + +def check_instance_conflict_dialog(): + display_env = get_display_env_from_file() or {} + env = os.environ.copy() + env["DISPLAY"] = display_env.get("DISPLAY") + result = subprocess.run( + ["xdotool", "search", "--name", "Source - Warning"], + env=env, capture_output=True, text=True, + ) + if result.returncode == 0: + return 0 + return None + +def overwrite_file_access(): + #setting defaults with setfacl for the download directory does not work seemingly + subprocess.Popen(["chmod", "-R", "g+rwx", f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).communicate() + def clean_up_files(): #deleting POSIX shared memory objects, as long as one process has them open they exist. THis is to prevent /dev/shm from being full #due to steam child processes. @@ -78,7 +106,6 @@ def delete_bsp_files(): def exit_handler(): print('reached exithandler') - #securing the looptest.cfg wont be stuck accidently with commands kill_owned_process("pidof cstrike_linux64") kill_owned_process("pidof xterm") @@ -126,12 +153,19 @@ def restart_sdl_and_steam(): def bot_connect(data): #use whatever ip you want here to connect with - str1 = "" + server = "" if "connect to ze" == data: - str1 = f"connect {data_ports['server_ip_port_ze']};" + server = f"{data_ports['server_ip_port_ze']};" elif "connect to ze2" == data: - str1 = f"connect {data_ports['server_ip_port_ze2']};" #wait 15000; - writeCfgInput(str1) + server = f"{data_ports['server_ip_port_ze2']};" + + display_env = get_display_env_from_file() or {} + env = os.environ.copy() + env["DISPLAY"] = display_env.get("DISPLAY") + subprocess.run( + ["/usr/games/steam", f"steam://connect/{server}"], + env=env, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + ) def cpulimit_pid_of_game(): # ' > /dev/null' redirects stdout to /dev/null @@ -179,9 +213,9 @@ if __name__ == '__main__': sock.bind(("", local_port)) sock.settimeout(5.0) messager_name = "" - - failed_connect_count = 0 + fail_safe_counter = 0 + launch_game() try: while True: @@ -212,24 +246,51 @@ if __name__ == '__main__': elif "autismo connected to ze" == data: print('Bot connected to ze!') is_bot_connected_to_ze2 = False - failed_connect_count = 0 + fail_safe_counter = 0 elif "not connected to ze2" == data: is_bot_connected_to_ze2 = False elif "autismo connected to ze2" == data: print('Bot connected to ze2!') is_bot_connected_to_ze2 = True - failed_connect_count = 0 + fail_safe_counter = 0 + elif data.startswith("download map:"): + map_to_download = data.split("download map:")[1].strip() + map_to_download_url = "https://uk-fastdl.unloze.com/css_ze/maps/" + map_to_download + ".bsp.bz2" + map_folder = f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download/maps/" + bz2_path = map_folder + map_to_download + ".bsp.bz2" + bsp_path = map_folder + map_to_download + ".bsp" + + if os.path.exists(bsp_path): + continue + elif os.path.exists(bz2_path): + continue + else: + with requests.get(map_to_download_url, stream=True, timeout=30) as r: + r.raise_for_status() + with open(bz2_path, "wb") as f: + for chunk in r.iter_content(chunk_size=8192): + f.write(chunk) + with open(bz2_path, "rb") as f: + compressed_data = f.read() + decompressed_data = bz2.decompress(compressed_data) + with open(bsp_path, "wb") as f: + f.write(decompressed_data) + os.remove(bz2_path) + print(f"downloaded and extracted map: {bsp_path}") + overwrite_file_access() elif "connect to ze" == data or ("connect to ze2" == data and not is_bot_connected_to_ze2): - if datetime.datetime.now() >= restart_time or return_user_owned_pid("pidof cstrike_linux64") is None: + if datetime.datetime.now() >= restart_time or return_user_owned_pid("pidof cstrike_linux64") is None or check_instance_conflict_dialog() is not None: kill_owned_process("pidof cstrike_linux64") sock.close() print('exiting after running for several hours.') sys.exit(1) print('data: ', data) overwrite_file_access() + check_if_bz2_downloading() bot_connect(data) - failed_connect_count += 1 - if failed_connect_count >= 2: + + fail_safe_counter += 1 + if fail_safe_counter >= 3: kill_owned_process("pidof cstrike_linux64") sock.close() print('exiting after running for several hours.') diff --git a/AutismBotIngame/python/new_ingame_followct.py b/AutismBotIngame/python/new_ingame_followct.py deleted file mode 100644 index c815ae6..0000000 --- a/AutismBotIngame/python/new_ingame_followct.py +++ /dev/null @@ -1,237 +0,0 @@ -#!/home/autismbot1/ze_runner/venv/bin/python3 -import os -import sys -import subprocess -import atexit -import pwd -from watchdog.observers import Observer -from watchdog.events import FileSystemEventHandler -import random -import signal -import socket -import codecs -import json -import datetime -import time -import glob - -restart_time = datetime.datetime.now() + datetime.timedelta(hours=3) -the_undesired_crash_counter = 0 #hate this monkey solution - -whoami = subprocess.getoutput("whoami") -with open(f'/home/{whoami}/ze_runner/config.json') as jsonfile: - data_ports = json.load(jsonfile) -looptestPath = f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/cfg/looptest.cfg" -chatmsg = "" - -def overwrite_file_access(): - #setting defaults with setfacl for the download directory does not work seemingly - subprocess.Popen(["chmod", "-R", "g+rwx", f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).communicate() - -def writeCfgInput(Input_user): - with open(looptestPath, 'w') as f: - f.write(Input_user) - #print("wrote to file: ", Input_user) - if "connect" in Input_user or "retry;" in Input_user: - #give extra time for disconnect, retry and connect commands - time.sleep(1.0) - else: - time.sleep(0.35) - open(looptestPath, 'w').close() #clearing file. - -def clean_up_files(): - #deleting POSIX shared memory objects, as long as one process has them open they exist. THis is to prevent /dev/shm from being full - #due to steam child processes. - #even with steam turned offline might there be chromium web browsers left over from steam who still hold processes open. - #only kind of potential issues from this is steam cloud being out of sync, which is really fucking irrelevant. - for pattern in ["/tmp/steam*", "/tmp/dbus*", "/tmp/pressure*", "/tmp/tigervnc*", "/tmp/dumps*", "/dev/shm/u100*"]: - for path in glob.glob(pattern): - subprocess.run(["rm", "-rf", path], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - - #clean up the game cache as it otherwise just keeps growing in gigabyte size - subprocess.run(["rm", "-rf", f"/home/{whoami}/.steam/steam/steamapps/common/Counter-Strike Source/cstrike/cache"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - -def check_if_bz2_downloading(): - #users should only have permissions to delete their own files probably - #check if any bz2 files left over. - for f in glob.glob(f"/home/{whoami}/.steam/steam/steamapps/common/Counter-Strike Source/cstrike/download/**/*.bz2", recursive=True): - file_size = None - while True: - time.sleep(10) - if not os.path.exists(f): - break # finished downloading, bz2 file is removed. - cur_file_size = os.path.getsize(f) - if file_size == cur_file_size: - # delete the bz2 file if its not progressing downloading - subprocess.run(["rm", "-rf", f], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - break - file_size = cur_file_size - -def delete_bsp_files(): - #quite a more radical approach to just always delete all maps, well the download should be quick and the remaining bots have the bsp in memory... - #the bots would have struggle connecting sometimes due to bsp files that were already downloaded before hand (maybe corrupted?) - for f in glob.glob(f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download/maps/*"): - #ai slop IF statement for checking if file modified less than 10 minutes ago. - if time.time() - os.path.getmtime(f) < 600: - continue - subprocess.run(["rm", "-rf", f], stdout=subprocess.PIPE) - -def exit_handler(): - print('reached exithandler') - #securing the looptest.cfg wont be stuck accidently with commands - kill_owned_process("pidof cstrike_linux64") - kill_owned_process("pidof xterm") - - clean_up_files() - check_if_bz2_downloading() - delete_bsp_files() - - subprocess.getoutput(f"pkill -9 -u {whoami}") - -def kill_user_owned_pid(pid): - #print('pid: ', pid, ' killed') - pid = int(pid.strip()) - os.kill(pid, signal.SIGKILL) - time.sleep(10) - -def return_user_owned_pid(pidof): - owner_pid = subprocess.getoutput([f"{pidof}"]) - if owner_pid: - for pid in owner_pid.split(" "): - username = subprocess.getoutput([f"""ps -o user= -p {pid}"""]) - if username == whoami: - return pid - return None - -def kill_owned_process(pidof): - pid = return_user_owned_pid(pidof) - while pid: - kill_user_owned_pid(pid) - pid = return_user_owned_pid(pidof) - -def restart_sdl_and_steam(): - #subprocess.getoutput(["screen -XS XTERM quit"]) - kill_owned_process("pidof cstrike_linux64") - kill_owned_process("pidof xterm") - - subprocess.getoutput([f'vncserver -kill']) #only displays vncservers for the specific user. - subprocess.getoutput([f'vncserver -list -cleanstale']) #cleans stale sessions by removing files from disk - time.sleep(5) - - cmd = f'vncserver -localhost no -geometry 1x1 -depth 24' - #cmd = f'vncserver -localhost no -geometry 800x800 -depth 24' - #print(f'cmd: {cmd}') - subprocess.getoutput(cmd) - print('reached .bashrc executing steam and variables') - -def bot_connect(data): - #use whatever ip you want here to connect with - str1 = "" - if "connect to ze" == data: - str1 = f"connect {data_ports['server_ip_port_ze']};" - elif "connect to ze2" == data: - str1 = f"connect {data_ports['server_ip_port_ze2']};" #wait 15000; - writeCfgInput(str1) - -def cpulimit_pid_of_game(): - # ' > /dev/null' redirects stdout to /dev/null - # '2>&1' redirects stderr to the same place as stdout - pid = return_user_owned_pid("pidof cstrike_linux64") - if pid is None: - return - cmd = f"cpulimit --pid={pid} --limit=25 --background > /dev/null 2>&1" - #cmd = f"cpulimit --pid={pid} --limit=55 --background > /dev/null 2>&1" - subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).communicate()[0] - - time.sleep(3) - for source_engine_lock in glob.glob("/tmp/source_engine_*"): - subprocess.run(["rm", "-rf", source_engine_lock], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - overwrite_file_access() - -if __name__ == '__main__': - atexit.register(exit_handler) - local_port = data_ports['udp_port'] - external_port_messages = data_ports['chat_external_port'] - buffer_size = 4096 #potentially not large enough? - - clean_up_files() - check_if_bz2_downloading() - delete_bsp_files() - - restart_sdl_and_steam() - is_bot_connected_to_ze2 = False - - print('preparing to launch game....') - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - sock.bind(("", local_port)) - sock.settimeout(5.0) - messager_name = "" - - #give the game some time to launch - fail_safe = 5 - while return_user_owned_pid("pidof cstrike_linux64") is None: - #just a fail safe to prevent being stuck forever. - if fail_safe <= 0: - sys.exit(1) - time.sleep(10) - print("launching game...") - fail_safe -= 1 - time.sleep(10) - cpulimit_pid_of_game() - - try: - while True: - try: - #print("socket waiting for recvfrom") - data, addr = sock.recvfrom(buffer_size) - except socket.timeout: - continue - data = codecs.decode(data, "utf-8", "ignore") - ip = addr[0] - port = addr[1] - #print('port: ', port, " ip: ", ip) - #print('data: ', data) - if not data: - continue - - #print("ip: ", ip, " port: ", port) - if ip == data_ports['discord_bot_ip'] and port == external_port_messages: - if messager_name in data: - messager_name = "" - response_msg = f"""say {messager_name} {data}""" - print("remote UDP packet response_msg: ", response_msg) - writeCfgInput(response_msg) - if ip != data_ports['ovh_ip']: - continue - elif data == "bot kicked server full": - print('bot kicked server full: ', datetime.datetime.now().time()) - elif "autismo connected to ze" == data: - print('Bot connected to ze!') - is_bot_connected_to_ze2 = False - the_undesired_crash_counter = 0 - elif "not connected to ze2" == data: - is_bot_connected_to_ze2 = False - elif "autismo connected to ze2" == data: - print('Bot connected to ze2!') - the_undesired_crash_counter = 0 - is_bot_connected_to_ze2 = True - elif "connect to ze" == data or ("connect to ze2" == data and not is_bot_connected_to_ze2): - if datetime.datetime.now() >= restart_time or return_user_owned_pid("pidof cstrike_linux64") is None or the_undesired_crash_counter >= 5: - #it already finished downloading the contnet, it just cant connect. probably stuck. shitty solution welp - kill_owned_process("pidof cstrike_linux64") - sock.close() - print('exiting after running the game for several hours or game being stuck on map change.') - sys.exit(1) - print('data: ', data, ' the_undesired_crash_counter: ', the_undesired_crash_counter) - the_undesired_crash_counter += 1 - check_if_bz2_downloading() - overwrite_file_access() - bot_connect(data) - elif "clientmessage:" in data: - messager_name = data.split("clientmessage:", 1)[1].split(f" {data_ports['magic_secret']}")[0] - databyte_send_message = messager_name + data.split(f"{data_ports['magic_secret']}")[1] - sock.sendto(databyte_send_message.encode(), (data_ports["discord_bot_ip"], external_port_messages)) - #print('databyte_send_message: ', databyte_send_message) - finally: - sock.close() diff --git a/AutismBotIngame/scripting/autism_bot_info.sp b/AutismBotIngame/scripting/autism_bot_info.sp deleted file mode 100755 index 9d6162c..0000000 --- a/AutismBotIngame/scripting/autism_bot_info.sp +++ /dev/null @@ -1,1346 +0,0 @@ -#pragma semicolon 1 -#pragma newdecls required -#define DEBUG - -#define PLUGIN_AUTHOR "jenz" -#define PLUGIN_VERSION "1.8" -#define generic_length 256 - -#include -#include -#include -#include -#include -#include -#include -#include - -int target_friend_afk_counter[MAXPLAYERS][MAXPLAYERS + 1]; -int target_friend[MAXPLAYERS + 1]; -int target_enemy[MAXPLAYERS + 1]; -bool human_too_close[MAXPLAYERS + 1]; -bool bot_follow_tp[MAXPLAYERS + 1]; -int ports[7] = {48470, 48471, 48472, 48473, 48474, 48479, 48480}; //last three indexes are ports its sending udp from in plugin -int server_ports[2] = {27015, 27035}; //server ports: ze, ze2 -float client_old_coords[MAXPLAYERS + 1][3]; -float targetfriend_prev_coords[MAXPLAYERS + 1][3]; - -int has_to_jump_bots[MAXPLAYERS + 1]; -float coords_run_cmd[MAXPLAYERS + 1][3]; -bool chat_cooldown = false; - -//socket for bot input -Handle global_socket; - -//timer handle -Handle g_hTimer_pressing = null; -Handle g_hTimer_bot_connect = null; - -//cmdrun handle for gamedata txt -Handle g_hGetRunCmdPre; - -//is botplayer -bool is_bot_player[MAXPLAYERS + 1]; -int specific_bot_player[MAXPLAYERS + 1]; - -public Plugin myinfo = -{ - name = "coordinates for the bot", - author = PLUGIN_AUTHOR, - description = "hello ", - version = PLUGIN_VERSION, - url = "" -}; - -public void OnPluginStart() -{ - for (int i = 1; i <= MaxClients; i++) - if (IsValidClient(i)) - { - target_friend[i] = 0; - target_enemy[i] = 0; - OnClientPostAdminCheck(i); - } - - Handle hGameConf; - if ((hGameConf = LoadGameConfigFile("OnPlayerRunCmdPre.games")) == INVALID_HANDLE) - { - SetFailState("Couldnt load \"OnPlayerRunCmd.games\" game config!"); - return; - } - - //CBasePlayer::PlayerRunCommand(CUserCmd*, IMoveHelper*) - int iGetRunCmdPre; - if ((iGetRunCmdPre = GameConfGetOffset(hGameConf, "GetRunCmdPre")) == -1) - { - delete hGameConf; - SetFailState("GameConfGetOffset(hGameConf, \"GetRunCmdPre\") failed!"); - return; - } - - if ((g_hGetRunCmdPre = DHookCreate(iGetRunCmdPre, HookType_Entity, ReturnType_Int, ThisPointer_CBaseEntity, OnGetRunCmdPre)) == INVALID_HANDLE) - { - delete hGameConf; - SetFailState("DHookCreate(iGetRunCmdPre, HookType_Entity, ReturnType_Int, ThisPointer_CBaseEntity, OnGetRunCmdPre) failed!"); - return; - } - - for (int i = 1; i <= MaxClients; i++) - { - if (IsValidClient(i) && is_bot_player[i]) - { - if (g_hGetRunCmdPre != INVALID_HANDLE) - DHookEntity(g_hGetRunCmdPre, false, i); - } - } - - //talking - RegConsoleCmd("sm_autism", cmd_talk, "talking to the bot through java application"); - RegConsoleCmd("sm_botrtv", cmd_botrtv, "making bots rtv"); - HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); - HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy); - - //UDP connection - connect_socket(); - chat_cooldown = false; - - g_hTimer_bot_connect = CreateTimer(30.0, bot_check_connect, _, TIMER_REPEAT); - g_hTimer_pressing = CreateTimer(0.30, recursive_pressing, _, TIMER_REPEAT); -} - - -public MRESReturn OnGetRunCmdPre(int entity, Handle hReturn) -{ - if (!IsValidEntity(entity)) - return MRES_Ignored; - //check here if fell off edge, if did change some boolean around tell it to OnPlayerRunCmd when still on ground there - if (IsValidClient(entity) && IsPlayerAlive(entity) && !(GetEntityFlags(entity) & FL_ONGROUND) && !has_to_jump_bots[entity] - && is_bot_player[entity] ) - { - has_to_jump_bots[entity] = 1; - } - - return MRES_Ignored; -} - -public void get_new_angles(int client, int target, float angles[3]) -{ - if (IsValidClient(target)) - { - float TargetPos[3]; - float ClientPos[3]; - float Result[3]; - GetClientEyePosition(target, TargetPos); - GetClientEyePosition(client, ClientPos); - MakeVectorFromPoints(ClientPos, TargetPos, Result); - GetVectorAngles(Result, Result); - angles[0] = Result[0]; - angles[1] = Result[1]; - angles[2] = Result[2]; - } -} - -public Action OnPlayerRunCmd(int client, int& buttons, int& impulse, float vel[3], float angles[3], int& weapon, int& subtype, int& cmdnum, int& tickcount, int& seed, int mouse[2]) -{ - //we use info we just got from OnPlayerRunCmdPre to determine if to jump - if (!IsValidClient(client) || !IsPlayerAlive(client) || !is_bot_player[client]) return Plugin_Continue; - - //2023 october: the new place to set angles for the client instead of using face_call, through this is teleporting avoided which can trigger trigger_multiples - if (!bot_follow_tp[client]) - { - int targeteam = 0; - if (GetClientTeam(client) != 3) - { - //2 = autismo is zm and should follow enemies sometimes - targeteam = 2; - } - else - { - //3 = autismo is human and should follow closest moving ct - targeteam = 3; - } - - bool found_enemy = false; - for (int clienti = 1; clienti <= MaxClients; clienti++) - { - if (!IsValidClient(clienti)) continue; - if (GetClientTeam(clienti) == 2 && IsPlayerAlive(clienti)) - { - found_enemy = true; - } - } - - float pos[3]; - float dist_target = -1.0; - if (IsValidClient(target_friend[client])) - { - GetEntPropVector(target_friend[client], Prop_Send, "m_vecOrigin", pos); - dist_target = get_power_distance(client, pos); - } - - float max_range_dist = 65.0; - //here we put into consideration if the human is leaving or standing around. If the bots already catched up to the human they can have a larger distance between the player and themselves so they dont constantly follow him. If the player is leaving the bots needs to follow him much closer. - if (targeteam == 3 && human_too_close[client]) - { - max_range_dist = 200.0; - } - - float enemy_distance = -1.0; - if (IsValidClient(target_enemy[client])) - { - GetEntPropVector(target_enemy[client], Prop_Send, "m_vecOrigin", pos); - enemy_distance = get_power_distance(client, pos); - } - - - if (GetEntityMoveType(client) == MOVETYPE_LADDER || (IsValidClient(target_friend[client]) && GetEntityMoveType(target_friend[client]) == MOVETYPE_LADDER)) - { - if (IsValidClient(target_friend[client])) - { - get_new_angles(client, target_friend[client], angles); - } - } - //if bot is ct: is close enough to friend, can stop following friend and focus on shooting zombies - else if (targeteam == 3 && 0 < dist_target < max_range_dist && IsValidClient(target_enemy[client])) - { - get_new_angles(client, target_enemy[client], angles); - } - //if bot is ct: if bot is not close enough to friend follow him, //dist_target being larger than max_range_dist means a friend was found to follow - //we also check if zm already spawned, if not then stay close to friend - else if ((targeteam == 3 && dist_target > max_range_dist) || !found_enemy) - { - get_new_angles(client, target_friend[client], angles); - } - //if bot is zm follow enemy sometimes - else if (targeteam == 2 && 0 < enemy_distance < max_range_dist * 5 && IsValidClient(target_enemy[client])) - { - get_new_angles(client, target_enemy[client], angles); - } - //if bot is zm just follow the closest friend zm, but not constantly when too close because people start bitching then - else if (targeteam == 2 && dist_target > max_range_dist / 2) - { - get_new_angles(client, target_friend[client], angles); - } - //if bot is zm and no close enemies and no friends far away enough to follow then check if friend is close, if its the case then do nothing - else if (targeteam == 2 && 0 < dist_target < max_range_dist / 2) - { - get_new_angles(client, target_friend[client], angles); - } - //if bot is zm and there are no friends close or far away but there is also no enemy close check if there is an enemy far away - else if (targeteam == 2 && IsValidClient(target_enemy[client])) - { - get_new_angles(client, target_enemy[client], angles); - } - } - - if ((GetEntityMoveType(client) & MOVETYPE_LADDER)) - { - has_to_jump_bots[client] = 2; - GetEntPropVector(client, Prop_Send, "m_vecOrigin", coords_run_cmd[client]); - return Plugin_Continue; - } - if (GetEntProp(client, Prop_Data, "m_nWaterLevel") != 0) - { - has_to_jump_bots[client] = 2; - return Plugin_Continue; - } - - //make sure fell of an edge instead of actually jumping. - if (buttons & IN_JUMP && has_to_jump_bots[client] == 1) - { - has_to_jump_bots[client] = 2; - return Plugin_Continue; - } - - //!bot_follow_tp[client] ensures that bot is not busy with running into a teleporter - if (has_to_jump_bots[client] == 1 && !bot_follow_tp[client]) - { - //this check accomedates checking for if the bot actually was teleported by the map because then he should not teleport back again to coords_run_cmd - //the famous voodoo incidents that people have seen. - float distance_bot_current_position_last_position = get_power_distance(client, coords_run_cmd[client]); - - if (distance_bot_current_position_last_position > 500.0) - { - has_to_jump_bots[client] = 2; - return Plugin_Continue; - } - - //teleport back on ground so can jump - TeleportEntity(client, coords_run_cmd[client], NULL_VECTOR, NULL_VECTOR); - buttons |= IN_JUMP; //jump - has_to_jump_bots[client] = 2; - } - if (GetEntityFlags(client) & FL_ONGROUND) - { - GetEntPropVector(client, Prop_Send, "m_vecOrigin", coords_run_cmd[client]); - has_to_jump_bots[client] = 0; - } - - return Plugin_Continue; -} - -public void OnPluginEnd() -{ - if (g_hTimer_pressing != null) - { - delete g_hTimer_pressing; - } - if (g_hTimer_bot_connect != null) - { - delete g_hTimer_bot_connect; - } -} -public void Event_RoundEnd(Handle event, const char[] name, bool dontBroadcast) -{ - for (int i = 1; i <= MaxClients; i++) - { - if (IsValidClient(i)) - { - if (is_bot_player[i]) - { - has_to_jump_bots[i] = 3; - } - } - } -} - -public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast) -{ - for (int i = 1; i <= MaxClients; i++) - { - if (IsValidClient(i)) - { - if (is_bot_player[i]) - { - target_friend[i] = -1; - target_enemy[i] = -1; - human_too_close[i] = false; - bot_follow_tp[i] = false; - targetfriend_prev_coords[i][0] = 0.0; - targetfriend_prev_coords[i][1] = 0.0; - targetfriend_prev_coords[i][2] = 0.0; - GetEntPropVector(i, Prop_Send, "m_vecOrigin", coords_run_cmd[i]); - has_to_jump_bots[i] = 0; - for (int j = 1; j <= MaxClients; j++) - { - if (IsValidClient(j) && j != i) - { - target_friend_afk_counter[i][j] = 0; - } - } - } - } - } -} - -public void cmd_talk_help(int port, int client, char[] info) -{ - char msg[generic_length * 5]; - chat_cooldown = true; - char magic_code[16]; - Format(magic_code, sizeof(magic_code), autism_bot_code); //included with unloze.secrets simply. - Format(msg, sizeof(msg), "clientmessage:%N %s %s", client, magic_code, info); - send_socket_msg(msg, strlen(msg), port); - CreateTimer(2.0, bot_chat_cooldown); - -} - -public void is_autism_bot1(int client) -{ - char auth[50]; - GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth)); - if (StrEqual("[U:1:120378081]", auth, false) || StrEqual("STEAM_0:1:60189040", auth, false)) - { - is_bot_player[client] = true; - specific_bot_player[client] = 1; - } -} - -public void is_autism_bot2(int client) -{ - char auth[50]; - GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth)); - if (StrEqual("[U:1:1036189204]", auth, false) || StrEqual("STEAM_0:0:518094602", auth, false)) - { - is_bot_player[client] = true; - specific_bot_player[client] = 2; - } -} - -public void is_autism_bot3(int client) -{ - char auth[50]; - GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth)); - if (StrEqual("[U:1:408797742]", auth, false) || StrEqual("STEAM_0:0:204398871", auth, false)) - { - is_bot_player[client] = true; - specific_bot_player[client] = 3; - } -} - -public void is_autism_bot4(int client) -{ - char auth[50]; - GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth)); - if (StrEqual("[U:1:1221121532]", auth, false) || StrEqual("STEAM_0:0:610560766", auth, false)) - { - is_bot_player[client] = true; - specific_bot_player[client] = 4; - } -} - -public Action cmd_botrtv(int client, int args) -{ - if ((CheckCommandAccess(client, "sm_kick", ADMFLAG_KICK)) || (CheckCommandAccess(client, "sm_reserved", ADMFLAG_RESERVATION))) - { - for (int i = 1; i <= MaxClients; i++) - { - if (IsValidClient(i) && !IsFakeClient(i)) - { - char msg[generic_length]; - Format(msg, sizeof(msg), "rtv"); - if (specific_bot_player[i] == 1) - { - send_socket_msg(msg, strlen(msg), ports[0]); - } - else if (specific_bot_player[i] == 2) - { - send_socket_msg(msg, strlen(msg), ports[1]); - } - else if (specific_bot_player[i] == 3) - { - send_socket_msg(msg, strlen(msg), ports[2]); - } - else if(specific_bot_player[i] == 4) - { - send_socket_msg(msg, strlen(msg), ports[3]); - } - } - } - } - return Plugin_Handled; -} - -public Action cmd_talk(int client, int args) -{ - char info[generic_length]; - GetCmdArgString(info, sizeof(info)); - - if (strlen(info) == 0) - { - PrintToChat(client, "Add a message to the command if autism bot is ingame and running on discord"); - return Plugin_Handled; - } - if (is_bot_player[client]) - { - return Plugin_Handled; - } - if (chat_cooldown) - { - PrintToChat(client, "spamming bot too much, applying cooldown"); - return Plugin_Handled; - } - bool bot_found = false; - for (int i = 1; i <= MaxClients; i++) - { - if (IsValidClient(i) && !IsFakeClient(i)) - { - if (specific_bot_player[i] == 1) - { - cmd_talk_help(ports[0], client, info); - bot_found = true; - } - if (specific_bot_player[i] == 2) - { - cmd_talk_help(ports[1], client, info); - bot_found = true; - } - if (specific_bot_player[i] == 3) - { - cmd_talk_help(ports[2], client, info); - bot_found = true; - } - if (specific_bot_player[i] == 4) - { - cmd_talk_help(ports[3], client, info); - bot_found = true; - } - } - } - if (!bot_found) - PrintToChat(client, "bot not connected to server"); - return Plugin_Handled; -} - -public Action bot_chat_cooldown(Handle timer, any data) -{ - chat_cooldown = false; - return Plugin_Continue; -} - -public void OnMapStart() -{ - chat_cooldown = false; -} - -public void send_socket_msg(char[] query_msg, int len, int port) -{ - //LogMessage("query_msg: %s port: %i", query_msg, port); - if (global_socket != INVALID_HANDLE && SocketIsConnected(global_socket)) - SocketSendTo(global_socket, query_msg, len, "127.0.0.1", port); //udp -} - -public Action bot_check_connect(Handle timer, any data) -{ - //this is designed for being ran from several css servers - int client_count = GetClientCount(false); - char msg[generic_length]; - int i_port = GetConVarInt(FindConVar("hostport")); - bool bot1_connected = false; - bool bot2_connected = false; - bool bot3_connected = false; - bool bot4_connected = false; - for (int i = 1; i <= MaxClients; i++) - if (IsValidClient(i) && !IsFakeClient(i)) - { - if (specific_bot_player[i] == 1) - bot1_connected = true; - if (specific_bot_player[i] == 2) - bot2_connected = true; - if (specific_bot_player[i] == 3) - bot3_connected = true; - if (specific_bot_player[i] == 4) - bot4_connected = true; - } - - if (i_port == server_ports[0]) - { - int max_allowed_players = 55; - char current_map[128]; - GetCurrentMap(current_map, sizeof(current_map)); - if (client_count > max_allowed_players || StrEqual(current_map, "ze_paranoid_rezurrection_v11_9", false)) - { - Format(msg, sizeof(msg), "connect to ze2"); - send_socket_msg(msg, strlen(msg), ports[0]); - send_socket_msg(msg, strlen(msg), ports[1]); - send_socket_msg(msg, strlen(msg), ports[2]); - send_socket_msg(msg, strlen(msg), ports[3]); - } - else if (client_count < max_allowed_players - 5) - { - Format(msg, sizeof(msg), "connect to ze"); - if (!bot1_connected) - send_socket_msg(msg, strlen(msg), ports[0]); - if (!bot2_connected) - send_socket_msg(msg, strlen(msg), ports[1]); - if (!bot3_connected) - send_socket_msg(msg, strlen(msg), ports[2]); - if (!bot4_connected) - send_socket_msg(msg, strlen(msg), ports[3]); - } - } - else - { - //in case the bot is not connected to ze2 anymore make sure that is_bot_connected_to_ze2 is set to false again - Format(msg, sizeof(msg), "not connected to ze2"); - if (!bot1_connected) - send_socket_msg(msg, strlen(msg), ports[0]); - if (!bot2_connected) - send_socket_msg(msg, strlen(msg), ports[1]); - if (!bot3_connected) - send_socket_msg(msg, strlen(msg), ports[2]); - if (!bot4_connected) - send_socket_msg(msg, strlen(msg), ports[3]); - } - return Plugin_Continue; -} - -public Action recursive_pressing(Handle timer, any data) -{ - bool found_valid_ct = false; - int valid_ct_counter = 0; - bool found_enemy = false; - for (int client = 1; client <= MaxClients; client++) - { - if (!IsValidClient(client)) continue; - if (GetClientTeam(client) == 2 && IsPlayerAlive(client)) - { - found_enemy = true; - } - if (!is_bot_player[client] && GetClientTeam(client) > 1) - { - valid_ct_counter++; - if (valid_ct_counter >= 3) //autismbots first join when there are three active players. - { - found_valid_ct = true; - } - } - } - for (int client = 1; client <= MaxClients; client++) - { - if (!IsValidClient(client)) continue; - if (!found_valid_ct && is_bot_player[client]) - { - if (GetClientTeam(client) != 0) - ChangeClientTeam(client, 0); - continue; - } - if (is_bot_player[client]) - { - if (GetClientTeam(client) == 1 || GetClientTeam(client) == 0) - { - if (specific_bot_player[client] == 2 && valid_ct_counter < 7) - { - continue; - } - if (specific_bot_player[client] == 3 && valid_ct_counter < 13) - { - continue; - } - if (specific_bot_player[client] == 4 && valid_ct_counter < 19) - { - continue; - } - ChangeClientTeam(client, 2); - continue; - } - } - if (is_bot_player[client]) - { - if (IsPlayerAlive(client)) - { - int targeteam = 0; - if (GetClientTeam(client) != 3) - { - //2 = autismo is zm and should follow enemies sometimes - targeteam = 2; - } - else - { - //3 = autismo is human and should follow closest moving ct - targeteam = 3; - } - int previous_friend = target_friend[client]; - target_enemy[client] = GetClosestClient_option1(false, client, 0); - float enemy_distance = -1.0; - float pos[3]; - if (IsValidClient(target_enemy[client])) - { - GetEntPropVector(target_enemy[client], Prop_Send, "m_vecOrigin", pos); - enemy_distance = get_power_distance(client, pos); - } - - target_friend[client] = GetClosestClient_option1(true, client, target_enemy[client]); - float dist_target = -1.0; - if (IsValidClient(target_friend[client])) - { - GetEntPropVector(target_friend[client], Prop_Send, "m_vecOrigin", pos); - dist_target = get_power_distance(client, pos); - } - - float max_range_dist = 65.0; - //here we put into consideration if the human is leaving or standing around. If the bots already catched up to the human they can have a larger distance between the player and themselves so they dont constantly follow him. If the player is leaving the bots needs to follow him much closer. - if (targeteam == 3 && human_too_close[client]) - { - max_range_dist = 200.0; - } - - - int state = -1; - //Our previous friend is still an alive human, if we cant see him anymore he went around a corner or teleported - if (targetfriend_prev_coords[client][0] != 0.0 && IsValidClient(previous_friend) && GetClientTeam(previous_friend) == GetClientTeam(client) - && IsPlayerAlive(previous_friend) && previous_friend != target_friend[client]) - { - float ClientPos[3]; - float friend_prev[3]; - GetClientEyePosition(client, ClientPos); - //if the bot cant see him anymore he around corner or teleported most likley. - //therefore a small distance check should also be needed to assure that the bots take the - //teleporter - float distance_prev_friend_prior = get_power_distance(previous_friend, targetfriend_prev_coords[client]); - GetEntPropVector(previous_friend, Prop_Send, "m_vecOrigin", friend_prev); - if (!IsPointVisible(ClientPos, friend_prev) && distance_prev_friend_prior > 500.0) - { - bot_follow_tp[client] = true; - } - } - if (IsValidClient(target_friend[client]) && !bot_follow_tp[client]) - { - GetEntPropVector(target_friend[client], Prop_Send, "m_vecOrigin", targetfriend_prev_coords[client]); - } - if (bot_follow_tp[client]) - { - float ClientPos[3]; - float Result[3]; - GetClientEyePosition(client, ClientPos); - MakeVectorFromPoints(ClientPos, targetfriend_prev_coords[client], Result); - GetVectorAngles(Result, Result); - float distance_between_bot_and_tp = get_power_distance(client, targetfriend_prev_coords[client]); - //when we are close enough to teleport just run forward without facing the tp - if (distance_between_bot_and_tp > 250.0) - { - TeleportEntity(client, NULL_VECTOR, Result, NULL_VECTOR); - } - if (!IsPointVisible(ClientPos, targetfriend_prev_coords[client])) - { - targetfriend_prev_coords[client][0] = 0.0; - targetfriend_prev_coords[client][1] = 0.0; - targetfriend_prev_coords[client][2] = 0.0; - bot_follow_tp[client] = false; - } - state = 8; //if its walking into a TP or up/down a ladder it matters to use +forward; - } - //if the bot or its target is on the ladder just use forward to reach the ladder - else if (GetEntityMoveType(client) == MOVETYPE_LADDER || (IsValidClient(target_friend[client]) && GetEntityMoveType(target_friend[client]) == MOVETYPE_LADDER)) - { - state = 8; - } - //if bot is ct: is close enough to friend, can stop following friend and focus on shooting zombies - else if (targeteam == 3 && 0 < dist_target < max_range_dist && IsValidClient(target_enemy[client])) - { - human_too_close[client] = true; - state = 0; - } - //if bot is ct: if bot is not close enough to friend follow him, //dist_target being larger than max_range_dist means a friend was found to follow - //we also check if zm already spawned, if not then stay close to friend - else if ((targeteam == 3 && dist_target > max_range_dist) || !found_enemy) - { - human_too_close[client] = false; - state = 1; - } - //if bot is ct and close enough to friend then just do nothing in case of there being no enemy to shoot at. - else if (targeteam == 3) - { - human_too_close[client] = true; - state = 2; - } - //if bot is zm follow enemy sometimes - else if (targeteam == 2 && 0 < enemy_distance < max_range_dist * 5 && IsValidClient(target_enemy[client])) - { - state = 3; - } - //if bot is zm just follow the closest friend zm, but not constantly when too close because people start bitching then - else if (targeteam == 2 && dist_target > max_range_dist / 2) - { - state = 4; - } - //if bot is zm and no close enemies and no friends far away enough to follow then check if friend is close, if its the case then do nothing - else if (targeteam == 2 && 0 < dist_target < max_range_dist / 2) - { - state = 5; - } - //if bot is zm and there are no friends close or far away but there is also no enemy close check if there is an enemy far away - else if (targeteam == 2 && IsValidClient(target_enemy[client])) - { - state = 6; - } - //else nothing to do as zm - else if (targeteam == 2) - { - state = 7; - } - if (GetEntProp(client, Prop_Data, "m_nWaterLevel") == 0 && GetEntityMoveType(client) != MOVETYPE_LADDER) - trace_hulling_bot(client); - char message[generic_length * 7]; - Format(message, sizeof(message), "dist_target: %f enemy_distance: %f targeteam: %i state: %i", dist_target, enemy_distance, targeteam, state); - if (specific_bot_player[client] == 1) - { - send_socket_msg(message, strlen(message), ports[0]); - } - if (specific_bot_player[client] == 2) - { - send_socket_msg(message, strlen(message), ports[1]); - } - if (specific_bot_player[client] == 3) - { - send_socket_msg(message, strlen(message), ports[2]); - } - if (specific_bot_player[client] == 4) - { - send_socket_msg(message, strlen(message), ports[3]); - } - } - } - } - found_valid_ct = false; - for (int client = 1; client <= MaxClients; client++) - { - if (!IsValidClient(client)) continue; - if (!is_bot_player[client] && GetClientTeam(client) == 3 && IsPlayerAlive(client)) - { - found_valid_ct = true; - break; - } - } - if (!found_valid_ct) - { - for (int client = 1; client <= MaxClients; client++) - { - if (!IsValidClient(client)) continue; - if (is_bot_player[client] && GetClientTeam(client) == 3) - { - ForcePlayerSuicide(client); - } - } - } - return Plugin_Continue; -} - -//https://developer.valvesoftware.com/wiki/Dimensions -public void trace_hulling_bot(int client) -{ - char message[generic_length * 3]; - float step_cap = 18.0; - float crouch_min = 48.0; - float stand_min = 63.0; - float feet_origin[3], mins[3], maxs[3], eye_position[3]; - int BOUNDINGBOX_INFLATION_OFFSET = 3; - GetClientEyePosition(client, eye_position); - GetClientAbsOrigin(client, feet_origin); - GetClientMins(client, mins); - GetClientMaxs(client, maxs); - //increasing boxes sizes - - for (int ij = 0; ij < sizeof(mins) - 1; ij++) - { - mins[ij] -= BOUNDINGBOX_INFLATION_OFFSET; - maxs[ij] += BOUNDINGBOX_INFLATION_OFFSET; - } - - //acts as full body check - feet_origin[2] += BOUNDINGBOX_INFLATION_OFFSET; - TR_TraceHullFilter(feet_origin, feet_origin, mins, maxs, MASK_ALL, TraceRayDontHitSelf); - if (TR_DidHit()) - { - //check 0.0 to 48.0 units starting from feet - feet_origin[2] -= BOUNDINGBOX_INFLATION_OFFSET; - mins[2] = 0.0; - maxs[2] = crouch_min; - TR_TraceHullFilter(feet_origin, feet_origin, mins, maxs, MASK_ALL, TraceRayDontHitSelf); - if (!(TR_DidHit())) - { - //can crouch - Format(message, sizeof(message), "hull info:crouch"); - if (specific_bot_player[client] == 1) - { - send_socket_msg(message, strlen(message), ports[0]); - } - if (specific_bot_player[client] == 2) - { - send_socket_msg(message, strlen(message), ports[1]); - } - if (specific_bot_player[client] == 3) - { - send_socket_msg(message, strlen(message), ports[2]); - } - if (specific_bot_player[client] == 4) - { - send_socket_msg(message, strlen(message), ports[3]); - } - return; - } - //something blocks floor crouch - eye_position[2] += 5.0; - float new_mins[3], new_maxs[3], new_eyes[3]; - new_mins[0] = mins[0]; - new_mins[1] = mins[1]; - new_mins[2] = crouch_min + 16.0; - new_maxs[0] = maxs[0]; - new_maxs[1] = maxs[1]; - new_maxs[2] = maxs[2] + 16.0; - new_eyes[0] = eye_position[0]; - new_eyes[1] = eye_position[1]; - new_eyes[2] = eye_position[2] - 64.0; - TR_TraceHullFilter(new_eyes, new_eyes, new_mins, new_maxs, MASK_ALL, TraceRayDontHitSelf); - if (!(TR_DidHit())) - { - //should not block jump level - Format(message, sizeof(message), "hull info:jump"); - if (specific_bot_player[client] == 1) - { - send_socket_msg(message, strlen(message), ports[0]); - } - if (specific_bot_player[client] == 2) - { - send_socket_msg(message, strlen(message), ports[1]); - } - if (specific_bot_player[client] == 3) - { - send_socket_msg(message, strlen(message), ports[2]); - } - if (specific_bot_player[client] == 4) - { - send_socket_msg(message, strlen(message), ports[3]); - } - return; - } - else - { - //still potentially crouch hole in wall or one side jumpable - mins[2] = step_cap; - float iterator = step_cap; - while (iterator < stand_min) - { - maxs[2] = iterator; - iterator += step_cap; - for (int jj = 0; jj < 2; jj++) - for (int ij = 0; ij < 2; ij++) - { - if (jj == 0) - mins[ij] += BOUNDINGBOX_INFLATION_OFFSET; - else - maxs[ij] -= BOUNDINGBOX_INFLATION_OFFSET; - - float eyes_down[3]; - eyes_down[0] = eye_position[0]; - eyes_down[1] = eye_position[1] + 10.0; - eyes_down[2] = eye_position[2]; - - float eyes_forward[3]; - eyes_forward[0] = eye_position[0]; - eyes_forward[1] = eye_position[1] + 10.0; - eyes_forward[2] = eye_position[2]; - - float maxs_new[3]; - maxs_new[0] = maxs[0] - 8.0; - maxs_new[1] = maxs[1] - 8.0; - maxs_new[2] = maxs[2]; - - TR_TraceHullFilter(eye_position, eye_position, mins, maxs_new, MASK_ALL, TraceRayDontHitSelf); - if ((TR_DidHit())) - { - bool should_jump = true; - TR_TraceHullFilter(eyes_down, eyes_forward, mins, maxs, MASK_ALL, TraceRayDontHitSelf); - if (!(TR_DidHit())) - { - should_jump = false; - } - - eyes_down[0] = eye_position[0] + 10.0; - eyes_forward[0] = eye_position[0] + 10.0; - TR_TraceHullFilter(eyes_down, eyes_forward, mins, maxs, MASK_ALL, TraceRayDontHitSelf); - if ((TR_DidHit())) - { - should_jump = false; - } - - if (should_jump) - { - Format(message, sizeof(message), "hull info:jump"); - if (specific_bot_player[client] == 1) - { - send_socket_msg(message, strlen(message), ports[0]); - } - if (specific_bot_player[client] == 2) - { - send_socket_msg(message, strlen(message), ports[1]); - } - if (specific_bot_player[client] == 3) - { - send_socket_msg(message, strlen(message), ports[2]); - } - if (specific_bot_player[client] == 4) - { - send_socket_msg(message, strlen(message), ports[3]); - } - return; - } - } - - TR_TraceHullFilter(feet_origin, feet_origin, mins, maxs, MASK_ALL, TraceRayDontHitSelf); - if (!(TR_DidHit())) - { - //hit wall on one side, no need to jump just run forward - return; - } - if (jj == 0) - mins[ij] -= BOUNDINGBOX_INFLATION_OFFSET; - else - maxs[ij] += BOUNDINGBOX_INFLATION_OFFSET; - } - } - //currently detects when two walls meet and create a corner - float move_angles[3]; - GetClientEyeAngles(client, move_angles); - move_angles[0] = 0.0; - move_angles[1] += 35.0; - move_angles[2] = 0.0; - TeleportEntity(client, NULL_VECTOR, move_angles, NULL_VECTOR); - return; - } - } -} - -public bool TraceRayDontHitSelf(int entity, int mask, any data) -{ - return entity != data && !(0 < entity <= MaxClients); -} - -stock bool IsValidClient(int client) -{ - if (client > 0 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client)) - return true; - return false; -} - -stock bool is_client_stuck_or_afk(int client, int i) -{ - //triggers between 6-8 times per second - target_friend_afk_counter[client][i]++; - int human_idle_steps = 12; - if (target_friend_afk_counter[client][i] >= human_idle_steps) - { - float min_distance_cap = 1.0; - float i_own_distance = get_power_distance(i, client_old_coords[i]); - GetEntPropVector(i, Prop_Send, "m_vecOrigin", client_old_coords[i]); - bool not_moved = i_own_distance < min_distance_cap; - if (!not_moved) - { - target_friend_afk_counter[client][i] = 0; - } - return not_moved; - } - return false; -} - -public int GetClosestClient_option1(bool finding_friend, int client, int enemy) -{ - float nearestdistance = -1.0; - int nearest = -1; - for (int i = 1; i <= MaxClients; i++) - if (IsValidClient(i) && IsPlayerAlive(i) && i != client) - { - if (!IsAbleToSee(client, i) || is_client_stuck_or_afk(client, i)) - { - continue; - } - float pos[3]; - GetEntPropVector(i, Prop_Send, "m_vecOrigin", pos); - float dist_target = get_power_distance(client, pos); - if ((finding_friend && GetClientTeam(i) != GetClientTeam(client)) || (!finding_friend && GetClientTeam(i) == GetClientTeam(client))) - { - continue; - } - - if (GetClientTeam(client) == 3 && IsValidClient(enemy)) - { - float enemy_pos[3]; - GetEntPropVector(enemy, Prop_Send, "m_vecOrigin", enemy_pos); - float enemy_distance = get_power_distance(i, enemy_pos); - //this should later be an issue at parts where zombies are on all sides around one. having to run close by them. - if (enemy_distance <= 800.0) - { - dist_target = 8000000.0; - } - } - if (is_bot_player[i]) - { - //just making sure bots have lowest priority - dist_target = 9000000.0; - } - if (nearestdistance < 0 || dist_target < nearestdistance) - { - nearest = i; - nearestdistance = dist_target; - } - } - return nearest; -} - -public float get_power_distance(int target_player, float pos[3]) -{ - float vec[3]; - GetClientAbsOrigin(target_player, vec); - return GetVectorDistance(vec, pos); -} - -public void OnClientPostAdminCheck(int client) -{ - is_bot_player[client] = false; - specific_bot_player[client] = 0; - is_autism_bot1(client); - is_autism_bot2(client); - is_autism_bot3(client); - is_autism_bot4(client); - for (int i = 1; i <= MaxClients; i++) - { - if (!IsValidClient(i)) continue; - - if (is_bot_player[i] && i != client) - { - target_friend_afk_counter[i][client] = 0; - } - } - if (is_bot_player[client]) - { - if (g_hGetRunCmdPre != INVALID_HANDLE) - DHookEntity(g_hGetRunCmdPre, false, client); - } - coords_run_cmd[client][0] = 0.0; - coords_run_cmd[client][1] = 0.0; - coords_run_cmd[client][2] = 0.0; - has_to_jump_bots[client] = 0; - //checks if ze or ze2 - int i_port = GetConVarInt(FindConVar("hostport")); - char msg[generic_length]; - if (i_port == server_ports[0]) - { - Format(msg, sizeof(msg), "autismo connected to ze"); - } - else - { - Format(msg, sizeof(msg), "autismo connected to ze2"); - } - targetfriend_prev_coords[client][0] = 0.0; - targetfriend_prev_coords[client][1] = 0.0; - targetfriend_prev_coords[client][2] = 0.0; - human_too_close[client] = false; - bot_follow_tp[client] = false; - char auth[64]; - GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth)); - if (specific_bot_player[client] == 1) - { - send_socket_msg(msg, strlen(msg), ports[0]); - } - if (specific_bot_player[client] == 2) - { - send_socket_msg(msg, strlen(msg), ports[1]); - } - if (specific_bot_player[client] == 3) - { - send_socket_msg(msg, strlen(msg), ports[2]); - } - if (specific_bot_player[client] == 4) - { - send_socket_msg(msg, strlen(msg), ports[3]); - } - client_old_coords[client][0] = 0.0; - client_old_coords[client][1] = 0.0; - client_old_coords[client][2] = 0.0; -} - -public void OnSocketError(Handle socket, const int errorType, const int errorNum, any args) -{ - CloseHandle(socket); - LogError("[MR] Socket error: %d (errno %d)", errorType, errorNum); - CreateTimer(10.0, TimerConnect, INVALID_HANDLE, TIMER_HNDL_CLOSE); -} - -stock void connect_socket() -{ - if (global_socket == INVALID_HANDLE || !SocketIsConnected(global_socket)) - { - int i_port = GetConVarInt(FindConVar("hostport")); - int target_port = ports[4]; //default ze - if (i_port == server_ports[1]) - { - //ze2 - target_port = ports[5]; - } - //socket otherwise declare in public OnConfigsExecuted(){} - global_socket = SocketCreate(SOCKET_UDP, OnSocketError); - SocketSetOption(global_socket, SocketReuseAddr, 1); - SocketBind(global_socket, "127.0.0.0", target_port); - SocketConnect(global_socket, OnSocketConnected, OnSocketReceive, OnSocketDisconnected, "127.0.0.1", target_port); //48474 on ze - } -} - -public void OnClientDisconnect(int client) -{ - client_old_coords[client][0] = 0.0; - client_old_coords[client][1] = 0.0; - client_old_coords[client][2] = 0.0; - coords_run_cmd[client][0] = 0.0; - coords_run_cmd[client][1] = 0.0; - coords_run_cmd[client][2] = 0.0; - targetfriend_prev_coords[client][0] = 0.0; - targetfriend_prev_coords[client][1] = 0.0; - targetfriend_prev_coords[client][2] = 0.0; - human_too_close[client] = false; - bot_follow_tp[client] = false; - has_to_jump_bots[client] = 0; - for (int i = 1; i <= MaxClients; i++) - { - if (IsValidClient(i) && is_bot_player[i] && i != client) - { - target_friend_afk_counter[i][client] = 0; - } - } - is_bot_player[client] = false; - specific_bot_player[client] = 0; -} - -//Socket callback -public void OnSocketConnected(Handle socket, int arg) -{ - -} - -//manage message -public void OnSocketReceive(Handle socket, char receiveData [3500], int dataSize, int hFile) -{ - -} - -public void OnSocketDisconnected(Handle socket, int arg) -{ - CreateTimer(10.0, TimerConnect, INVALID_HANDLE, TIMER_HNDL_CLOSE); -} - -public Action TimerConnect(Handle timer, any arg) -{ - connect_socket(); - return Plugin_Handled; -} - -public bool IsAbleToSee(int entity, int client) -{ - float vecorigin[3]; - float vecEyePos[3]; - GetClientAbsOrigin(entity, vecorigin); - GetClientEyePosition(client, vecEyePos); - // Check if centre is visible. - if (IsPointVisible(vecEyePos, vecorigin)) - return true; - float vecEyePos_ent[3]; - float vecEyeAng[3]; - GetClientEyeAngles(entity, vecEyeAng); - GetClientEyePosition(entity, vecEyePos_ent); - // Check if weapon tip is visible. - if (IsFwdVecVisible(vecEyePos, vecEyeAng, vecEyePos_ent)) - return true; - float mins[3]; - float maxs[3]; - GetClientMins(client, mins); - GetClientMaxs(client, maxs); - // Check outer 4 corners of player. - if (IsRectangleVisible(vecEyePos, vecorigin, mins, maxs, 1.30)) //1.30 - return true; - // Check inner 4 corners of player. - if (IsRectangleVisible(vecEyePos, vecorigin, mins, maxs, 0.65)) //0.65 - return true; - return false; -} - -public bool Filter_NoPlayers(int entity, int mask) -{ - return (entity > MaxClients && !(0 < GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity") <= MaxClients)); -} - -public bool IsPointVisible(const float start[3], const float end[3]) -{ - TR_TraceRayFilter(start, end, MASK_SOLID, RayType_EndPoint, Filter_NoPlayers); - return TR_GetFraction() == 1.0; -} - -public bool IsFwdVecVisible(const float start[3], const float angles[3], const float end[3]) -{ - float fwd[3]; - GetAngleVectors(angles, fwd, NULL_VECTOR, NULL_VECTOR); - ScaleVector(fwd, 50.0); //ScaleVector(fwd, 50.0); - AddVectors(end, fwd, fwd); - return IsPointVisible(start, fwd); -} - -public bool IsRectangleVisible(const float start[3], const float end[3], const float mins[3], const float maxs[3], float scale) -{ - float ZpozOffset = maxs[2]; - float ZnegOffset = mins[2]; - float WideOffset = ((maxs[0] - mins[0]) + (maxs[1] - mins[1])) / 4.0; - // This rectangle is just a point! - if (ZpozOffset == 0.0 && ZnegOffset == 0.0 && WideOffset == 0.0) - return IsPointVisible(start, end); - // Adjust to scale. - ZpozOffset *= scale; - ZnegOffset *= scale; - WideOffset *= scale; - // Prepare rotation matrix. - float angles[3]; - float fwd[3]; - float right[3]; - SubtractVectors(start, end, fwd); - NormalizeVector(fwd, fwd); - GetVectorAngles(fwd, angles); - GetAngleVectors(angles, fwd, right, NULL_VECTOR); - float vRectangle[4][3]; - float vTemp[3]; - // If the player is on the same level as us, we can optimize by only rotating on the z-axis. - if (FloatAbs(fwd[2]) <= 0.7071) - { - ScaleVector(right, WideOffset); - - // Corner 1, 2 - vTemp = end; - vTemp[2] += ZpozOffset; - AddVectors(vTemp, right, vRectangle[0]); - SubtractVectors(vTemp, right, vRectangle[1]); - - // Corner 3, 4 - vTemp = end; - vTemp[2] += ZnegOffset; - AddVectors(vTemp, right, vRectangle[2]); - SubtractVectors(vTemp, right, vRectangle[3]); - - } - else if (fwd[2] > 0.0) // Player is below us. - { - fwd[2] = 0.0; - NormalizeVector(fwd, fwd); - ScaleVector(fwd, scale); - ScaleVector(fwd, WideOffset); - ScaleVector(right, WideOffset); - // Corner 1 - vTemp = end; - vTemp[2] += ZpozOffset; - AddVectors(vTemp, right, vTemp); - SubtractVectors(vTemp, fwd, vRectangle[0]); - // Corner 2 - vTemp = end; - vTemp[2] += ZpozOffset; - SubtractVectors(vTemp, right, vTemp); - SubtractVectors(vTemp, fwd, vRectangle[1]); - // Corner 3 - vTemp = end; - vTemp[2] += ZnegOffset; - AddVectors(vTemp, right, vTemp); - AddVectors(vTemp, fwd, vRectangle[2]); - // Corner 4 - vTemp = end; - vTemp[2] += ZnegOffset; - SubtractVectors(vTemp, right, vTemp); - AddVectors(vTemp, fwd, vRectangle[3]); - } - else // Player is above us. - { - fwd[2] = 0.0; - NormalizeVector(fwd, fwd); - ScaleVector(fwd, scale); - ScaleVector(fwd, WideOffset); - ScaleVector(right, WideOffset); - // Corner 1 - vTemp = end; - vTemp[2] += ZpozOffset; - AddVectors(vTemp, right, vTemp); - AddVectors(vTemp, fwd, vRectangle[0]); - // Corner 2 - vTemp = end; - vTemp[2] += ZpozOffset; - SubtractVectors(vTemp, right, vTemp); - AddVectors(vTemp, fwd, vRectangle[1]); - // Corner 3 - vTemp = end; - vTemp[2] += ZnegOffset; - AddVectors(vTemp, right, vTemp); - SubtractVectors(vTemp, fwd, vRectangle[2]); - // Corner 4 - vTemp = end; - vTemp[2] += ZnegOffset; - SubtractVectors(vTemp, right, vTemp); - SubtractVectors(vTemp, fwd, vRectangle[3]); - } - // Run traces on all corners. - for (int i = 0; i < 4; i++) - if (IsPointVisible(start, vRectangle[i])) - return true; - return false; -} diff --git a/AutismBotIngame/scripting/autism_bot_simulate_movement.sp b/AutismBotIngame/scripting/autism_bot_simulate_movement.sp index a0aa7a7..8a75061 100755 --- a/AutismBotIngame/scripting/autism_bot_simulate_movement.sp +++ b/AutismBotIngame/scripting/autism_bot_simulate_movement.sp @@ -40,6 +40,9 @@ Handle global_socket; //timer handle Handle g_hTimer_pressing = null; Handle g_hTimer_bot_connect = null; +Handle g_hTimer_bot_connect2 = null; +Handle g_hTimer_bot_connect3 = null; +Handle g_hTimer_bot_connect4 = null; int specific_bot_player[MAXPLAYERS + 1]; @@ -64,7 +67,11 @@ public void OnPluginStart() connect_socket(); chat_cooldown = false; - g_hTimer_bot_connect = CreateTimer(90.0, bot_check_connect, _, TIMER_REPEAT); + g_hTimer_bot_connect = CreateTimer(60.0, bot_check_connect, _, TIMER_REPEAT); + CreateTimer(5.0, activate_timer2); + CreateTimer(10.0, activate_timer3); + CreateTimer(15.0, activate_timer4); + g_hTimer_pressing = CreateTimer(2.0, check_team, _, TIMER_REPEAT); target_client[1] = -1; @@ -81,6 +88,24 @@ public void OnPluginStart() } } +public Action activate_timer2(Handle timer, any data) +{ + g_hTimer_bot_connect2 = CreateTimer(60.0, bot_check_connect2, _, TIMER_REPEAT); + return Plugin_Continue; +} + +public Action activate_timer3(Handle timer, any data) +{ + g_hTimer_bot_connect3 = CreateTimer(60.0, bot_check_connect3, _, TIMER_REPEAT); + return Plugin_Continue; +} + +public Action activate_timer4(Handle timer, any data) +{ + g_hTimer_bot_connect4 = CreateTimer(60.0, bot_check_connect4, _, TIMER_REPEAT); + return Plugin_Continue; +} + public void OnPluginEnd() { if (g_hTimer_pressing != null) @@ -91,29 +116,17 @@ public void OnPluginEnd() { delete g_hTimer_bot_connect; } -} - -public void OnMapEnd() -{ - int autism_bot_counter = 0; - for (int i = 1; i <= MaxClients; i++) + if (g_hTimer_bot_connect2 != null) { - if (IsValidClient(i) && specific_bot_player[i] != -1) - { - autism_bot_counter++; - } + delete g_hTimer_bot_connect2; } - for (int i = 1; i <= MaxClients; i++) + if (g_hTimer_bot_connect3 != null) { - if (autism_bot_counter <= 1) - { - break; - } - if (IsValidClient(i) && specific_bot_player[i] != -1) - { - KickClient(i); - autism_bot_counter--; - } + delete g_hTimer_bot_connect3; + } + if (g_hTimer_bot_connect4 != null) + { + delete g_hTimer_bot_connect4; } } @@ -298,23 +311,166 @@ public void send_socket_msg(char[] query_msg, int len, int port) public Action bot_check_connect(Handle timer, any data) { + char nextmap[64]; + if (GetNextMap(nextmap, sizeof(nextmap))) + { + char msg[generic_length]; + Format(msg, sizeof(msg), "download map:%s", nextmap); + send_socket_msg(msg, strlen(msg), ports[0]); + } + //this is designed for being ran from several css servers int client_count = GetClientCount(false); char msg[generic_length]; int i_port = GetConVarInt(FindConVar("hostport")); bool bot1_connected = false; - bool bot2_connected = false; - bool bot3_connected = false; - bool bot4_connected = false; for (int i = 1; i <= MaxClients; i++) if (IsValidClient(i) && !IsFakeClient(i)) { if (specific_bot_player[i] == 1) bot1_connected = true; + } + + if (i_port == server_ports[0]) + { + int max_allowed_players = 55; + char current_map[128]; + GetCurrentMap(current_map, sizeof(current_map)); + if (client_count > max_allowed_players) + { + Format(msg, sizeof(msg), "connect to ze2"); + send_socket_msg(msg, strlen(msg), ports[0]); + } + else if (client_count < max_allowed_players - 5) + { + Format(msg, sizeof(msg), "connect to ze"); + if (!bot1_connected) + send_socket_msg(msg, strlen(msg), ports[0]); + } + } + else + { + //in case the bot is not connected to ze2 anymore make sure that is_bot_connected_to_ze2 is set to false again + Format(msg, sizeof(msg), "not connected to ze2"); + if (!bot1_connected) + send_socket_msg(msg, strlen(msg), ports[0]); + } + return Plugin_Continue; +} + +public Action bot_check_connect2(Handle timer, any data) +{ + char nextmap[64]; + if (GetNextMap(nextmap, sizeof(nextmap))) + { + char msg[generic_length]; + Format(msg, sizeof(msg), "download map:%s", nextmap); + send_socket_msg(msg, strlen(msg), ports[0]); + } + //this is designed for being ran from several css servers + int client_count = GetClientCount(false); + char msg[generic_length]; + int i_port = GetConVarInt(FindConVar("hostport")); + bool bot2_connected = false; + for (int i = 1; i <= MaxClients; i++) + if (IsValidClient(i) && !IsFakeClient(i)) + { if (specific_bot_player[i] == 2) bot2_connected = true; + } + + if (i_port == server_ports[0]) + { + int max_allowed_players = 55; + char current_map[128]; + GetCurrentMap(current_map, sizeof(current_map)); + if (client_count > max_allowed_players) + { + Format(msg, sizeof(msg), "connect to ze2"); + send_socket_msg(msg, strlen(msg), ports[1]); + } + else if (client_count < max_allowed_players - 5) + { + Format(msg, sizeof(msg), "connect to ze"); + if (!bot2_connected) + send_socket_msg(msg, strlen(msg), ports[1]); + } + } + else + { + //in case the bot is not connected to ze2 anymore make sure that is_bot_connected_to_ze2 is set to false again + Format(msg, sizeof(msg), "not connected to ze2"); + if (!bot2_connected) + send_socket_msg(msg, strlen(msg), ports[1]); + } + return Plugin_Continue; +} + +public Action bot_check_connect3(Handle timer, any data) +{ + char nextmap[64]; + if (GetNextMap(nextmap, sizeof(nextmap))) + { + char msg[generic_length]; + Format(msg, sizeof(msg), "download map:%s", nextmap); + send_socket_msg(msg, strlen(msg), ports[0]); + } + //this is designed for being ran from several css servers + int client_count = GetClientCount(false); + char msg[generic_length]; + int i_port = GetConVarInt(FindConVar("hostport")); + bool bot3_connected = false; + for (int i = 1; i <= MaxClients; i++) + if (IsValidClient(i) && !IsFakeClient(i)) + { if (specific_bot_player[i] == 3) bot3_connected = true; + } + + if (i_port == server_ports[0]) + { + int max_allowed_players = 55; + char current_map[128]; + GetCurrentMap(current_map, sizeof(current_map)); + if (client_count > max_allowed_players) + { + Format(msg, sizeof(msg), "connect to ze2"); + send_socket_msg(msg, strlen(msg), ports[2]); + } + else if (client_count < max_allowed_players - 5) + { + Format(msg, sizeof(msg), "connect to ze"); + if (!bot3_connected) + send_socket_msg(msg, strlen(msg), ports[2]); + } + } + else + { + //in case the bot is not connected to ze2 anymore make sure that is_bot_connected_to_ze2 is set to false again + Format(msg, sizeof(msg), "not connected to ze2"); + if (!bot3_connected) + send_socket_msg(msg, strlen(msg), ports[2]); + } + return Plugin_Continue; +} + +public Action bot_check_connect4(Handle timer, any data) +{ + char nextmap[64]; + if (GetNextMap(nextmap, sizeof(nextmap))) + { + char msg[generic_length]; + Format(msg, sizeof(msg), "download map:%s", nextmap); + send_socket_msg(msg, strlen(msg), ports[0]); + } + //this is designed for being ran from several css servers + int client_count = GetClientCount(false); + char msg[generic_length]; + int i_port = GetConVarInt(FindConVar("hostport")); + bool bot4_connected = false; + for (int i = 1; i <= MaxClients; i++) + if (IsValidClient(i) && !IsFakeClient(i)) + { if (specific_bot_player[i] == 4) bot4_connected = true; } @@ -327,20 +483,11 @@ public Action bot_check_connect(Handle timer, any data) if (client_count > max_allowed_players) { Format(msg, sizeof(msg), "connect to ze2"); - send_socket_msg(msg, strlen(msg), ports[0]); - send_socket_msg(msg, strlen(msg), ports[1]); - send_socket_msg(msg, strlen(msg), ports[2]); send_socket_msg(msg, strlen(msg), ports[3]); } else if (client_count < max_allowed_players - 5) { Format(msg, sizeof(msg), "connect to ze"); - if (!bot1_connected) - send_socket_msg(msg, strlen(msg), ports[0]); - if (!bot2_connected) - send_socket_msg(msg, strlen(msg), ports[1]); - if (!bot3_connected) - send_socket_msg(msg, strlen(msg), ports[2]); if (!bot4_connected) send_socket_msg(msg, strlen(msg), ports[3]); } @@ -349,12 +496,6 @@ public Action bot_check_connect(Handle timer, any data) { //in case the bot is not connected to ze2 anymore make sure that is_bot_connected_to_ze2 is set to false again Format(msg, sizeof(msg), "not connected to ze2"); - if (!bot1_connected) - send_socket_msg(msg, strlen(msg), ports[0]); - if (!bot2_connected) - send_socket_msg(msg, strlen(msg), ports[1]); - if (!bot3_connected) - send_socket_msg(msg, strlen(msg), ports[2]); if (!bot4_connected) send_socket_msg(msg, strlen(msg), ports[3]); }