LINUX.ORG.RU
ФорумGames

SteamForwarder - обёртка для steam_api.dll в wine

 ,


15

11

Приветствую, уважаемое сообщество!

На днях я довёл до более-менее рабочего состояния обёртку для steam_api.dll в wine и теперь хочу поделиться наработками с общественностью.

Зачем это нужно?

Чтобы не устанавливать steam под wine, если захотелось поиграть в игру из steam для windows.

Как это работает?

Wine отлично умеет пробрасывать вызовы библиотек windows в linux, steam_api.dll не является исключением. Все вызовы к steam_api.dll перехватываются wine, направляются в SteamForwarder, там по необходимости допиливаются до совместимых с linux и перенаправляются в libsteam_api.so.

А за это не забанят?

На данный момент существует аналогичная софтина, но с более мудрёной схемой работы, под названием steambridge. За 2 года её использования, автору не поступали сообщения о банах. Хотя легальность подобной подмены dll всё ещё под вопросом, Valve игнорируют вопросы на эту тему.

Как установить игру для windows без windows версии steam?

Для этого существует небольшой скрипт app_install.py. Он создаёт манифест для steam, скачивает игру через steamcmd и формирует скрипт для запуска игры (чтобы работал оверлей, и wine не потерял обёртку для steam_api.dll). После этих нехитрых манипуляций steam под linux начнёт видеть игру, но настоятельно не рекомендуется позволять ему её обновлять (особенно есть кроме версии игры под винду есть еще и версия под мак), может стереть все файлы игры. Для обновления лучше использовать steamcmd или app_install.py.

Ознакомиться с наработками можно тут: https://github.com/xomachine/SteamForwarder

Баг репорты и предложения по улучшению приветствуются.

Интересная вещь. Надо будет на чём-нибудь протестировать, как будет свободное время выкачивать вендовые игры и, собственно, играть.

a1batross ★★★★★
()

Нужная вещь. Желаю развития проекту. К сожалению, пока протестировать не могу, но буду следить за проектом

sehellion ★★★★★
()
Последнее исправление: sehellion (всего исправлений: 1)

питхон тхри

сколько задержка вызовов минута?

за что питон тхри?

lwx51033
()
Ответ на: комментарий от RazrFalcon

Разница в отсутствии промежуточной dll (steam_api_proxy в терминах steambridge). Т.е. не нужно ставить винду на виртуалку, в неё Visual Studio и компилировать дополнительную библиотеку. + в отличии от steambridge в этой обёртке поддерживается значительно больше вызовов, заглушек почти нет, а те, что есть относятся к весьма специфическим функциям, которых, я надеюсь, обычный пользователь не встретит.

xomachine
() автор топика

полагаю по тому что у тебя bool например в remotestorage с steamapi < 1.26 (~2013 год) работать не будет там был тип EResult

MEXAHOTABOP
()

Звучит конечно круто, но вот я пробую установить скажем первого ведьмака.

[radius@desktop SteamForwarder]$ python app_install.py 20900
Obtaining app info...
http://steamdb.info/app/20900/config/
Generating manifest...
Traceback (most recent call last):
  File "app_install.py", line 113, in <module>
    with open(manifest_location, "w") as f:
FileNotFoundError: [Errno 2] No such file or directory: '/home/radius/.local/share/Steam/steamapps/appmanifest_20900.acf'

Получается он его не может создать этот манифест или в чем дело?

Radius ★★★★
()
Ответ на: комментарий от Radius

Ладно, разобрался, с путями была проблема. Добавил -s /home/radius/.local/share/Steam/SteamApps и установил сам steamcmd.

[radius@desktop SteamForwarder]$ python app_install.py -s /home/radius/.local/share/Steam/SteamApps 20900
Obtaining app info...
http://steamdb.info/app/20900/config/
Generating manifest...
Downloading The Witcher: Enhanced Edition via steamcmd...
Redirecting stderr to '/home/radius/.local/share/Steam/logs/stderr.txt'
ILocalize::AddFile() failed to load file "public/steambootstrapper_english.txt".
ILocalize::AddFile() failed to load file "public/steambootstrapper_russian.txt".
[  0%] Checking for available update...
[  0%] Download Complete.
Generating runscript...
system/djinni!.exe
Traceback (most recent call last):
  File "app_install.py", line 121, in <module>
    with open(runscript_location, "w") as f:
FileNotFoundError: [Errno 2] No such file or directory: '/home/radius/.local/share/Steam/SteamApps/common/The Witcher Enhanced Edition/The Witcher Enhanced Edition.sh'

Теперь похоже какая-то проблема с этим steamcmd. Проще наверное уже из виндовой версии скачать и скриптом запускать.

Radius ★★★★
()
Ответ на: комментарий от MEXAHOTABOP

