6

Предыстория: tl; dr в конце

В League of Legends есть режим зрителя, в котором вы можете наблюдать за чужой игрой (по сути, повтором) с 3-минутной задержкой. Популярный веб-сайт LoL OP.GG нашел умный способ размещения этих игр для зрителей на своих собственных серверах, тем самым делая их воспроизводимыми, а не доступными только во время игры (как это делает Riot).

Если вы запрашиваете переигровку у OP.GG, он отправляет пакетный файл, который ищет местоположение Лиги, и затем происходит волшебство:

    @start "" "League of Legends.exe" "8394" "LoLLauncher.exe" "" "spectator fspectate.op.gg:4081 tjJbtRLQ/HMV7HuAxWV0XsXoRB4OmFBr 1391881421 NA1"

Это отлично работает на Windows. Я пытаюсь заставить его работать на Mac (у которого есть официальный клиент).

Сначала я попытался запустить ту же команду вручную (разбито для удобства)

/Applications/ ... /LeagueOfLegends.app/ ... /LeagueofLegends 8393 LoLLauncher \
/Applications/ ... /LolClient spectator fspectate.op.gg:4081 tjJbtRLQ/HMV7HuAxWV0XsXoRB4OmFBr 1391881421 NA1

Выполнение этого, однако, только запускает LoLLauncher, который закрывает все активные процессы Лиги. Точно так же происходит, если я просто позвоню /Applications/ ... /LeagueOfLegends.app/ ... /LeagueofLegends

Затем я попытался увидеть, что на самом деле происходит при запуске режима Spectator, поэтому я запустил $ ps -axf | grep -i lol который показал

UID   PID  PPID   C STIME   TTY           TIME CMD
503  3085     1   0 Wed02pm ??         0:00.00 (LolClient)
503 24607     1   0  9:19am ??         0:00.98 /Applications/League of Legends.app/Contents/LOL/RADS/system/UserKernel.app/Contents/MacOS/UserKernel updateandrun lol_launcher LoLLauncher.app
503 24610 24607   0  9:19am ??         1:08.76 /Applications/League of Legends.app/Contents/LoL/RADS/projects/lol_launcher/releases/0.0.0.122/deploy/LoLLauncher.app/Contents/MacOS/LoLLauncher
503 24611 24610   0  9:19am ??         1:23.02 /Applications/League of Legends.app/Contents/LoL/RADS/projects/lol_air_client/releases/0.0.0.127/deploy/bin/LolClient -runtime .\ -nodebug META-INF\AIR\application.xml .\ -- 8393
503 24927 24610   0  9:44am ??         0:03.37 /Applications/League of Legends.app/Contents/LoL/RADS/solutions/lol_game_client_sln/releases/0.0.0.117/deploy/LeagueOfLegends.app/Contents/MacOS/LeagueofLegends 8394 LoLLauncher /Applications/League of Legends.app/Contents/LoL/RADS/projects/lol_air_client/releases/0.0.0.127/deploy/bin/LolClient spectator 216.133.234.17:8088 Yn1oMX/n3LpXNebibzUa1i3Z+s2HV0ul 1400781241 NA1

Представляет интерес:

  • есть (LolClient) который я не могу убить его PID.
  • UserKernel updateandrun lol_launcher LoLLauncher.app запускается первым.
  • LoLLauncher запускается UserKernel (как мы видим из PPID)
  • Очень длинная команда (PID: 24927) - это способ запуска режима Spectator, который также запускается UserKernel .
  • Режим Spectator запускается точно так же, как и хотел OP.GG .bat, с той лишь разницей, что режим Spectator подключается к Riot, а не к серверу зрителей OP.GG.

Я попытался подключить GDB к LolClient, но я не смог извлечь из этого ничего значимого, поскольку это приложение Adobe AIR (и я никогда не использовал GDB с кодом, отличным от моего).

Затем я запустил dtruss -a -b 100m -f -p $PID для всего, что мог придумать: LolClient , LolLauncher и UserKernel и просмотрел полмиллиона произведенных строк. Я обнаружил такие вещи, как запрос GET, используемый для получения информации об игре, но я не мог увидеть запуск эквивалента League of Legends.exe с опциями зрителя.

