Уведомления

Группа в Telegram: @pythonsu

#1 Март 11, 2018 14:11:29

EgorSrche
Зарегистрирован: 2018-03-10
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание создание плагинов для игр на языке Python

Здравствуйте всем. Прошу вас дать мне подсказку не намек, как решить данную проблему? в Гугле к сожалению я ничего не знаю об этом. Сам недавно начал изучать питон, конечно, по книгам я ещё новичок и многого ещё не понимаю, но все приходит с опытом. В Resident Evil 4: Ultimate HD Edition 2014 года, нельзя поворачивать главным героем с помощью мыши, приходится нажимать на клавишу а. Что Сами понимаете не очень удобно. Решил написать скрипт по нажатию клавиши А, мыши двигается налево.
На рабочем столе это прекрасно работает А вот в игре к сожалению, нет может есть какая-то функция, которая анализирует движения мыши в игре.
Вот сам скрипт. Помогите мне пожалуйста очень вас прошу об этом.
import keyboard
import win32api
import win32con
from pynput.keyboard import Key, Controller
from pynput import keyboard
from ctypes import windll, Structure, c_ulong, byref, c_ushort
import time
sel = 10 # чувствительности мыши
VK_LBUTTON = 0x01 # Left mouse button
VK_RBUTTON = 0x02 # Right mouse button
A = 0x41
D = 0x44
a = 0
class POINT(Structure):
_fields_ =
def queryMousePosition(): # функция коор мыши
pt = POINT()
windll.user32.GetCursorPos(byref(pt))
return


while a <= 1:
pos = queryMousePosition()
x = pos
y = pos
pos = queryMousePosition()
x1 = pos
y1 = pos
x2 = x1 - x
y2 = y1 - y
if x2 > sel: #d
win32api.keybd_event(D, 0, win32con.KEYEVENTF_EXTENDEDKEY, 0)
if -sel > x2:
win32api.keybd_event(A, 0, win32con.KEYEVENTF_EXTENDEDKEY, 0)

Офлайн

#2 Март 12, 2018 14:32:20

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Создание создание плагинов для игр на языке Python

многие игры для более быстрой реакции на действия пользователей используют DirectInput, для захвата и обработки клавиатуры-мыши а не winAPI. ИМХО, копайте в ту сторону.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Март 12, 2018 14:47:17

EgorSrche
Зарегистрирован: 2018-03-10
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание создание плагинов для игр на языке Python

Здравствуйте уважаемый PEHDOM. Очень рад вашему сообщению. Спасибо вам большое, что нашли время мне ответить.
Ваша подсказка мне очень поможет, действительно DirectInput, используют, например, для настройки джойстика (геймпада). Буду капать в эту сторону ох нелегко начинать, что-то новое, но нужно. Может подобные темы уже возникали на форуме.

Офлайн

#4 Март 13, 2018 02:41:47

ampermetr
Зарегистрирован: 2016-01-27
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Создание создание плагинов для игр на языке Python

Во многих играх, особенно онлайн, блокируются подобные вызовы, типа защита от ботов. Так что лучше сначала потренироваться на кошках.

Офлайн

#5 Март 13, 2018 13:13:55

EgorSrche
Зарегистрирован: 2018-03-10
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание создание плагинов для игр на языке Python

Здравствуйте уважаемый ampermetr. Спасибо большое за ваше интересное мнение. Нашёл в интернете интересное видео, в котором парень внедряет свои функции в GTA 5 через питон. Конечно в силу своей неопытности, мало что понял. Но задумка очень и очень интересная перспективная, Вот ссылка на видео https://www.youtube.com/watch?v=tWqbl9IUdCg&index=1&list=LLoMJG4FS5PyRfLkcAZRQSXA&t=614s

Офлайн

#6 Март 13, 2018 17:40:31

ampermetr
Зарегистрирован: 2016-01-27
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Создание создание плагинов для игр на языке Python

EgorSrche
GTA я не пробовал ботоводить. Я в неё даже не играл . Поэтому не могу сказать о ней ничего.
Следует понимать, перед съемкой таких роликов идут недели подготовки.
Что бросилось в глаза - в видео автор использует OpenCV для распознавания происходящего на экране. Я из-за рукожопости не смог добиться нормальной скорости обработки изображений и потому везде использовал цвет пикселей в контрольных точках.
Насчет управления - если посмотришь кликеры типа Kibor и Clickerman, то в них есть функции низкоуровневой эмуляции управления, которые работают, эмулируя PS/2 мышь и клавиатуру, для того, чтобы обойти защиту игр(тех, где эмуляция USB блокируется). Кстати, хорошие кликеры, и там и там есть русскоязычное сообщество.

В общем, на мой взгляд, тема ботоводства ОЧЕНЬ интересная и ОЧЕНЬ обширная, тут с ходу не разберешься.

Один из моих кликеров:
Если играл в Lineage2, то думаю поймешь о чем речь в скрипте(если не играл, то
1)скрипт управляет пятью персонажами на одном сервере в одной группе
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()

Офлайн

#7 Март 14, 2018 11:21:33

EgorSrche
Зарегистрирован: 2018-03-10
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание создание плагинов для игр на языке Python

Здравствуйте уважаемый ampermetr. Спасибо большое за ваш ответ. удивительно вы первый человек который не играл в gta 5. Да в этом видео была произведена тщательная подготовка. Хотя автор выложил весь код выложил в ссылке в описании данного видео. Чтобы обрабатывать изображения с высокой скоростью нужен мощный компьютер также хорошие знания языка питон. насчёт кликеров. Тема очень интересная но сожалению, пока нету свободного времени на ее глубокое изучение. Вы написали классный кликер, чувствуется ваш богатый опыт в языке python. Ещё раз благодарю вас за уделенное мне время. У вас классная атмосфера на форуме.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version