GTA я не пробовал ботоводить. Я в неё даже не играл
. Поэтому не могу сказать о ней ничего.
Следует понимать, перед съемкой таких роликов идут недели подготовки.
Что бросилось в глаза - в видео автор использует OpenCV для распознавания происходящего на экране. Я из-за рукожопости не смог добиться нормальной скорости обработки изображений и потому везде использовал цвет пикселей в контрольных точках.
Насчет управления - если посмотришь кликеры типа Kibor и Clickerman, то в них есть функции низкоуровневой эмуляции управления, которые работают, эмулируя PS/2 мышь и клавиатуру, для того, чтобы обойти защиту игр(тех, где эмуляция USB блокируется). Кстати, хорошие кликеры, и там и там есть русскоязычное сообщество.
В общем, на мой взгляд, тема ботоводства ОЧЕНЬ интересная и ОЧЕНЬ обширная, тут с ходу не разберешься.
2)атакует мобов, бафается, восстанавливает здоровье, ману, собирает дроп и т.д.
3)распознает количество хп и маны у всех персонажей группы и (в зависимости от роли) или персонажа лечат и восстанавливают ману или персонаж садится отдыхать
4)скрипт писался под Linux+Wine, поэтому иногда работает даже там, где обычные боты на Windows не работают из-за защиты сервера.
5)со стороны сервера общедоступными способами отследить не удалось, так что пока кто-то не настучит - не забанят.
6)в этой версии персонажи не умеют ходить по локации, чтобы научить их ходить пришлось использовать язык С. (OpenCV Python мог бы решить этот вопрос, но я рукожоп
import time
from ctypes import Structure, c_int, py_object, c_bool
from PIL import Image
import subprocess
import gi
gi.require_version('Gdk', '3.0')
from gi.repository import Gdk
F1 = 'F1'
F2 = 'F2'
F3 = 'F3'
F4 = 'F4'
F5 = 'F5'
F6 = 'F6'
F7 = 'F7'
F8 = 'F8'
F9 = 'F9'
F10 = 'F10'
F11 = 'F11'
F12 = 'F12'
full = (181, 0, 24)
full_party_hp = (226, 58, 112)
limit = (231, 32, 33)
full_mob = (148, 0, 0)
dead_mob = (66, 24, 24)
full_mob_hp = (851, 53)
dead_mob_hp = (719, 53)
pers_limit = (135, 68)
pp_hp = (131, 252)
bd_hp = (131, 206)
svs_hp = (131, 344)
se_hp = (131, 298)
warlock_hp = (131, 206)
cat_hp = (131, 206)
full_mp_color = (7, 103, 201)
no_mp_color = (33, 60, 90)
bd_mp = (100, 258)
svs_mp = (100, 350)
she_mp = (110, 304)
windows_list = []
windows_list.append(62914583) #гном
windows_list.append(79691799) #пп
windows_list.append(88080407) #бд
windows_list.append(100663319) #ше
windows_list.append(113246231) #свс
windows_list.append(115343383) #вл
start_time = time.time()
class Point(Structure):
_fields_ = [('x', c_bool), ('y', c_bool), ('z', c_bool), ('w', c_bool), ('a', c_bool), ('b', c_bool), ('c', c_bool)]
def screen():
win = Gdk.get_default_root_window()
height = win.get_height()
width = win.get_width()
screenshot = Gdk.pixbuf_get_from_window(win, 0, 0, width, height)
image = Image.frombuffer(
"RGB", (width, height), screenshot.get_pixels(), 'raw', 'RGB', 0, 1)
return image
def temp(x):
while time.time() <= start_time + 25650:
time.sleep(0.5)
win = Gdk.get_default_root_window()
height = win.get_height()
width = win.get_width()
screenshot = Gdk.pixbuf_get_from_window(win, 0, 0, width, height)
image = Image.frombuffer(
"RGB", (width, height), screenshot.get_pixels(), 'raw', 'RGB', 0, 1
)
for a in x:
if image.getpixel(pers_limit) == full: a.x = True
else: a.x = False
if image.getpixel(dead_mob_hp) == full_mob: a.y = True
else: a.y = False
if image.getpixel(dead_mob_hp) == dead_mob: a.z = True
else: a.z = False
if image.getpixel(pp_hp) == full_party_hp and image.getpixel(bd_hp) == full_party_hp and image.getpixel(svs_hp) == full_party_hp and image.getpixel(se_hp) == full_party_hp and image.getpixel(warlock_hp) == full_party_hp: a.w = True
else: a.w = False
if image.getpixel (bd_mp) == full_mp_color: a.a = True
else: a.a = False
if image.getpixel (she_mp) == full_mp_color: a.b = True
else: a.b = False
if image.getpixel (svs_mp) == full_mp_color: a.c = True
else: a.c = False
print ('program finished')
#~ subprocess.call(['cat', '/home/user/end.txt | zenity --text-info --height=30', '&'])
def pp(x):
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F6])
time.sleep(21)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F5])
time.sleep(25)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F1])
time.sleep(25)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F7])
time.sleep(20)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F8])
time.sleep(25)
current_time = start_time + 115
while time.time() <= start_time + 25150:
if current_time + 1070 < time.time():
print ('buff')
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F6])
time.sleep(21)
if a.x == False:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F3])
time.sleep(2)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F5])
time.sleep(25)
if a.x == False:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F3])
time.sleep(2)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F1])
time.sleep(25)
if a.x == False:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F3])
time.sleep(2)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F7])
time.sleep(20)
if a.x == False:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F3])
time.sleep(2)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F8])
time.sleep(25)
current_time = time.time() - 117
print ('end of buff')
else:
for a in x:
if a.x == False:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F3])
time.sleep(0.6)
if a.w == False and a.x == False:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F2])
time.sleep(0.6)
else:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F4])
time.sleep(1)
print ('pp finished')
def she(x):
time.sleep(110)
current_she_time = start_time + 115
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F5])
time.sleep(4)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F6])
time.sleep(4)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F7])
time.sleep(4)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F4])
time.sleep(4)
while time.time() <= start_time + 25150:
if current_she_time + 1187 < time.time():
print ('buff')
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F5])
time.sleep(4)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F6])
time.sleep(4)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F7])
time.sleep(4)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F4])
time.sleep(4)
print ('end of buff')
current_she_time = time.time() - 11
else:
for a in x:
if a.w == False:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F2])
time.sleep(1.5)
else:
if a.b == True:
if a.a == False: # льем ману бд
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F10])
time.sleep(1)
if a.c == False: # льем ману свсу
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F11])
time.sleep(1)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F3])
time.sleep(0.5)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[3]), F1]) # собираем дроп
time.sleep(1.5)
#~ elif a.w == False:
#~ subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F2])
#~ time.sleep(0.5)
#~ else:
#~ subprocess.call(['xdotool', 'key', '--window', str(windows_list[1]), F4])
#~ time.sleep(1)
print ('she finished')
def bd(x):
time.sleep(115)
current_time = start_time + 115
subprocess.call(['xdotool', 'key', '--window', str(windows_list[2]), F5])
time.sleep(2)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[2]), F6])
time.sleep(2)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[2]), F7])
time.sleep(2)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[2]), F2])
time.sleep(0.5)
while time.time() <= start_time + 25150:
if current_time + 120 < time.time():
print ('dance')
subprocess.call(['xdotool', 'key', '--window', str(windows_list[2]), F5])
time.sleep(2)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[2]), F6])
time.sleep(2)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[2]), F7])
time.sleep(1)
print ('end of dance')
current_time = time.time() - 2
else:
for a in x:
if a.y == True:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[2]), F1])
time.sleep(0.5)
while a.y == True:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[2]), F1])
time.sleep(1.2)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[2]), F2])
else: time.sleep(1.2)
print ('bd finished')
def svs(x):
time.sleep(115)
current_time = start_time + 115
subprocess.call(['xdotool', 'key', '--window', str(windows_list[4]), F5])
time.sleep(1.5)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[4]), F6])
time.sleep(1.5)
while time.time() <= start_time + 25150:
if current_time + 119 < time.time():
print ('song')
subprocess.call(['xdotool', 'key', '--window', str(windows_list[4]), F5])
time.sleep(1.8)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[4]), F6])
time.sleep(1)
print ('end of songs')
current_time = time.time() - 1
else:
for a in x:
if a.y == True:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[4]), F1])
while a.y == True:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[4]), F1])
time.sleep(1.2)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[4]), F2])
else: time.sleep(1.2)
# attack user
print ('svs finished')
def gnom(x):
time.sleep(120)
q = 0
while time.time() <= start_time + 25150:
#~ print (time.time())
subprocess.call(['xdotool', 'key', '--window', str(windows_list[0]), F2])
for a in x:
if a.y == True:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[0]), F4])
while a.y == True:
subprocess.call(['xdotool', 'key', '--window', str(windows_list[0]), F5])
time.sleep(1)
subprocess.call(['xdotool', 'key', '--window', str(windows_list[0]), F6])
time.sleep(0.5)
else:
#~ if q%3 == 0:
#~ subprocess.call(['xdotool', 'key', '--window', str(windows_list[0]), 'w'])
#~ time.sleep(0.5)
#~ subprocess.call(['xdotool', 'key', '--window', str(windows_list[0]), 'd'])
#~ time.sleep(0.5)
#~ else:
#~ subprocess.call(['xdotool', 'key', '--window', str(windows_list[0]), 's'])
#~ time.sleep(0.5)
#~ subprocess.call(['xdotool', 'key', '--window', str(windows_list[0]), 'a'])
#~ time.sleep(1.5)
q += 1
print ('gnom finished')
def third():
z = y-1
def mproc():
from multiprocessing import Process, Value, Array
#~ x = Value(py_object, screen())
x = Array(Point, [(True, True, True, True, True, True, True)])
#~ x.value = (0, 0)
#~ x = 0
p = Process(target=temp, args=(x,))
p.start()
#запускаем цикл, в котором у постоянно изменяется
p1 = Process(target=gnom, args=(x,))
p1.start()
p2 = Process(target=pp, args=(x,))
p2.start()
p3 = Process(target=bd, args=(x,))
p3.start()
p4 = Process(target=she, args=(x,))
p4.start()
p5 = Process(target=svs, args=(x,))
p5.start()
p5.join()
p4.join()
p3.join()
p2.join()
p1.join()
p.join()
#~ first() #создаем переменную у
#~ screen()
mproc()