Обратная совместимость не задумывалась изначально. А разве valve не вынуждает разработчиков переходить на последние версии api?

В любом случае, если понадобится необходимость в старых версиях api - можно немного доработать кодогенератор, подсунуть ему заголовки и библиотеку старой версии, после чего он создаст совместимую библиотеку. Пишите репорт в issues с конкретной версией api и желательно ссылкой на заголовки и библиотеки (для windows и linux).

xomachine
() автор топика
Ответ на: комментарий от Radius

Весьма сложный случай. Я так понимаю, steamcmd так и не скачал самого ведьмака. Честно говоря, я не тестировал скрипт с небесплатными играми, возможно стоит дать steamcmd пароль для таких случаев. Попробуйте скачать вручную через: steamcmd +login <Ваш логин> [Ваш пароль] +@sSteamCmdForcePlatformType windows +app_update 20900 validate +quit Если не сложно, создайте баг-репорт на github для простоты обсуждения проблемы.

Но это только половина проблемы, вторая половина в наличии нескольких способов запуска. Я доработаю скрипт.

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

xomachine
() автор топика

Интересно...
Весь функционал пробрасывается?не нашел в репе чеклиста с реализованными фичами.
Например есть у меня в вайне киллингфлур. В котором браузер серверов использует стимовский апи (например для отображения серверов друзей). Заведется?
Как использовать сие с уже готовым префиксом в котором уже есть и стим и игра? Биюлиотеку в папку с игрой положить? А как тогда запускать? Для быстрого теста это самый удобный вариант.

genryRar ★★
()
Ответ на: комментарий от genryRar

Чтобы чеклист составить нужно много тестов, а чисто формально поддерживается всё кроме тех функций, которые помечены как stub в steam_api.auto.spec. Из всёго, что я протестировал (а это всего 4 игры), у меня на всём работало.

Насчет быстрого теста есть небольшая пометка в README.md. Если май фул оф криминалити инглиш не понятен - перевожу: нужно поместить steam_api.dll.so в папку, прописанную в переменной окружения WINEDLLPATH, а libsteam_api.so в LD_LIBRARY_PATH, затем указать в настройках вайна своего префикса в замещениях библиотек *steam_api как встроенную (или сделать это через export WINEDLLOVERRIDE="*steam_api=b"). Еще нужно указать игре её appid если не было указано. Это делается либо через переменную SteamAppId, либо помещением steam_appid.txt содержащего этот самый ид в папку с игрой. Если нужен оверлей нужно добавить export LD_PRELOAD="<путь к gameoverlayrenderer.so>" перед запуском. После всех манипуляций нужно запустить линуксовый стим и запустить саму игру в своём префиксе самым обычным образом wine <exe'шник игры>.

А можно не париться и доверить составление скрипта запуска app_install.py (я уже поправил часть прошлых проблем, жду тестов). Для этого нужно укзать в ключе -w путь к своему префиксу, в ключе -s путь к месту обитания игр стима, сделать симлинк папки с игрой в папку где стим ожидает её увидеть (обычно это <папка linux стима>/steamapps/common/<папка игры>, точное название папки игры можно найти в манифесте сгенерированном скриптом, чтобы получить манифест надо запустить установку игры скриптом и тут же прервать её, либо, если уже есть стим от винды, папка будет называться так же) и запустить установку игры скриптом. Скрипт сверит данные игры, если надо - догрузит чего не хватает, создаст скрипт запуска в котором прописаны все нужные переменные окружения. В крайнем случае можно просто распотрошить скрипт установки.

xomachine
() автор топика

Я так и не понял, какой-то профит помимо усложнения процесса установки и обновления есть?

Gary ★★★★★
()
Ответ на: комментарий от Gary

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

xomachine
() автор топика

Игры кроме косынки,что придумал ms для обучения людей мышки - эло. :)
А вообще годно и интересно. На буке конечно труп. Нужно будет завести свой страшный кирогаз и посмотреть как оно.

hbars ★★★★★
()
Ответ на: комментарий от xomachine

Да, ничего не скачивается. Даже директория не создается и соответственно скрипт запуска.

steamcmd +login <Ваш логин> [Ваш пароль] +@sSteamCmdForcePlatformType windows +app_update 20900 validate +quit

Так тоже не скачивается, точно также выкидывает [ 0%] Download Complete и закрывается. Может быть не +app_update надо, а что-нибудь другое? Где вообще нормальную документацию на этот steamcmd найти? гугление выдает только какие-то огрызки.

