Jump to content
Korean Random

kharlashkin

User
  • Posts

    829
  • Joined

  • Last visited

  • Days Won

    7

Posts posted by kharlashkin

  1. Большое спасибо Sirmax за помощь поэтому $30 хочу передать ему - скажи куда.

     

    Доброй ты души человек ;)

     

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

    • Upvote 4
  2. Прошу прощение за задержку, рождественские праздники, знаете ли...

     

    Итак, протестировав обновленный мод, могу сказать, что уважаемый inj3ct0r потрудился на славу:

    1. Виброэффекты действительно работают как родные (не зря разрабы хвалились, что эффекты делал звукорежиссер).

    2. Мной не замечено никаких абсолютно задержек, все вовремя.

    3. Есть смешивание эффектов.

    4. Ползунки в настройках игры работают (можно уменьшить/добавить/отключить).

     

    Как будет свободное время буду пробовать изменять коэффициенты в xml файле.

     

    Огромное спасибо всем, кто участвовал (словом, советом, делом) в написании этого мода!

     

    P.S. Разумеется inj3ct0r получил подарок "под ёлочку" (чтобы меня не обвинили в недобросовестности).

  3. Доброе время суток. Распаковал скрипт в нужную папку, указал путь к системному питону, указал нужную dll (xinput1_3) и сразу промах - при запуске игры не появляется окошко python, соответственно дальше ничего не работает. Пробовал с учетом регистра указать путь - ничего не получилось.

     

    Расковырял код, копаюсь...

  4. Выкладываю обновленный вариант эффектов. Добавил виброэффекты повреждений (гусля, пожар, контузия и прочее), сделал скрытый режим запуска скриптов.

     

    Что пока не работает - нет смешивания эффектов (при пожаре и затем попадании, пожар перестает вибрировать); наблюдаю немного запаздывания (около 0,5 секунды) не всегда, но есть. Но в общем скрипт работает и получается более полное погружение в игровой процесс.

     

    Наверное попробую сегодня/завтра скомпилировать файл GPService.py в GPService.pyc, в связи с этим должно немного повыситься быстродействие скрипта. что должно ускорить срабатывание вибраций.

    res_mods.7z

  5. Ок скрипт для тестов готов нужно проверять

     

    Скрипт отрабатывает, выдает "Exit" и всё, наверное надо стопорить скрипт для ожидания ввода команды с клавиатуры.

     

    Или надо как-то необычно его запускать?

    Выкладываю на тестирование "модифицированный вариант", первоначального скрипта на python, куда добавил разные эффекты при выстреле и повреждения. Распаковать в папку "Х:\Games\World_of_Tanks", путь к системному python прописан как "C:\Python27\python.exe".

     

    Код скрипта GPService.py:

    ENABLE_LOG = False
    d = dict()
    from flask import Flask
    from flask import request
    import ctypes
    
    # 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(controller, left_motor, right_motor):
        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_main():
        set_vibration(0, 1.0, 1.0)
        time.sleep(0.15)
        set_vibration(0, 0, 0)
        time.sleep(0.25)
        set_vibration(0, 0.5, 0)
        time.sleep(0.25)
        set_vibration(0, 0.0, 0.0)
    
    def shot_large():
        set_vibration(0, 0.5, 0.6)
        time.sleep(0.1)
        set_vibration(0, 0.3, 0)
        time.sleep(0.1)
        set_vibration(0, 0.1, 0)
        time.sleep(0.1)
        set_vibration(0, 0, 0)
        time.sleep(0.1)
        set_vibration(0, 0, 0.5)
        time.sleep(0.1)
        set_vibration(0, 0.0, 0.0)    
    
    def shot_medium():
        set_vibration(0, 0, 0)
        time.sleep(0.1)
        set_vibration(0, 0.6, 0.6)
        time.sleep(0.1)
        set_vibration(0, 0.4, 0)
        time.sleep(0.1)
        set_vibration(0, 0.2, 0)
        time.sleep(0.1)
        set_vibration(0, 0, 0.6)
        time.sleep(0.2)
        set_vibration(0, 0.0, 0.0)
    
    def shot_small():
        set_vibration(0, 0.6, 0.8)
        time.sleep(0.1)
        set_vibration(0, 0, 0.4)
        time.sleep(0.1)
        set_vibration(0, 0.0, 0.0)
    
    def hit_nonpenetration():
        set_vibration(0, 0.5, 0.5)
        time.sleep(0.1)
        set_vibration(0, 0.0, 0.0)
    
    def hit_ricochet():
        set_vibration(0, 0.8, 0.8)
        time.sleep(0.1)
        set_vibration(0, 0, 0)
        time.sleep(0.2)
        set_vibration(0, 0.0, 0.5)
        time.sleep(0.05)
        set_vibration(0, 0, 0)
    
    def hit_splash():
        set_vibration(0, 0.8, 0)
        time.sleep(0.1)
        set_vibration(0, 0.4, 0.8)
        time.sleep(0.1)
        set_vibration(0, 0, 0.4)
        time.sleep(0.1)
        set_vibration(0, 0, 0)
        time.sleep(0.05)
        set_vibration(0, 0, 0.4)
        time.sleep(0.15)
        set_vibration(0, 0, 0)
    
    def hit():
        set_vibration(0, 1, 0)
        time.sleep(0.1)
        set_vibration(0, 0, 0)
        time.sleep(0.05)
        set_vibration(0, 0, 1)
        time.sleep(0.1)
        set_vibration(0, 0, 0)
        time.sleep(0.05)
        set_vibration(0, 0.6, 0.6)
        time.sleep(0.1)
        set_vibration(0, 0.5, 0.5)
        time.sleep(0.05)
        set_vibration(0, 0.25, 0.25)
        time.sleep(0.05)
        set_vibration(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]:
                print 'shot_main'
                # init thread
                t1 = threading.Thread(target=shot_main)
                # start threads
                t1.start()
                           
            if 'shot_large' in d[handle]:
                print 'shot_large'
                # init thread
                t1 = threading.Thread(target=shot_large)
                # start threads
                t1.start()
                 
            if 'shot_medium' in d[handle]:
                print 'shot_medium'
                # init thread
                t1 = threading.Thread(target=shot_medium)
                # start threads
                t1.start()
                
            if 'shot_small' in d[handle]:    
                print 'shot_small'
                # init thread
                t1 = threading.Thread(target=shot_small)
                # start threads
                t1.start()
                
            if 'hit_nonpenetration' in d[handle]:    
                print 'hit_nonpenetration'
                # init thread
                t1 = threading.Thread(target=hit_nonpenetration)
                # start threads
                t1.start()
                
            if 'hit_ricochet' in d[handle]:    
                print 'hit_ricochet'
                # init thread
                t1 = threading.Thread(target=hit_ricochet)
                # start threads
                t1.start()
                
            if 'hit_splash' in d[handle]:    
                print 'hit_splash'
                # init thread
                t1 = threading.Thread(target=hit_splash)
                # start threads
                t1.start()
                
            if 'hit' in d[handle]:    
                print 'hit'
                # init thread
                t1 = threading.Thread(target=hit)
                # start threads
                t1.start()
                            
        # print 
        # print 'startEffect'
        # print 'handle =', handle
        # print 'count =', count
        
        return ''
    
    if __name__ == "__main__":
        app.debug = True
        app.run()
     

     

    P.S. Эффекты надо бы ещё доработать, но играть так стало намного интереснее ;)

    res_mods.7z

  6. Я себе представляю так. Выбираем коэффициенты передачи в левый и правый мотор для каждой из 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] 

    И затем, для этих коэффициентов в процессе тестов подобрать наиболее оптимальные значения

     

    Да, согласен. Надо будет так же добавить вот это:

    K_LEFT = 0xE00 // Левая сторона накидки
    
    K_RIGHT = 0x00E // Правая сторона накидки
    
    K_SIT = 0x202 // Сиденье
    
    K_BACK_LOW = 0x404 // Низ спины
    
    K_BACK_MID = 0x808 // Середина спины
    
    K_ALL_ZONES = 0xE0E // Все зоны 

    Но вот ещё момент, разбирая эффекты обнаружил две незадокументированные зоны - zones="C" и zones="C00", которые крутят Спина справа/Спина слева (оба двигателя).

  7. Утро вечера мудренее. Запросил у разработчиков схему режимов работы двухмотороной вибронакидки или же разъяснений каким образом ээффекты делят на два мотора, накидка из первого поста.

     

    Для понимания работы вибро в ней - думаю будет правильным отталкиваться от них. Тем более хвастаются, что эффекты писал звукорежиссер специально под девайс.

  8. Прикольная задачка просто, не тривиальная.

    Интересно, что игра как бы видит вибронакидку (появились её настройки, в настройках WoT), inj3ct0r заметил данный факт. Я пока разбираю все родные эффекты на составляющие (зона/время/сила вибрации), чтобы можно было проверить реальность ощущений и брать данные из родных файлов .uwv..

  9. Итак, наверное стоит по щагово описать процесс инсталляции тестовых вибраций для геймпада.

     

    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 Jinja2
    C:\Python27\python.exe C:\Python27\Scripts\easy_install-2.7-script.py Werkzeug
    C:\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

    • Upvote 2
  10.  

     

    Да забыл, flask нужно установить сначала. Либо скачай с сайта (ссылка выше) и запусти "python.exe setup.py install", но там по-моему сначала нужно также установить easy-setup. Если не получится, попробуй распаковать себе прикрепленный flask. 

    Подскажи пожалуйста версия Python какая нужна, под 2.7 поставил не отрабатывает, под 2.6 не могу поставить и все. 

  11. Ок. Давай с этой прикрепленной штукой проверим работоспособность. Распакуешь в 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 надо указать путь к нему?

     

    Не отрабатывает мод. Не выскакивает окошко системного питона и все.

  12. Давайте по порядку, у меня квалификации не хватает чтобы "на лету", подобно Вам, понимать происходящее (sirmax так умеет).

     

    1. Написанный GamePadVibration, использует ресурсы WoT для выполнения скриптов?

    2. Если установить дополнительно python нужной версии и отправить выполнение именно скрипта вибрации в него (sirmax наверное об этом говорил), так будет получатся?


    Не тратьте время, не получится все равно.

    Я раньше писал как можно сделать: "Но можно сделать сервис, который дергать из питона, а он уже будет делать реализацию."

    Обычный прокси сервис, на том же питоне, или на IIS+WCF. Пока этого будет достаточно, а далее уже можно будет думать над красивым решением.

     

    Чуть опоздал :)

     

    Уважаемый sirmax ткните носом пожалуйста на подобную реализацию, не могу ничего нагуглить - не хватает специализации...


    Мне кажется ответ где-то на поверхности. Прихожу вот к какому выводу - скрипт же отрабатывается в python без проблем. Делаем два скрипта StarVibration.py и StopVibration.py, с соответствующим кодом. Кладем их в папку где надо с игрой, и вместо добавления и компилирования скриптов в GamePadVibration, сделать их вызов. Код в таком случае будет отрабатываться уже не игрой, а установленным в ОС python?

     

    (заранее прошу прощения за столь глупые высказывания)

  13.  

     

    Видимо модуля ctypes нет в сборке клиента WoT. А просто добавить его не получается, потому что он не .pyc а .pyd=dll. Примерно так. Попробуй поискать альтернативный способ подключения геймпада в питоне без использования Xinput.dll и соответственно ctypes. Может существуют другие библиотеки.
     

     

    Простое копирование папки "C:\Python26\Lib\ctypes" в папку с игрой не поможет (или поможет)?

     

    Может попробовать перебрать файлы в папке "X:\World_of_Tanks\res_bw\scripts\common\lib\ctypes" на соответствие и различия? Буду смотреть сейчас.

  14.  

     

    Согласен по-разному. Т.е. нужно задействовать таймер (я не знаю пока как). И еще определится как 6 движков (или сколько там) переделать под 2.

    Вот здесь есть информация, что движки в геймпаде разные (Note that the right motor is the high-frequency motor, the left motor is the low-frequency motor. They do not always need to be set to the same amount, as they provide different effects.), соответственно просто по разному их раскручивая - получаем разные эффекты.

    'Цитата из SDK вибронакидки'

    Принимается, что число моторов в общем случае равно шести, и соответственно их расположению, шесть зон накидки определяются следующим образом:

    1) Сиденье – слева

    2) Сиденье – справа

    3) Низ спины – слева

    4) Низ спины – справа

    5) Середина спины – слева

    6) Середина спины – справа

     

    Сколько игр прошел на геймпаде (Halo, Portal, AC, Batman и др.) никто никогда не заморачивался так, как Варгейминг, все используют это для лучшей передачи игровой атмосферы, а не для массирования ягодиц :)

  15.  

     

    В этих логах танк стоит. Но постоянно выполняетсяVibrationObject.stopEffect. Хотя этот эффект и так остановлен. Думаю это их косяк.

    "Это не бага - это фича" - разрабы возможно, делают эти эффекты постоянно работающими, но постоянно их тормозят. Если танк двинется (например на медленном ходу) то нужный эффект перестают тормозить.

  16. Немного не так.

    В этих логах танк стоит. Но постоянно выполняетсяVibrationObject.stopEffect. Хотя этот эффект и так остановлен. Думаю это их косяк.

    На самом деле эффект включается при startEffect(номер эффекта в памяти), и выключается при stopEffect(номер эффекта в памяти). Все остальное время не нужно ничего делать. Я наверное попробую написать скрипт для включения жужжалки при выстреле для проверки. А дальше подумаем что делать. Мне не нравится что при выстреле эффект длится 800мс - думаю это довольно долго, если интенсивность жужжалки не будет изменятся за это время (как ее менять в это время я пока не представляю). Но для проверки пойдет.

     

    Ну вот что в файле виброэффектов:

      <vibration_1 comment="" zones="404" looped="false">
        <vpoint_1 time="10" amplitude="0" time_relative="false"/>
        <vpoint_2 time="10" amplitude="140" time_relative="true"/>
        <vpoint_3 time="70" amplitude="140" time_relative="true"/>
        <vpoint_4 time="70" amplitude="0" time_relative="true"/>
        <vpoint_5 time="150" amplitude="0" time_relative="false"/>
      </vibration_1>
      <vibration_2 comment="" zones="808" looped="false">
        <vpoint_1 time="200" amplitude="120" time_relative="false"/>
        <vpoint_2 time="280" amplitude="120" time_relative="true"/>
        <vpoint_3 time="280" amplitude="0" time_relative="true"/>
      </vibration_2>
      <vibration_3 comment="" zones="202" looped="false">
        <vpoint_1 time="10" amplitude="140" time_relative="false"/>
        <vpoint_2 time="210" amplitude="0" time_relative="true"/>
        <vpoint_3 time="220" amplitude="0" time_relative="true"/>
      </vibration_3>
    

     

    Соответственно вибронакидка по разному вибрирует все эти 0,8 секунды. Низ спины (vibration_1) - 80 мс, середина спины - (vibration_2) - 480 мс и все сиденье всего 10 мс (ну или как то так, мне непонятен последний параметр).

  17. У-ух... Пока лог дочитал - вечность прошла))) Должен признать, что поражен!!!

     

    1. В коде всего две переменные - цифра (0-65535) оборотов для левого двигатели и правого. Может проще файлы .uwv переписать - чтобы оттуда считывать эти переменные?

    2. Могу попробовать запустить два разных экземпляра скрипта запуска вибрации на геймпаде (для проверки), если ничего страшного не произойдет то "забить".

    3. ...

     

    Мне вот что кажется - идея с постоянно жжужащим геймпадом не совсем наверное правильная, для вибронакидки может и гуд, а вот для девайса с которого играешь нет. По логам видно что постоянно работает вибрация от "танкового двигателя" (малые обороты/средние, движение вперед/назад). С целью создания самодельной вибронакидки - это понадобится, а на геймпаде нужна возможность не запускать вибро при движении.

  18. Доброе время суток! Я смотрю - дела идут как то у Вас ;)

     

    Показывал код программисту знакомому (жаль что к python не имеет никакого отношения). Просмотрев всё, показал мне вот что - очень много эффектов вызываются через OnceController. Можно вместо неё попробовать вызывать вот тот код который умеет "жжужать джойстиком" (дословно). Всё остальное (которое не относися к этой функции) попробовать вырезать из кода, запаковать обратно в .pyc и попробовать так запустить - мне кажется что в этом рациональное звено есть.

     

    Учитывая, что кодить на Вашем уровне я не могу - буду пробовать, а что - интересно :)

  19. Эти строки есть вVibroManager.pyc, worldowftanks.exe иuwApi.dll. Думаю чтоworldowftanks.exe эти функции импортирует из uwApi.dll и создает класс vibrationObject с этими методами. А из VibroManager.pyc эти методы вызываются, или примерно так.

    Наконец-то дельное объяснение работы этого всего "хозяйства".

     

     

    Но без исходника uwApi все равно ничего не выйдет.

    Так вот же исходники. Но думаю что полностью переписывать .dll нет необходимости. Надо только показать игре, что накидка подключена, VibroManager.pyc уже будет сам отрабатывать скрипты прямо на геймпад, когда BigWorld будет их вызывать для накидки. Может просто попробовать вырезать проверку подключения вибронакидки в VibroManager.pyc?

     

     

    Но тут есть проблема как я говорил с time.sleep()

    Ну это единственный аналог, для переписки подобного:

    <uberwoorf_vibro_effect>
     <vibration_1 comment="" zones="2" looped="false">
     <vpoint_1 time="0" amplitude="0" time_relative="false"/>
     <vpoint_2 time="7200" amplitude="0" time_relative="false"/>
     </vibration_1>
     <vibration_2 comment="" zones="2" looped="true">
     <vpoint_1 time="0" amplitude="0" time_relative="false"/>
     <vpoint_2 time="80" amplitude="0" time_relative="true"/>
     <vpoint_3 time="80" amplitude="30" time_relative="true"/>
     <vpoint_4 time="140" amplitude="30" time_relative="true"/>
     <vpoint_5 time="140" amplitude="0" time_relative="true"/>
     <vpoint_6 time="180" amplitude="0" time_relative="true"/>
     </vibration_2>
     <vibration_3 comment="" zones="200" looped="true">
     <vpoint_1 time="0" amplitude="30" time_relative="false"/>
     <vpoint_2 time="60" amplitude="30" time_relative="true"/>
     <vpoint_3 time="60" amplitude="0" time_relative="true"/>
     <vpoint_4 time="180" amplitude="0" time_relative="true"/>
     </vibration_3>
     <vibration_4 comment="" zones="404" looped="true">
     <vpoint_1 time="0" amplitude="10" time_relative="false"/>
     <vpoint_2 time="60" amplitude="10" time_relative="false"/>
     <vpoint_3 time="60" amplitude="0" time_relative="true"/>
     <vpoint_4 time="360" amplitude="0" time_relative="false"/>
     </vibration_4>
     <sound path="Tiger_idle_02.wav"/>
    </uberwoorf_vibro_effect>

     

     

    Что думаешь делать дальше?

    Продолжаю читать Лутца :)

  20. В файле uwApi.dll.

    Но без исходника ничего не выйдет. Думаю надо рыть в другом направлении. Будет ли работать этот твой скрипт

    'скрипт'

    import ctypes

    import time

     

    # Define necessary structures

    class XINPUT_VIBRATION(ctypes.Structure):

    _fields_ = [("vibration.wLeftMotorSpeed", ctypes.c_ushort),

    ("vibration.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(controller, left_motor, right_motor):

    vibration = XINPUT_VIBRATION(int(left_motor * 65535), int(right_motor * 65535))

    XInputSetState(controller, ctypes.byref(vibration))

     

    # ... and use it like so

    set_vibration(0, 0.5, 1.0)

    time.sleep(0.3)

    set_vibration(0, 0, 0)

    во время работы эмулятора для геймпада. Проверь

     

    Если имеется ввиду работа xpadder, то да. Геймпад подключен к ПК, в xpadder настроен перехват геймпада, в IDLE запускаю скрипт - он отрабатывает нормально. При этом жмакаю на кнопки и прочее - xpadder перехватывает нажатия и эмулирует мышу/клаву.

  21.  

    Я согласен, среди экспорт функций их нет. Но зачем тогда в этом файле такие строки:

    UwGetStatus - connected
    UwGetStatus - NOT connected
    uwSetGain
    uwCreateEffect
    uwLoadEffectFromFile
    uwSetEffectGain

     

    Это уже непосредственно API вибронакидки.

  22. Не совсем так... Вот тут есть о создании proxy.dll. исследовав библиотеку uwApi.dll на предмет экспортируемых функций с помощью утилиты dumpbin у меня получилось:

     

    Dump of file c:\temp\uwApi.dll
    
    File Type: DLL
    
    Section contains the following exports for uwApi.dll
    
    00000000 characteristics
    4DDBD659 time date stamp Tue May 24 19:01:29 2011
    0.00 version
    1 ordinal base
    4 number of functions
    4 number of names
    
    ordinal hint RVA name
    
    1 0 000011D0 DllCanUnloadNow
    2 1 00001320 DllGetClassObject
    3 2 000011F0 DllRegisterServer
    4 3 00001200 DllUnregisterServer
    
    Summary
    
    4000 .data
    9000 .rdata
    3000 .reloc
    1000 .rsrc
    25000 .text
    

    То есть в библиотеке используется всего 4 функции и они никак не связаны с скриптами в игре. Я думаю что они просто сообщают игре о подключенной вибронакидке. Попробовав подменить 2-ю функцию может удастся обмануть WoT и запускать скрипты без наличия вибронакидки в системе.


     

     

    Эта библиотека от gametrix. Есть ли ее исходник? Обычно производители выкладывают только заголовочные файлы.

     

    Есть SDK полный на вибронакидку - ссылка выше. В архиве очень много всего (включая сырцы на С++ для тестовых программ отладчиков).


     

     

    Так твой скрипт будет работать не только в этой версии игры, но и в последующих. В твоем скрипте мне не нравится функция time.sleep() думаю надо как-то по-другому.

     

    Это понятно. надо сделать "файл.pyc" и просто класть его в нужную папку с игрой.

    time.sleep() - Ничего более подходящего не нашел, если есть мысли - буду рад услышать. Зато можно делать циклические вибрации - 1 секунда максимум, 5 раз по 0,2 секунды на уменьшение, 1 секунда максимум и выключение вибраций на геймпаде.

     

    set_vibration(0, 1.0, 1.0)
    time.sleep(1)
    set_vibration(0, 0.8, 0.8)
    time.sleep(0.2)
    set_vibration(0, 0.6, 0.6)
    time.sleep(0.2)
    set_vibration(0, 0.4, 0.4)
    time.sleep(0.2)
    set_vibration(0, 0.2, 0.2)
    time.sleep(0.2)
    set_vibration(0, 1.0, 1.0)
    time.sleep(1)
    set_vibration(0, 0, 0)

×
×
  • Create New...