import os import sys import subprocess import atexit from threading import Timer import string import random import signal import socket import codecs import datetime import time looptestPath = '/home/gameservers/.steam/steam/steamapps/common/Counter-Strike Source/cstrike/cfg/looptest.cfg' chatmsg = "" ladder_counter = 0 def colored(r, g, b, text): return "\033[38;2;{};{};{}m{} \033[38;2;255;255;255m".format(r, g, b, text) def writeCfgInput(Input_user): with open(looptestPath, 'w') as f: if input == "wait 5;": time.sleep(1) colored_text = colored(255, 0, 0, ('Input: ' + Input_user)) print(colored_text) f.write(Input_user) def exit_handler(): print('reached exithandler') writeCfgInput('wait 5;') def joinTeam(): str = "jointeam 2; joinclass 3; zspawn;" writeCfgInput(str) print('jointeam func: ') writeCfgInput('wait 5;') def bot_process_surf(input_line): bot_surf_plane = input_line[input_line.index("surfing:") + len("surfing:"):] bot_surf_plane = bot_surf_plane.strip() bot_surf_plane = [float(i.replace('\U00002013', '-')) for i in bot_surf_plane.split(' ')] #X axis positive = hold A #X axis negative = hold D #if Y axis = 0.0 use X instead #Y axis negative = hold A #Y axis positive = hold D strInput = "-forward; wait 3; " if bot_surf_plane[1] < 0.0: strInput += "+moveleft; wait 3; " elif bot_surf_plane[1] > 0.0: strInput += "+moveright; wait 3;" elif bot_surf_plane[0] < 0.0: strInput += "+moveleft; wait 3; " elif bot_surf_plane[0] > 0.0: strInput += "+moveright; wait 3; " print('date: ', datetime.datetime.now().time(),'bot surfing bot_surf_plane: ', bot_surf_plane) writeCfgInput(strInput) writeCfgInput("wait 5;") def bot_process_keyinput(input_line): movement_input = input_line[input_line.index("keyinput:") + len("keyinput:"):input_line.index("dist_target:")] dist_target = input_line[input_line.index("dist_target:") + len("dist_target:"):] dist_target = float(dist_target) strInput = f"""{movement_input}; wait 5; -jump; wait 5; -duck; wait 5; """ writeCfgInput(strInput) print('MIMIC date: ', datetime.datetime.now().time(), ' dist_target: ', dist_target, ' movement strinput: ', strInput) writeCfgInput("wait 5;") def bot_process_movement(input_line): dist_target = input_line[input_line.index("dist_target:") + len("dist_target:"):input_line.index("targethuman:")] targethuman = input_line[input_line.index("targethuman:") + len("targethuman:"):input_line.index("bot_on_type:")] bot_on_type = input_line[input_line.index("bot_on_type:") + len("bot_on_type:"):input_line.index("enemy_distance:")] enemy_distance = input_line[input_line.index("enemy_distance:") + len("enemy_distance:"):input_line.index("dot_product:")] dot_product = input_line[input_line.index("dot_product:") + len("dot_product:"):input_line.index("targeteam:")] targeteam = input_line[input_line.index("targeteam:") + len("targeteam:"):input_line.index("target_enemy:")] target_enemy = input_line[input_line.index("target_enemy:") + len("target_enemy:"):input_line.index("z_axis:")] z_axis = input_line[input_line.index("z_axis:") + len("z_axis:"):] dist_target = float(dist_target) z_axis = float(z_axis) enemy_distance = float(enemy_distance) bot_on_type = int(bot_on_type) dot_product = float(dot_product) targeteam = int(targeteam) min_distance_target_human = 800.0 strInput = "-attack; wait 2; -use; wait 5; -jump; wait 5; -duck; wait 5; +attack; wait 5; cl_minmodels 1; wait 2; +use; +forward; wait 2; " crouch_cap = 5000.0 jump_cap = 12000.0 if 0.0 < dot_product <= crouch_cap: #print('crouching', datetime.datetime.now().time()) strInput += "+duck; wait 1500; +jump; -duck; wait 250; -jump; wait 50;" elif 0.0 < dot_product <= jump_cap: #print('jumping', datetime.datetime.now().time()) strInput += "+jump; wait 350; +duck; wait 250; -jump; -duck; wait 50;" if dist_target > min_distance_target_human: strInput += "use weapon_elite; wait 3; " elif targeteam == 3: strInput += "use weapon_p90; wait 3; " elif targeteam == 2: strInput += "use weapon_knife; wait 5; " global ladder_counter if bot_on_type == 0 and ladder_counter < 100: print('bot_on_type ladder, ladder_counter: ', ladder_counter) strInput += "setang -90 0 0; wait 5; -back; wait 3; -moveleft; wait 3; -moveright; wait 5; -jump; wait 3; -duck; wait 3; " ladder_counter += 1 else: ladder_counter = 0 min_enemy_distance = 100.0 if bot_on_type == 3: for _ in range(5): strInput += "+jump; wait 5;" if enemy_distance > 0: print('date: ', datetime.datetime.now().time(), ' target_enemy: ', target_enemy, ' enemy distance: ', enemy_distance) else: print('date: ', datetime.datetime.now().time(), ' target human: ', targethuman, ' dist_target: ', dist_target,) strInput = strinput_append(strInput, 2) #print('strInput final:', strInput) writeCfgInput(strInput) writeCfgInput("wait 5;") def strinput_append(strInput, nth): for _ in range(10 * nth): boolean_val = random.choice([True, False]) if boolean_val: strInput += "+moveleft; wait 15; -moveleft; " else: strInput += "+moveright; wait 15; -moveright; " return strInput def kill_css_process(): css_pid = subprocess.getoutput(["pidof hl2_linux"]) if css_pid: print('css_pid: ', css_pid, 'shutting the bots game down....') css_pid = int(css_pid.strip()) os.kill(css_pid, signal.SIGTERM) time.sleep(15) print('preparing to launch game....') os.chdir('/home/gameservers/.steam/debian-installation/') subprocess.check_call("./steam.sh %s" % ("-applaunch 240 -textmode -textmessagedebug -novid -nosound -noipx -nojoy -noshaderapi"), shell=True) print('finished starting game') def bot_connect_ze(): #use whatever ip you want here to connect with strdev = "connect 151.80.230.149:27019/test132;" str1 = "connect 151.80.230.149:27015;" writeCfgInput(str1) writeCfgInput('wait 5;') print('not yet connected') if __name__ == '__main__': atexit.register(exit_handler) local_ip = "127.0.0.1" local_port = 48477 udp_external_ip = "62.210.110.245" buffer_size = 4096 #potentially not large enough? connection_issue_counter = 0; sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock_external = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(("", local_port)) print('reached deadlock') try: while True: data, addr = sock.recvfrom(buffer_size) databyte = data data = codecs.decode(data, "utf-8", "ignore") ip = addr[0] port = addr[1] #print('port: ', port, " ip: ", ip) if not data: continue if ip not in [local_ip, udp_external_ip]: continue if ip == udp_external_ip: response_msg = f"""say {data}""" print("enabled remote UDP packet response_msg: ", response_msg) writeCfgInput(response_msg) writeCfgInput("wait 5;") if data == "autismo connected": print('Bot connected!') connection_issue_counter = 0 joinTeam() elif data == "bot kicked server full": print('bot kicked server full: ', datetime.datetime.now().time()) elif data == "connect to ze": if connection_issue_counter == 5: kill_css_process() connection_issue_counter += 1 print('connection_issue_counter: ', connection_issue_counter) bot_connect_ze() elif "clientmessage:" in data: sock_external.sendto(databyte, (udp_external_ip, local_port)) iterator = 3 print('enabled send databyte: ', databyte) elif data.startswith("dist_target:"): bot_process_movement(data) elif data.startswith("surfing:"): bot_process_surf(data) elif data.startswith("keyinput:"): bot_process_keyinput(data) except KeyboardInterrupt: pass finally: sock.close() sock_external.close() #/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; #-condebug #cd /home/gameservers/.steam/debian-installation/ #./steam.sh -applaunch 240 -textmode -textmessagedebug -novid -nosound -noipx -nojoy -noshaderapi #cd /home/gameservers/ze_runner_files #./play.sh #screen -A -d -m -S ze_runner ./play.sh #before steam login: export SDL_VIDEO_X11_VISUALID=0x074 #to find correct SDL_VIDEO_X11_VISUALID use glxinfo in X2GO