Ладно, фиг с ней с установкой, это не главное. Линканул каталог с игрой в линуксовый стим из виндового, создал новый чистый win32 префикс, прописал его в скрипт. Сперва оказалось, что скрипт запускает не саму игру, а редактор. Т.е. вот отсюда https://steamdb.info/app/20900/config/ он почему-то взял не system\witcher.exe, а system\djinni!.exe. В общем редактор на удивление запустился после установки необходимых компонентов, а вот сама игра сначала ругалась на отсутствие d3dx9, установил и она вообще перестала запускаться. При этом в логе только обычная ошибка стима

ERROR: ld.so: object 'gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
но еще выскакивает гуишное окошко вайна с ошибкой, заголовок Steam Error, текст Application load error 5:0000065434

Возможно проблема именно в игре. Есть какие-нибудь варианты игр, которые точно должны работать?

Radius ★★★★
()
Ответ на: комментарий от ZERG

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

Radius ★★★★
()
Ответ на: комментарий от Radius

Так, во-первых, я обновил скрипт, можно скачать новую версию тут. Теперь он создаёт скрипты запуска для всех exe'шников из steamdb.info и добавляет переменные окружения с AppID.

Первое сообщение о несовместимости gameoverlayrenderer.so безобидное. Просто wine сначала запускается как x86_64 программа, а потом переключается в x86 режим, и там уже оверлей подгружается без ошибок. Касательно Steam Error, текст Application load error 5:0000065434 нужно посмотреть в лог с WINEDEBUG=trace+steam_api(скрипт по умолчанию формирует такой лог). Есть ли там что-либо связанное со steam_api? Хотя возможно там проблема с какой-нибудь DRM подобной сущностью.

Игры которые у меня работали: Smite, Atlas Reactor, Path of Exile, Paladins (только взаимодействие со стим, играть мешает античит). Надо будет протестировать еще на какой-нибудь вин-версии купленой игры.

xomachine
() автор топика
Ответ на: комментарий от xomachine

с WINEDEBUG=trace+steam_api все то же самое. Т.е. вообще нифига, одна только эта строчка в логе и окошко с ошибкой.

Скрипт у меня сгенерился вот такой, только префикс другой подставил.

#!/bin/bash
export WINEPREFIX="/home/radius/.wine32"
export WINEDLLPATH+=":/home/radius/bin/SteamForwarder"
export LD_LIBRARY_PATH+=":/home/radius/.local/share/Steam/ubuntu12_32/:/home/radius/bin/SteamForwarder"
export WINEDEBUG="trace+steam_api"
export WINEARCH="win32"
export WINEDLLOVERRIDES="*steam_api=b"
export SteamAppId="20900"
export SteamControllerAppId="20900"
export SteamGameId="20900"
export SteamUser="anonymous"
export SteamAppUser="anonymous"
LD_PRELOAD="gameoverlayrenderer.so" wine "/home/radius/.local/share/Steam/SteamApps/common/The Witcher Enhanced Edition/system/witcher.exe"  &> "$(dirname "$0")/lastrun.log"

Может быть я что-то не так делаю? steam_api.dll должен же в корне WINEDLLPATH+ лежать?

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

Radius ★★★★
()
Ответ на: комментарий от xomachine

Игры которые у меня работали: Smite, Atlas Reactor, Path of Exile, Paladins (только взаимодействие со стим, играть мешает античит). Надо будет протестировать еще на какой-нибудь вин-версии купленой игры.

Попробовал Path of Exile - завелось с пол пинка. Вроде все отлично, верлей стимовский на месте. Только смысла не вижу, что оно в бесплатных играх работает, их же можно и без стима запускать свободно. Стим необходим только для игр, у которых к нему привязка-дрм (т.е. платных).

Radius ★★★★
()
Ответ на: комментарий от xomachine

Протестировал еще бесплатную star conflict https://steamdb.info/app/212070/ и платную Hitman blood money https://steamdb.info/app/6860/.

Первая запускается и вроде даже работает, но при попытке вызова оверлея стима тут же падает. Вот лог https://bpaste.net/show/403e49f73037 Столько ошибок d3d из-за того, что запустил игру в обычном вайне, а не staging.

Вторая ведет себя точно также, как и ведьмак. Только текст в ошибке Failed to find Steam. Короче ведет себя ровно так, как-будто стим вообще не запущен. В логе только вот что:

ERROR: ld.so: object 'gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
fixme:process:SetProcessDEPPolicy (1): stub
fixme:wer:WerSetFlags (2) stub!
fixme:heap:RtlSetHeapInformation (nil) 1 (nil) 0 stub

т.е. походу тоже ничего.

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

Еще попробовал прописать в steamforwarder.json свой стим юзернейм, в скрипте добавились SteamUser и SteamAppUser, но тоже никак не помогает.

Radius ★★★★
()
22 августа 2018 г.

Годная штука, давно искал

Спасибо

Deleted
()

Актуально после недавних новостей?

ZERG ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.