kharlashkin Posted December 19, 2013 Author Share Posted December 19, 2013 from ctypes import * Прошу прощения за "ламерский вопрос", а почему не просто "import ctypes", как в найденном мною скрипте? Link to comment Short link Share on other sites More sharing options...
sirmax Posted December 19, 2013 Share Posted December 19, 2013 sirmax, помоги пожалуйста подключить ctypes в танки, если это вообще реально?Практически не реально. Но можно сделать сервис, который дергать из питона, а он уже будет делать реализацию. Link to comment Short link Share on other sites More sharing options...
inj3ct0r Posted December 20, 2013 Share Posted December 20, 2013 Прошу прощения за "ламерский вопрос", а почему не просто "import ctypes", как в найденном мною скрипте? Видимо модуля ctypes нет в сборке клиента WoT. А просто добавить его не получается, потому что он не .pyc а .pyd=dll. Примерно так. Попробуй поискать альтернативный способ подключения геймпада в питоне без использования Xinput.dll и соответственно ctypes. Может существуют другие библиотеки. Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted December 20, 2013 Author Share Posted December 20, 2013 Видимо модуля ctypes нет в сборке клиента WoT. А просто добавить его не получается, потому что он не .pyc а .pyd=dll. Примерно так. Попробуй поискать альтернативный способ подключения геймпада в питоне без использования Xinput.dll и соответственно ctypes. Может существуют другие библиотеки. Простое копирование папки "C:\Python26\Lib\ctypes" в папку с игрой не поможет (или поможет)? Может попробовать перебрать файлы в папке "X:\World_of_Tanks\res_bw\scripts\common\lib\ctypes" на соответствие и различия? Буду смотреть сейчас. Link to comment Short link Share on other sites More sharing options...
inj3ct0r Posted December 20, 2013 Share Posted December 20, 2013 (edited) Простое копирование папки "C:\Python26\Lib\ctypes" в папку с игрой не поможет (или поможет)? Может попробовать перебрать файлы в папке "X:\World_of_Tanks\res_bw\scripts\common\lib\ctypes" на соответствие и различия? Буду смотреть сейчас. Простое копирование папки "C:\Python26\Lib\ctypes" в папку с игрой не помогло Может попробовать перебрать файлы в папке "X:\World_of_Tanks\res_bw\scripts\common\lib\ctypes" на соответствие и различия? А что это даст?? Нужно каким то образом подключить _ctypes.pyd который не является py(compiled) а является py(dll) и который игра в упор не видит Edited December 20, 2013 by inj3ct0r Link to comment Short link Share on other sites More sharing options...
sirmax Posted December 20, 2013 Share Posted December 20, 2013 Простое копирование папки "C:\Python26\Lib\ctypes" в папку с игрой не помогло Может попробовать перебрать файлы в папке "X:\World_of_Tanks\res_bw\scripts\common\lib\ctypes" на соответствие и различия? А что это даст?? Нужно каким то образом подключить _ctypes.pyd который не является py(compiled) а является py(dll) и который игра в упор не видит Не тратьте время, не получится все равно. Я раньше писал как можно сделать: "Но можно сделать сервис, который дергать из питона, а он уже будет делать реализацию." Обычный прокси сервис, на том же питоне, или на IIS+WCF. Пока этого будет достаточно, а далее уже можно будет думать над красивым решением. Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted December 20, 2013 Author Share Posted December 20, 2013 (edited) Давайте по порядку, у меня квалификации не хватает чтобы "на лету", подобно Вам, понимать происходящее (sirmax так умеет). 1. Написанный GamePadVibration, использует ресурсы WoT для выполнения скриптов? 2. Если установить дополнительно python нужной версии и отправить выполнение именно скрипта вибрации в него (sirmax наверное об этом говорил), так будет получатся? Не тратьте время, не получится все равно. Я раньше писал как можно сделать: "Но можно сделать сервис, который дергать из питона, а он уже будет делать реализацию." Обычный прокси сервис, на том же питоне, или на IIS+WCF. Пока этого будет достаточно, а далее уже можно будет думать над красивым решением. Чуть опоздал :) Уважаемый sirmax ткните носом пожалуйста на подобную реализацию, не могу ничего нагуглить - не хватает специализации... Мне кажется ответ где-то на поверхности. Прихожу вот к какому выводу - скрипт же отрабатывается в python без проблем. Делаем два скрипта StarVibration.py и StopVibration.py, с соответствующим кодом. Кладем их в папку где надо с игрой, и вместо добавления и компилирования скриптов в GamePadVibration, сделать их вызов. Код в таком случае будет отрабатываться уже не игрой, а установленным в ОС python? (заранее прошу прощения за столь глупые высказывания) Edited December 20, 2013 by kharlashkin Link to comment Short link Share on other sites More sharing options...
sirmax Posted December 20, 2013 Share Posted December 20, 2013 Общее направление правильное. Гугли в сторону Python REST. Вешаешь на системном питоне веб сервис с необходимыми методами, для этой задаче самый простой HTTP GET подойдет. Из игрового питона просто дергаешь нужные URL. 1 @ Link to comment Short link Share on other sites More sharing options...
inj3ct0r Posted December 21, 2013 Share Posted December 21, 2013 (edited) Попробовал создать сервис через Flask. Направление очень интересное. Такой сервис без проблем позволит нам подключить ctypes. Единственный минус - будет висеть окошко системного питона. Далее. Вероятно, если создать такой сервис на игровом питоне, то из системного можно будет выполнять произвольный код на игровом прямо во время игры с выводом лога в системный питон. Такой своего рода shell получится. ps. Сейчас пишу диплом, буду помогать по мере наличия свободного времени. Edited December 21, 2013 by inj3ct0r Link to comment Short link Share on other sites More sharing options...
inj3ct0r Posted December 22, 2013 Share Posted December 22, 2013 Ок. Давай с этой прикрепленной штукой проверим работоспособность. Распакуешь в World_of_Tanks\ далее в архиве все пути созданы. Там есть xml-ка, в ней нужно будет прописать путь к системному питону. Сейчас там стоит c:/python26/python.exe. Если изменить python.exe на pythonw.exe, то окошко системного питона будет скрыто. Сейчас пока должна включаться только примитивная вибрация при выстреле. В GPService.py увидишь свой код с stackoverflow.com - этот файл я не стал компилить. Возможно будут какие-то ошибки или вообще не будет работать - все еще сырое сам понимаешь делал по-быстрому. gp_wot_v01.zip Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted December 23, 2013 Author Share Posted December 23, 2013 (edited) Ок. Давай с этой прикрепленной штукой проверим работоспособность. Распакуешь в World_of_Tanks\ далее в архиве все пути созданы. Там есть xml-ка, в ней нужно будет прописать путь к системному питону. Сейчас там стоит c:/python26/python.exe. Если изменить python.exe на pythonw.exe, то окошко системного питона будет скрыто. Сейчас пока должна включаться только примитивная вибрация при выстреле. В GPService.py увидишь свой код с stackoverflow.com - этот файл я не стал компилить. Возможно будут какие-то ошибки или вообще не будет работать - все еще сырое сам понимаешь делал по-быстрому. 1. Наверное надо все таки скомпилисть GPService.py? Или так должен отрабатывать, потому как у меня окошко python не выскакивает. (чуть позже дочитал, исправлять не стал, скомпилю сейчас) 2. Исправил немного код, поставил нужную dll, добавил номер геймпада, добавил import time. ENABLE_LOG = False d = dict() from flask import Flask from flask import request import ctypes import time # Define necessary structures class XINPUT_VIBRATION(ctypes.Structure): _fields_ = [("wLeftMotorSpeed", ctypes.c_ushort), ("wRightMotorSpeed", ctypes.c_ushort)] xinput = ctypes.windll.xinput1_3 # Load Xinput.dll # Set up function argument types and return type XInputSetState = xinput.XInputSetState XInputSetState.argtypes = [ctypes.c_uint, ctypes.POINTER(XINPUT_VIBRATION)] XInputSetState.restype = ctypes.c_uint # You can also create a helper function like this: def set_vibration(left_motor, right_motor, controller = 0): vibration = XINPUT_VIBRATION(int(left_motor * 65535), int(right_motor * 65535)) XInputSetState(controller, ctypes.byref(vibration)) if not ENABLE_LOG: import logging log = logging.getLogger('werkzeug') log.setLevel(logging.ERROR) app = Flask(__name__) @app.route('/connect') def connect(): print 'Connection checked - Ok.' return 'True' @app.route('/loadEffectFromFile') def loadEffectFromFile(): effectHandle = request.args.get('effectHandle') fileName = request.args.get('fileName') #print #print 'loadEffectFromFile' #print 'effectHandle =', request.args.get('effectHandle') #print 'fileName =', request.args.get('fileName') if not effectHandle in d: d[effectHandle] = fileName return '' @app.route('/getEffectLength') def getEffectLength(): #print #print 'getEffectLength' #print 'effectHandle =', request.args.get('effectHandle') #print 'returnedLength =', request.args.get('returnedLength') return '' import threading, time def shot(): set_vibration(0, 250/250.0, 250/500.0) time.sleep(0.15) set_vibration(0, 20/250.0, 20/500.0) time.sleep(0.80) set_vibration(0, 0.0, 0.0) @app.route('/startEffect') def startEffect(): handle = request.args.get('handle') count = request.args.get('count') if handle in d: print 'startEffect: '+ d[handle] if 'shot_main' in d[handle] or 'shot_large' in d[handle] or 'shot_medium' in d[handle] or 'shot_small' in d[handle]: print 'shot' # init thread t1 = threading.Thread(target=shot) # start threads t1.start() # print # print 'startEffect' # print 'handle =', handle # print 'count =', count return '' if __name__ == "__main__": app.debug = True app.run() 3. При попытке запустить скрипт - выдает сообщение про отсутствие Flask, наверное надо его куда-то положить? Traceback (most recent call last): File "D:\Games\World_of_Tanks\res_mods\0.8.10\scripts\client\gui\mods\gpvibromanager\GPService.py", line 3, in <module> from flask import Flask ImportError: No module named flask Вроде получилось установить Flask, по крайней появилась "C:\Python27\Scripts\flask\". В ней лежит свой python, может в xml надо указать путь к нему? Не отрабатывает мод. Не выскакивает окошко системного питона и все. Edited December 23, 2013 by kharlashkin Link to comment Short link Share on other sites More sharing options...
inj3ct0r Posted December 23, 2013 Share Posted December 23, 2013 Да забыл, flask нужно установить сначала. Либо скачай с сайта (ссылка выше) и запусти "python.exe setup.py install", но там по-моему сначала нужно также установить easy-setup. Если не получится, попробуй распаковать себе прикрепленный flask. set_vibration - Здесь все было правильно. Потому что код я немного подправил. def set_vibration(left_motor, right_motor, controller = 0): Т.е. для вызова достаточно указать (левый, правый). Если третий параметр (контроллер) не указан при вызове, он принимает значение по умолчанию (0). А у тебя в коде сейчас левый всегда 0, а контроллер - число с плавающей точкой. Что dll исправил хорошо. Всегда в первую очередь смотри что пишется в python.log Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted December 23, 2013 Author Share Posted December 23, 2013 Да забыл, flask нужно установить сначала. Либо скачай с сайта (ссылка выше) и запусти "python.exe setup.py install", но там по-моему сначала нужно также установить easy-setup. Если не получится, попробуй распаковать себе прикрепленный flask. Подскажи пожалуйста версия Python какая нужна, под 2.7 поставил не отрабатывает, под 2.6 не могу поставить и все. Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted December 23, 2013 Author Share Posted December 23, 2013 (edited) Итак, наверное стоит по щагово описать процесс инсталляции тестовых вибраций для геймпада. 1. Необходимо установить Python (я ставил последнюю версию), папка пусть будет по-умолчанию "C:\Python27". 2. Необходимо установить Flask, я делал по этой инструкции. Качаем файл distribute_setup.py в папку "C:\temp" (например), запускаем консоль "Win+R" - cmd и выполняем команду "C:\Python27\python.exe C:\temp\distribute_setup.py" наблюдаем процесс загрузки нужных файлов в папку "C:\Python27\Scripts", далее в консоли запускаем команды по очереди и наблюдаем их выполнение: C:\Python27\python.exe C:\Python27\Scripts\easy_install-2.7-script.py Flask C:\Python27\python.exe C:\Python27\Scripts\easy_install-2.7-script.py Jinja2C:\Python27\python.exe C:\Python27\Scripts\easy_install-2.7-script.py WerkzeugC:\Python27\python.exe C:\Python27\Scripts\easy_install-2.7-script.py Virtualenv 3. Распаковываем архив из вложения в папку с игрой "X:\Games\World_of_Tanks" (запаковал из своей игры). После запуска Игры появляется окошко консоли Python, которая будет говорить нам о правильности запуска. В самое игре при выстреле будет работать вибрация на Xinput геймпадах следующим образом - 0,25 сек правый двигатель на максимум, левый на 50%, 0,3 сек правый двигатель на 8%, левый на 4%. P.S. Хочу выразить огромнейшую благодарность уважаемым sirmax и особенно inj3ct0r, без них не было бы даже этой начальной бета-версии. res_mods.7z Edited December 23, 2013 by kharlashkin 2 @ Link to comment Short link Share on other sites More sharing options...
sirmax Posted December 23, 2013 Share Posted December 23, 2013 Прикольная задачка просто, не тривиальная. Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted December 23, 2013 Author Share Posted December 23, 2013 (edited) Прикольная задачка просто, не тривиальная. Интересно, что игра как бы видит вибронакидку (появились её настройки, в настройках WoT), inj3ct0r заметил данный факт. Я пока разбираю все родные эффекты на составляющие (зона/время/сила вибрации), чтобы можно было проверить реальность ощущений и брать данные из родных файлов .uwv.. Edited December 23, 2013 by kharlashkin Link to comment Short link Share on other sites More sharing options...
VicKing Posted December 23, 2013 Share Posted December 23, 2013 умножать на 2 8 раз = умножить на 256 :) Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted December 23, 2013 Author Share Posted December 23, 2013 = умножить на 256 :) Надо спать идти ;) Всё гораздо прозаичнее - значения вибронакидки делим на 255 и умножаем на 65535 Link to comment Short link Share on other sites More sharing options...
kharlashkin Posted December 24, 2013 Author Share Posted December 24, 2013 Утро вечера мудренее. Запросил у разработчиков схему режимов работы двухмотороной вибронакидки или же разъяснений каким образом ээффекты делят на два мотора, накидка из первого поста. Для понимания работы вибро в ней - думаю будет правильным отталкиваться от них. Тем более хвастаются, что эффекты писал звукорежиссер специально под девайс. Link to comment Short link Share on other sites More sharing options...
inj3ct0r Posted December 24, 2013 Share Posted December 24, 2013 (edited) Я себе представляю так. Выбираем коэффициенты передачи в левый и правый мотор для каждой из 6 зон накидки и производим нормировку в соответствии с этими коэффициентами. Например можно выбрать такие (в квадратных скобках указаны коэффициенты передачи в левый и правый моторы соответственно) K_SIT_LEFT = [0.333, 0.000] K_SIT_RIGHT = [0.333, 0.000] K_BACK_LOW_LEFT = [0.167, 0.167] K_BACK_LOW_RIGHT = [0.167, 0.167] K_BACK_MID_LEFT = [0.000, 0.333] K_BACK_MID_RIGHT = [0.000, 0.333] И затем, для этих коэффициентов в процессе тестов подобрать наиболее оптимальные значения Edited December 24, 2013 by inj3ct0r Link to comment Short link Share on other sites More sharing options...
Recommended Posts