Наконец я запустил lsof | grep -i lol чтобы увидеть, было ли открыто что-то еще в процессе, но не нашло ничего подходящего. Открытыми были UserKernel , LolLauncher , LolClient , Adobe AIR , LeagueofLegends и затем Bugsplat , и все это ожидается. Ничто из этого не казалось особенно актуальным для выяснения того, как LeagueofLegends была открыта в режиме зрителя.

Это, очевидно, можно сделать, поскольку режим Spectator доступен из клиента. Кажется вероятным, что это может быть сделано из CLI, так как Windows может сделать это, и клиенты, как предполагается, равны. Если только я не упустил что-то из разницы между тем, как UNIX и Windows управляют запуском приложения CLI.

У меня вопрос, есть ли другие вещи, которые я могу попытаться выяснить, как запустить режим Spectator самостоятельно.

ТЛ; др:

Попытка войти в режим зрителя из CLI. Это возможно в Windows (см. Первый блок кода), но просто перезапускает League на Mac. Что еще можно попытаться найти, какой звонок сделан и как его воспроизвести?

РЕДАКТИРОВАТЬ 1: Я нашел точную линию (в GDB), когда запускается режим зрителя. Это все, что dtruss на этот шаг.

PS: Пожалуйста, дайте мне знать, как я могу улучшить этот вопрос или его форматирование, я хотел бы использовать StackOverflow/SuperUser, но, как сказали ребята на подкасте на этой неделе (Ep. 59), это очень пугающе. Извините за публикацию этого в StackOverflow в первый раз :(

2 ответа2

3

Разбираясь с ответом Досси, я сделал функцию bash, чтобы сделать это легко:

spectator() { ( export LOL_APP="/Applications/League*of*Legends.app" && export LOL_GAME_CLIENT_DIR="$LOL_APP/Contents/LoL/RADS/solutions/lol_game_client_sln/releases/*/deploy/LeagueOfLegends.app/Contents/MacOS" && cd $LOL_GAME_CLIENT_DIR && riot_launched=true nohup "$(ls -1 $LOL_GAME_CLIENT_DIR/LeagueofLegends)" 8394 LoLLauncher "$LOL_APP/Contents/LoL/RADS/projects/lol_air_client/releases/*/deploy/bin/LolClient" "spectator $1 $2 $3 $4" >/dev/null 2>&1 & ) }

Добавьте это в ваш ~/.bash_profile и функция spectator будет доступна каждый раз, когда вы открываете новый терминал.

Я использую маску подстановки для автоматической совместимости с будущими версиями.

Использование:

spectator [ip:port] [token] [number] [region]

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

(У меня были некоторые проблемы с переменными среды + подстановочные знаки + каталоги с пробелами. Независимо от того, как я избежал пробелов, это, казалось, не работало. Использование подстановочных знаков для пробелов исправило это.)

Приветствия.

2

Мне было интересно то же самое, и вы были НАСТОЛЬКО близки ... но вот ответ, по крайней мере, для 4.14.14_08_11_13_42 (см. Ниже). К вашему сведению, я провел кучу поисков, и никто другой, кажется, не понял этого для Mac, поэтому я надеюсь, что получу кредит за то, что был первым ... ;-)

Сначала запустите клиент Лиги и войдите как обычно. Затем в терминале:

$ cd "/Applications/League of Legends.app/Contents/LoL/RADS/solutions/lol_game_client_sln/releases/0.0.0.131/deploy/LeagueOfLegends.app/Contents/MacOS"

$ riot_launched=true "/Applications/League of Legends.app/Contents/LoL/RADS/solutions/lol_game_client_sln/releases/0.0.0.131/deploy/LeagueOfLegends.app/Contents/MacOS/LeagueofLegends" 8394 LoLLauncher "/Applications/League of Legends.app/Contents/LoL/RADS/projects/lol_air_client/releases/0.0.0.140/deploy/bin/LolClient" "spectator [ip:port] [token] [number] [region]"

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .