diff --git a/AutismBotIngame/python/ingamefollowct.py b/AutismBotIngame/python/ingamefollowct.py index 8e41570a..34f4cb09 100644 --- a/AutismBotIngame/python/ingamefollowct.py +++ b/AutismBotIngame/python/ingamefollowct.py @@ -1,7 +1,6 @@ import os import subprocess import atexit -import re from threading import Timer import string import random @@ -24,7 +23,7 @@ def clearconsolelog(): if clearbool: clearbool = False open(consolelogPath, 'w').close() - print('cleaned console') + #print('cleaned console') connectionTimer = Timer(3.0, switchbool) #daemon true kills thread instead of deadlock waiting in case program exits connectionTimer.daemon = True @@ -35,32 +34,43 @@ def writeCfgInput(Input): f.write(Input) def getconsoleOutputForStatus(): - randomlygeneratedString = id_generator(11) - str = "status; wait 5; {0}; wait 5;".format(randomlygeneratedString) - writeCfgInput(str) - checkConsoleOutput(randomlygeneratedString) - server_str = "" - player_count = 0 - with open(consolelogPath, 'r') as f: - for line in f: - if "udp/ip :" in line: server_str = line[9:].strip() - if "players :" in line: player_count = int(line[9:].split()[0].strip()) - print('server_str: ', server_str, '\nplayer_count: ', player_count) - return (server_str, player_count) + i = 0 + while i < 8: + time.sleep(0.25) + randomlygeneratedString = id_generator(11) + str = "status; wait 5; {0}; wait 5;".format(randomlygeneratedString) + writeCfgInput(str) + checkConsoleOutput(randomlygeneratedString) + server_str = "" + player_count = 0 + with open(consolelogPath, 'r') as f: + for line in f: + try: + if "udp/ip" in line: server_str = line[9:].strip() + if "players " in line: player_count = int(line[9:].split()[0].strip()) + except Exception: + pass + if server_str: + print('server_str: ', server_str, '\nplayer_count: ', player_count) + return (server_str, player_count) + i += 1 + return ("None", "None") def get_output_if_spec(): randomlygeneratedString = id_generator(11) - str = "zspawn; wait 50; {0}; wait 5;".format(randomlygeneratedString) + str = "zspawn; wait 500; {0}; wait 5;".format(randomlygeneratedString) writeCfgInput(str) #is sm_team a command to show team? #maybe instead say !teaminfo, add sourcemod command to autism_bot_info.sp to print team to chat instead targetstr = "This feature requires that you are on a team." failurestr = "Unknown command \"zspawn\"" + alivestr = "This feature requires that you are dead." checkConsoleOutput(randomlygeneratedString) with open(consolelogPath, 'r') as f: for line in f: + if alivestr in line: return 2 if targetstr in line: return 1 - if failurestr in line: return 2 + if failurestr in line: return 0 return 0 def checkConsoleOutput(input): @@ -92,7 +102,6 @@ def exit_handler(): with open(looptestPath, 'w') as f: f.write(str) - def joinTeam(): randomlygeneratedString = id_generator(11) str = "jointeam 2; wait 2; zspawn; wait 1; {0}; wait 5;".format(randomlygeneratedString) @@ -106,7 +115,7 @@ def checkbotteam(): if state == 1: joinTeam() break - if state == 0: + if state == 2: break resetCfgInputShortWait() connectionTimer = Timer(20.0, checkbotteam) @@ -118,12 +127,12 @@ def checkIfConnected(): server_str, player_count = getconsoleOutputForStatus() connectionTimer = None if "27015" not in server_str: - str1 = "connect 151.80.230.149:27015; wait 5; {0}; wait 1500; ".format(randomlygeneratedString) + str1 = "connect 151.80.230.149:27015; {0}; wait 500;".format(randomlygeneratedString) writeCfgInput(str1) checkConsoleOutput(randomlygeneratedString) - elif player_count > 58: + elif player_count > 63: #TODO check team differently because zspawn unknown command on zr server - writeCfgInput("connect 151.80.230.149:27016; wait 5; {0}; wait 1500;".format(randomlygeneratedString)) + writeCfgInput("connect 151.80.230.149:27016; {0}; wait 5;".format(randomlygeneratedString)) checkConsoleOutput(randomlygeneratedString) connectionTimer = Timer(60.0 * 15, checkIfConnected) resetCfgInputShortWait() @@ -132,78 +141,114 @@ def checkIfConnected(): #daemon true kills thread instead of deadlock waiting in case program exits connectionTimer.daemon = True connectionTimer.start() - -def getBotOrigin(): - randomlygeneratedString = id_generator(11) - str = "getpos; wait 1; {0}; wait 5;".format(randomlygeneratedString) - writeCfgInput(str) - checkConsoleOutput(randomlygeneratedString) - previousStr = "" - with open(consolelogPath, 'r') as f: - for line in f: - if randomlygeneratedString in line: - try: - coords = re.search('setpos (.*);setang', previousStr).group(1).strip().split() - print('coords: ', coords) - return coords - except AttributeError as err: - pass - previousStr = line - return None + #print('finished checkIfConnected') def get_player_info(): movement_input = [] ct_angles = [] - while not movement_input and not ct_angles: + ct_origin_diff = [] + ct_origin_position = [] + ct_distance = 0 + while True: with open(consolelogPath, 'r') as f: - for line in f: - if "movement_input_specific:" in line: - try: - movement = line.split("movement_input_specific:", 1)[1] - movement = movement.replace("\n", "") + try: + for line in f: + print('line: ', line) + if "movement_input_specific:" in line and len(line) > 26: + movement_input = line.split("movement_input_specific:", 1)[1].split("+") + movement_input = [element.replace("\n", "") for element in movement_input] #print('movement: ', movement) - movement_input.append(movement) - except IndexError: - pass - if "ct_eye_angles_:" in line: - try: + if "ct_eye_angles_:" in line: ct_angles = line.split("ct_eye_angles_:", 1)[1].split("+") - except IndexError: - pass - ct_angles = [element.strip() for element in ct_angles] - return (movement_input, ct_angles) + ct_angles = [element.strip() for element in ct_angles] + if "player_origin_diff:" in line: + ct_origin_diff = line.split("player_origin_diff:", 1)[1].split("+") + ct_origin_diff = [element.strip() for element in ct_origin_diff] + ct_origin_diff = [float(element) for element in ct_origin_diff] + if "player_origin_position:" in line: + ct_origin_position = line.split("player_origin_position:", 1)[1].split("+") + ct_origin_position = [element.strip() for element in ct_origin_position] + if "player_lowest_distance:" in line: + ct_distance = line.split("player_lowest_distance:", 1)[1].strip() + ct_distance = float(ct_distance) + if movement_input and ct_angles and ct_origin_diff and ct_origin_position and ct_distance: + return (movement_input, ct_angles, ct_origin_diff, ct_origin_position, ct_distance) + except (UnicodeDecodeError, IndexError): + pass def getBotOrgin(botOrigin): #x -> z -> y coordAxis order botOrigin = [x.strip() for x in botOrigin] botOrigin = [x.replace(";", "") for x in botOrigin] + #botOrigin = [x.replace(";", "") for x in botOrigin] botIntorigin0 = float(botOrigin[0]) botIntorigin1 = float(botOrigin[1]) botIntorigin2 = float(botOrigin[2]) #bot coordinates might be usefull? return [botIntorigin0, botIntorigin1, botIntorigin2] -def followPlayer(): +def getBotOrigin(): + while True: + str = "getpos; wait 1; wait 5;" + writeCfgInput(str) + previousStr = "" + with open(consolelogPath, 'r') as f: + for line in f: + if "setpos" in line: + try: + print('found setpos line: ', line) + coords = line.split("setpos")[1].split(";setang")[0].split() + #print('coords: ', coords) + return getBotOrgin(coords) + except IndexError as err: + pass + previousStr = line + +def followPlayer(remaining_instructions = [], indexCounter = 0, previousmoment = []): #setang 0 180 0; #default_input = "+attack; wait 50; cl_minmodels; wait 50; +right; wait 50; +jump; wait 50; -jump; wait 50; +forward; wait 50; {0}; wait 5;".format(randomlygeneratedString) #writeCfgInput(default_input) - #botOrigin = getBotOrigin() - movement_input, ct_angles = get_player_info() - print('movement_input: ', movement_input, '\nct_angles: ', ct_angles) + botOrigin = getBotOrigin() + movement_input, ct_angles, ct_origin_diff, ct_origin_position, ct_distance = get_player_info() + print('movement_input: ', movement_input, '\nct_angles: ', ct_angles, "\nct_origin_diff: ", ct_origin_diff, "\nct_origin_position: ", ct_origin_position, "\nct_distance: ", ct_distance, "\nbotOrigin: ", botOrigin) randomlygeneratedString = id_generator(11) - - strInput = "-forward; wait 5; -back; wait 5; -moveleft; wait 5; -moveright; wait 5; -jump; wait 5; +attack; wait 5; cl_minmodels 1; wait 5; {0}; wait 5; setang {1} {2} {3}; wait 5;".format(randomlygeneratedString, ct_angles[0], ct_angles[1], ct_angles[2]) - for movement in movement_input: - strInput += movement - strInput += "; wait 5;" - #print('strInput: ', strInput) + remaining_instructions.append([movement_input, ct_angles]) + strInput = "-jump; wait 5; +attack; wait 5; cl_minmodels 1; wait 5; setang 0 180 0; wait 5;".format(ct_angles[0], ct_angles[1], ct_angles[2]) + #strInput += "-forward; wait 5; -back; wait 5; -moveleft; wait 5; -moveright; wait 5; " + if ct_distance > 250: + remaining_instructions = [] + indexCounter = 0 + #0 180 0: W = X axis greater minus, S = X axis greater plus, A = Y axis greater minus, D = Y axis greater plus + if botOrigin[0] + 50 > ct_origin_diff[0]: + strInput += "wait 5; +forward;" + elif botOrigin[0] - 50 < ct_origin_diff[0]: + strInput += "wait 5; +back;" + if botOrigin[1] + 50 > ct_origin_diff[1]: + strInput += "wait 5; +moveleft;" + elif botOrigin[1] - 50 < ct_origin_diff[1]: + strInput += "wait 5; +moveright;" + print('ct_distance > 250:') + else: + (movement, angles) = remaining_instructions[indexCounter] + if previousmoment != movement: + strInput += "-forward; wait 5; -back; wait 5; -moveleft; wait 5; -moveright; wait 5; " + previousmoment = movement + strInput = strInput.replace("setang 0 180 0;", "setang {0} {1} {2};".format(angles[0], angles[1], angles[2])) + for move in movement: + strInput += "+" + strInput += move + strInput += "; " + indexCounter += 1 + strInput += " wait 5; {0}; ".format(randomlygeneratedString) + print('strInput: ', strInput) writeCfgInput(strInput) checkConsoleOutput(randomlygeneratedString) clearconsolelog() - connectionTimer = Timer(1.0, followPlayer) + connectionTimer = Timer(0.2, followPlayer, args=(remaining_instructions, indexCounter)) connectionTimer.daemon = True connectionTimer.start() + def deadlock(): try: while True: 42 == 42 diff --git a/AutismBotIngame/scripting/autism_bot_info.sp b/AutismBotIngame/scripting/autism_bot_info.sp index bc48986f..dc82da0e 100644 --- a/AutismBotIngame/scripting/autism_bot_info.sp +++ b/AutismBotIngame/scripting/autism_bot_info.sp @@ -10,9 +10,7 @@ #pragma newdecls required -bool outputspam[MAXPLAYERS + 1]; -int ticksCooldown = 48; // 66 tick per second -int botTicker; +int present = 0; int targethuman = 0; public Plugin myinfo = @@ -24,127 +22,101 @@ public Plugin myinfo = url = "" }; -public void OnPluginStart() -{ - RegConsoleCmd("sm_botfindString", Cmd_findBotString); -} - -//---------------------------------------------------------------------------------------------------- -// Purpose: -//---------------------------------------------------------------------------------------------------- -public Action Cmd_findBotString(int client, int args) -{ - if (!IsValidClient(client)) - return Plugin_Handled; - if (!outputspam[client]) - return Plugin_Handled; - if (args != 1) - { - ReplyToCommand(client, "[SM] Usage botfindString <string>"); - return Plugin_Handled; - } - char sTarget[65]; - GetCmdArg(1, sTarget, sizeof(sTarget)); - PrintToChat(client, sTarget); - return Plugin_Handled; -} - public void OnClientDisconnect(int client) { - outputspam[client] = false; + if (present == client) + present = 0; } -stock void TraceEye(const int client, float pos[3]) +public void OnPluginStart() { - float vAngles[3], vOrigin[3]; - GetClientEyePosition(client, vOrigin); - GetClientEyeAngles(client, vAngles); - - TR_TraceRayFilter(vOrigin, vAngles, MASK_SHOT, RayType_Infinite, TraceEntityFilterPlayer); - - if(TR_DidHit()) - TR_GetEndPosition(pos); + //hooks + HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); } -public bool TraceEntityFilterPlayer( int entity, int contentsMask ) +public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast) { - return ( entity > GetMaxClients() || !entity ); + targethuman = 0; } -//TODO FINISH MOVING OVER, RECURSIVE OR 1 SEC TIMER JUST instead of using OnPlayerRunCmdPost - -public void recursivePressing() +public void OnMapStart() { - if (targethuman && (GetClientTeam(targethuman) != 3 || !IsPlayerAlive(targethuman))) + CreateTimer(0.3, recursive_pressing, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); +} + +public bool TraceEntityFilterPlayer(int entity, int contentsMask) +{ + return (entity > GetMaxClients() || !entity); +} + +public Action recursive_pressing(Handle timer, any data) +{ + //PrintToChatAll("present: %N", present); + if (present) { - targethuman = 0; - } - if (!targethuman) - { - float pos_client[3]; - TraceEye(client, pos_client); + float client_coord[3]; + float xyz[3]; float lowest_distance = 1000000.0; + float pos_client[3]; + GetClientAbsOrigin(present, pos_client); for (int i = 1; i <= MaxClients; i++) - if (IsValidClient(i) && IsPlayerAlive(i) && GetClientTeam(i) == 3 && i != client) + if (IsValidClient(i) && IsPlayerAlive(i) && GetClientTeam(i) == 3 && i != present) { float pos_i[3]; - TraceEye(client, pos_i); + GetClientAbsOrigin(i, pos_i); float dx = pos_client[0] - pos_i[0]; float dy = pos_client[1] - pos_i[1]; float dz = FloatAbs(pos_client[2] - pos_i[2]); float dist = SquareRoot(dx*dx + dy*dy + dz*dz); + //PrintToChatAll("dist: %f", dist); if (dist < lowest_distance) { lowest_distance = dist; targethuman = i; + client_coord = pos_i; + xyz[0] = dx; + xyz[1] = dy; + xyz[2] = dz; } } - } - //maybe this holds some order? - float clientorigin[3]; - float clientangles[3]; - GetClientAbsOrigin(targethuman, clientorigin); - GetClientAbsAngles(targethuman, clientangles); - //PrintToChat(client, "player_start_origin: %f %f %f", clientorigin[0], clientorigin[1], clientorigin[2]); - int keys = GetClientButtons(targethuman); - if (keys & IN_FORWARD) - { - ServerCommand("sm_psay #[U:1:120378081] movement_input_specific:+forward"); - } - if (keys & IN_BACK) - { - ServerCommand("sm_psay #[U:1:120378081] movement_input_specific:+back"); - } - if (keys & IN_LEFT) - { - ServerCommand("sm_psay #[U:1:120378081] movement_input_specific:+moveleft"); - } - if (keys & IN_RIGHT) - { - ServerCommand("sm_psay #[U:1:120378081] movement_input_specific:+moveright"); - } - if (keys & IN_JUMP) - { - ServerCommand("sm_psay #[U:1:120378081] movement_input_specific:+jump"); - } - ServerCommand("sm_psay #[U:1:120378081] ct_eye_angles_:%f+%f+%f", clientangles[0], clientangles[1], clientangles[2]); -} - -//---------------------------------------------------------------------------------------------------- -// Purpose: -//---------------------------------------------------------------------------------------------------- -public void OnPlayerRunCmdPost(int client, int buttons, int impulse, const float vel[3], const float angles[3], int weapon, int subtype, int cmdnum, int tickcount, int seed, const int mouse[2]) -{ - if (!IsClientInGame(client)) return; - if (IsPlayerAlive(client) && outputspam[client]) - { - if (botTicker > ticksCooldown) + if (IsValidClient(targethuman)) { - botTicker = 0; - + //PrintToChatAll("targethuman: %N", targethuman); + float clientangles[3]; + GetClientAbsAngles(targethuman, clientangles); + int keys = GetClientButtons(targethuman); + char keyinput[256]; + if (keys & IN_FORWARD) + { + StrCat(keyinput, sizeof(keyinput), "forward+"); + } + if (keys & IN_BACK) + { + StrCat(keyinput, sizeof(keyinput), "back+"); + } + if (keys & IN_MOVELEFT) + { + StrCat(keyinput, sizeof(keyinput), "moveleft+"); + } + if (keys & IN_MOVERIGHT) + { + StrCat(keyinput, sizeof(keyinput), "moveright+"); + } + if (keys & IN_JUMP) + { + StrCat(keyinput, sizeof(keyinput), "jump+"); + } + //PrintToChatAll("keyinput: %s", keyinput); + //PrintToChatAll("xyz[0], xyz[1], xyz[2]: %f %f %f", xyz[0], xyz[1], xyz[2]); + //PrintToChatAll("lowest_distance: %f", lowest_distance); + ServerCommand("sm_psay #[U:1:120378081] movement_input_specific:%s", keyinput); + ServerCommand("sm_psay #[U:1:120378081] ct_eye_angles_:%f+%f+%f", clientangles[0], clientangles[1], clientangles[2]); + ServerCommand("sm_psay #[U:1:120378081] player_origin_diff:%f+%f+%f", xyz[0], xyz[1], xyz[2]); + ServerCommand("sm_psay #[U:1:120378081] player_origin_position:%f+%f+%f", client_coord[0], client_coord[1], client_coord[2]); + ServerCommand("sm_psay #[U:1:120378081] player_lowest_distance:%f", lowest_distance); } - botTicker++; } + return Plugin_Handled; } stock bool IsValidClient(int client) @@ -164,10 +136,8 @@ public void OnClientPostAdminCheck(int client) //[U:1:69566635] char auth[50]; GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth)); - //PrintToChatAll("client: %N \nAuth: %s", client, auth); - outputspam[client] = false; if (StrEqual("[U:1:120378081]", auth, false)) - { - outputspam[client] = true; - } + present = client; + else if (StrEqual("STEAM_0:1:60189040", auth, false)) + present = client; } \ No newline at end of file