kharlashkin 239 #135049 Posted December 19, 2013 from ctypes import * Прошу прощения за "ламерский вопрос", а почему не просто "import ctypes", как в найденном мною скрипте? Share this post Link to post Short link Share on other sites
sirmax 5,499 #135055 Posted December 19, 2013 sirmax, помоги пожалуйста подключить ctypes в танки, если это вообще реально?Практически не реально. Но можно сделать сервис, который дергать из питона, а он уже будет делать реализацию. Share this post Link to post Short link Share on other sites
inj3ct0r 22 #135111 Posted December 20, 2013 Прошу прощения за "ламерский вопрос", а почему не просто "import ctypes", как в найденном мною скрипте? Видимо модуля ctypes нет в сборке клиента WoT. А просто добавить его не получается, потому что он не .pyc а .pyd=dll. Примерно так. Попробуй поискать альтернативный способ подключения геймпада в питоне без использования Xinput.dll и соответственно ctypes. Может существуют другие библиотеки. Share this post Link to post Short link Share on other sites
kharlashkin 239 #135117 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" на соответствие и различия? Буду смотреть сейчас. Share this post Link to post Short link Share on other sites
inj3ct0r 22 #135129 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 Share this post Link to post Short link Share on other sites
sirmax 5,499 #135132 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. Пока этого будет достаточно, а далее уже можно будет думать над красивым решением. Share this post Link to post Short link Share on other sites
kharlashkin 239 #135134 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 Share this post Link to post Short link Share on other sites
sirmax 5,499 #135242 Posted December 20, 2013 Общее направление правильное. Гугли в сторону Python REST. Вешаешь на системном питоне веб сервис с необходимыми методами, для этой задаче самый простой HTTP GET подойдет. Из игрового питона просто дергаешь нужные URL. 1 Share this post Link to post Short link Share on other sites
inj3ct0r 22 #135783 Posted December 21, 2013 (edited) Попробовал создать сервис через Flask. Направление очень интересное. Такой сервис без проблем позволит нам подключить ctypes. Единственный минус - будет висеть окошко системного питона. Далее. Вероятно, если создать такой сервис на игровом питоне, то из системного можно будет выполнять произвольный код на игровом прямо во время игры с выводом лога в системный питон. Такой своего рода shell получится. ps. Сейчас пишу диплом, буду помогать по мере наличия свободного времени. Edited December 21, 2013 by inj3ct0r Share this post Link to post Short link Share on other sites
inj3ct0r 22 #136381 Posted December 22, 2013 Ок. Давай с этой прикрепленной штукой проверим работоспособность. Распакуешь в World_of_Tanks\ далее в архиве все пути созданы. Там есть xml-ка, в ней нужно будет прописать путь к системному питону. Сейчас там стоит c:/python26/python.exe. Если изменить python.exe на pythonw.exe, то окошко системного питона будет скрыто. Сейчас пока должна включаться только примитивная вибрация при выстреле. В GPService.py увидишь свой код с stackoverflow.com - этот файл я не стал компилить. Возможно будут какие-то ошибки или вообще не будет работать - все еще сырое сам понимаешь делал по-быстрому. gp_wot_v01.zip Share this post Link to post Short link Share on other sites
kharlashkin 239 #137205 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 Share this post Link to post Short link Share on other sites
inj3ct0r 22 #137259 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 Share this post Link to post Short link Share on other sites
kharlashkin 239 #137326 Posted December 23, 2013 Да забыл, flask нужно установить сначала. Либо скачай с сайта (ссылка выше) и запусти "python.exe setup.py install", но там по-моему сначала нужно также установить easy-setup. Если не получится, попробуй распаковать себе прикрепленный flask. Подскажи пожалуйста версия Python какая нужна, под 2.7 поставил не отрабатывает, под 2.6 не могу поставить и все. Share this post Link to post Short link Share on other sites
kharlashkin 239 #137593 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 Share this post Link to post Short link Share on other sites
sirmax 5,499 #137625 Posted December 23, 2013 Прикольная задачка просто, не тривиальная. Share this post Link to post Short link Share on other sites
kharlashkin 239 #137634 Posted December 23, 2013 (edited) Прикольная задачка просто, не тривиальная. Интересно, что игра как бы видит вибронакидку (появились её настройки, в настройках WoT), inj3ct0r заметил данный факт. Я пока разбираю все родные эффекты на составляющие (зона/время/сила вибрации), чтобы можно было проверить реальность ощущений и брать данные из родных файлов .uwv.. Edited December 23, 2013 by kharlashkin Share this post Link to post Short link Share on other sites
VicKing 650 #137657 Posted December 23, 2013 умножать на 2 8 раз = умножить на 256 :) Share this post Link to post Short link Share on other sites
kharlashkin 239 #137658 Posted December 23, 2013 = умножить на 256 :) Надо спать идти ;) Всё гораздо прозаичнее - значения вибронакидки делим на 255 и умножаем на 65535 Share this post Link to post Short link Share on other sites
kharlashkin 239 #137749 Posted December 24, 2013 Утро вечера мудренее. Запросил у разработчиков схему режимов работы двухмотороной вибронакидки или же разъяснений каким образом ээффекты делят на два мотора, накидка из первого поста. Для понимания работы вибро в ней - думаю будет правильным отталкиваться от них. Тем более хвастаются, что эффекты писал звукорежиссер специально под девайс. Share this post Link to post Short link Share on other sites
inj3ct0r 22 #137888 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 Share this post Link to post Short link Share on other sites