Jump to content
Korean Random
kharlashkin

[Заказ] Обновление мода Xinput-вибраций для геймпада

Recommended Posts

 

 

Собственно вот думаю будет понятно

ctypes используется для подключения xinput1_3.dll, увы, гемморно создавать подобный функционал. пас.

Share this post


Link to post

Short link
Share on other sites

ctypes используется для подключения xinput1_3.dll, увы, гемморно создавать подобный функционал. пас.

Так в том то и дело что предложенное решение @sirmax наверное единственное рабочее и правильное.

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

 

 

Никогда логами не занимался, подскажите пример хороший пожалуйста.
Для откловки конкретно ошибок - try-except.

Share this post


Link to post

Short link
Share on other sites

Так в том то и дело что предложенное решение sirmax наверное единственное рабочее и правильное.

 

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

 

Куда ловчее сделать нормальную поддержку вибрации в танках. Но читать ртфм-ы и делать наугад без самого девайса - это сизифов труд))

Скажем так, если есть код на С/С++ который выполняет вибрацию, могу сделать из него пид (dll по сути), который будет работать в танках.

Тогда в танках код мода, который будет вызывать вибрацию, сведется к примерно такому виду:

import vibra_pyd

vibra_pyd.VibrateLeft(123)

vibra_pyd.VibrateRight(456)

т.е. в моде достаточно будет лишь вызывать эти два метода для осуществления вибрации, и необходимость в ctypes отпадет.

Edited by fecell

Share this post


Link to post

Short link
Share on other sites

Скажем так, если есть код на С/С++ который выполняет вибрацию, могу сделать из него пид (dll по сути), который будет работать в танках.

Ну вот есть соответствующий код на С++

Соответствующая документация от Мелкомягких

Edited by kharlashkin
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
Ну вот есть соответствующий код на С++

о, это уже теплее. на выходных постараюсь найти время заняться. В исходниках кода кот наплакал, разобраться не сложно. DirectX SDK скачан, как раз, недавно. Надеюсь забабахаем.. тестировать и проверять тебе прийдется, у меня нет геймпада.

 

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

vibra.RightStart()

vibra.RightStop()

vibra.LeftStart()

vibra.LeftStop()

vibra.BothStart()

vibra.BothStop()

с возвратом строки 'Success' или 'Fail'.

соответственно время вибрации будет задаваться в самом моде через BigWorld.callback()

можешь пока исходник на питоне посмотреть что в нем поправить для этого надо будет.

Edited by fecell
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

о, это уже теплее. на выходных постараюсь найти время заняться. В исходниках кода кот наплакал, разобраться не сложно. DirectX SDK скачан, как раз, недавно. Надеюсь забабахаем.. тестировать и проверять тебе прийдется, у меня нет геймпада.

 

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

vibra.RightStart()

vibra.RightStop()

vibra.LeftStart()

vibra.LeftStop()

vibra.BothStart()

vibra.BothStop()

с возвратом строки 'Success' или 'Fail'.

соответственно время вибрации будет задаваться в самом моде через BigWorld.callback()

можешь пока исходник на питоне посмотреть что в нем поправить для этого надо будет.

Зачем так сложно? Нельзя ли как в документации мелкомягких отдельно левый и правый, для остановки отправляем 0?

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

Добавил во второе сообщение исходники всего мода.

В общем чего сделал "методом тыка".

Взял XVM для предыдущего патча, удалил все в нем кроме вибромода и xfw, вибрация заработала :) доволен как слон. Теперь дилемма - нужен ли мне XVM, как то за год я к нему попривык, хоть и не пользовал ничего кроме мини-карты и с недавнего времени автовозврат съемного оборудования. Ну и статистики

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

Вопрос актуален, "костыль" с вырезанием всего и вся из XVM пока работает но чую, что ппц близко.

Share this post


Link to post

Short link
Share on other sites

Вот, посмотри. xbox360_console.rar

 

Если будет работать в консоле, то в ЛС решим вопрос работы в танках.

У меня нет джойстика, проверить саму вибрацию хз как..

.

xbox360.Connect(PlayerNumber) - подключиться. Возвращает состояние подключения (1/0).

PlayerNumber - номер игрока (джойстика)

.
xbox360.IsConnected() - проверить состояние подключения. В случае если подключен возвращает 1, иначе 0.

.
xbox360.Vibrate(leftVal, rightVal) - вибрировать. В случае успеха возвращает 1, иначе 0.

leftVal, rightVal - скорость мотора левого (низкочастотного) и правого (высокочастотного). Различные комбинации дают различный эффект.

.
xbox360.StopVibrate() - остановить вибрацию, дублирует команду xbox360.Vibrate(0, 0). В случае успеха возвращает 1, иначе 0.

  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

Вот, посмотри. attachicon.gifxbox360_console.rar

 

Если будет работать в консоле, то в ЛС решим вопрос работы в танках.

У меня нет джойстика, проверить саму вибрацию хз как..

 

xbox360.Connect(PlayerNumber) - подключиться. Возвращает состояние подключения (1/0).

PlayerNumber - номер игрока (джойстика)

 

xbox360.IsConnected() - проверить состояние подключения. В случае если подключен возвращает 1, иначе 0.

 

xbox360.Vibrate(leftVal, rightVal) - вибрировать. В случае успеха возвращает 1, иначе 0.

leftVal, rightVal - скорость мотора левого (низкочастотного) и правого (высокочастотного). Различные комбинации дают различный эффект.

 

xbox360.StopVibrate() - остановить вибрацию, дублирует команду xbox360.Vibrate(0, 0). В случае успеха возвращает 1, иначе 0.

Работает ;) Добавил time.sleep под Win10 все взлетело :)

Теперь как "настоящие художники" вырезаем все лишнее :)

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

Столкнулся с проблемой организации цикла, все уже что в голову пришло перепробовал. Глубоко пока не копал, но может кто подскажет правильное направление?

 

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

INFO: loading C:\Games\World_of_Tanks\res_mods\mods/packages\gpvibromanager\python/vibroeffects/button_click_veff.uwv
INFO: effectLength 170
INFO: C:\Games\World_of_Tanks\res_mods\mods/packages\gpvibromanager\python/vibroeffects/button_click_veff.uwv is started
INFO: 0 0.00, 14.00
INFO: 1 0.00, 11.67
INFO: 2 0.00, 0.00
INFO: Time elapsed: 0.033s
INFO: C:\Games\World_of_Tanks\res_mods\mods/packages\gpvibromanager\python/vibroeffects/button_click_veff.uwv is stopped

Вроде как есть встроенный таймер BigWorld.callback(), но не могу найти внятную инструкцию по использованию. Дайте пример, люди добрые!

Share this post


Link to post

Short link
Share on other sites

BigWorld.callback(time, def)

time - время в секундах

def - метод

Я правильно понял, что этот таймер в цикле нужный метод def через кол-во секунд time пропускает? Спасибо, как то я так и думал, но "за спрос не бьют в нос" ;)

Share this post


Link to post

Short link
Share on other sites

Нет, не в цикле, а один раз. Если надо зациклить, то вызывай его же из колбэка.

Share this post


Link to post

Short link
Share on other sites

В общем нашел я в чем была проблема. Подробнее была информация в этом сообщении уважаемого @inj3ct0r, получается что сама игра "криворуко" сделана и шлет почему-то постоянно сообщения об остановке эффектов. вот у меня в игровом питоне постоянно и останавливался поток с виброэффектами. Проблема решена, вибрации сейчас работают как надо. Всем спасибо!

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...