Программное обеспечение: Запуск режима зрителя League of Legends из командной строки (Mac)

4502
Alex Popov

Предыстория: 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) - это способ запуска режима зрителя, который также запускается командой 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посмотреть, было ли что-то еще открыто в процессе, но не нашел ничего подходящего. Open были 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 в первый раз :(

6

2 ответа на вопрос

3
Eric Boehs

Expanding on dossy's answer, I made a bash function to make this easy to do:

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 & ) } 

Add this to your ~/.bash_profile and the spectator function will be available every time you open a new terminal.

I'm doing some wildcard magic to automatically be compatible with future versions too.

Usage:

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

To test, use lolquickfind to find a live game of a popular streamer to spectate.

(I had some problems with environment variables + wild cards + directories with spaces. No matter how I escaped the spaces it didn't seem to work. Using wildcards for spaces fixed it though.)

Cheers.

Отличная работа! Я бы порекомендовал сделать его отдельным скриптом вместо того, чтобы помещать его в bash_profile. Я вызвал мой `spectate.sh` и запустил` ln -s / usr / local / bin / spectate`, чтобы он был доступен глобально. Я поместил ваш код в скрипт здесь: http://cl.ly/YWOk Alex Popov 9 лет назад 0
Я предполагаю, что будущие читатели не будут достаточно техническими, чтобы запускать сценарий (поскольку вы должны быть в правильном каталоге или поместить его в каталог, который находится в вашем PATH). Копирование / вставка псевдонима в `~ / .bash_profile` заставит команду` зрителя 'работать откуда угодно. Я полагаю, что ссылка тоже работает, если вы храните скрипт в безопасном месте, которое не удалите. Кстати, вы можете захотеть добавить `set -e` в ваш скрипт, поскольку я` && `выполняю свои команды в случае сбоя команды. Eric Boehs 9 лет назад 0
2
dossy

I was wondering this same thing, and you were SO close ... but, here's the answer, at least for 4.14.14_08_11_13_42 (see below). FYI, I did a bunch of searching and NO ONE else seems to have figured this out for Mac, so I hope I get credit for being the first ... ;-)

First, start the League client and log in as normal. Then, in terminal:

$ 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]" 

This worked for me. The only problem is after spectating the game, the lobby doesn't reset properly -- the "game has ended" event doesn't seem to register properly when the spectator client is launched this way. So, I just close the app and relaunch ... but, at least this way I can spectate games of people who I'm not "friends" with.

Вы выиграли в интернете сегодня. Я не могу поверить, что есть только переменная, которая не позволяет перезапускаться при передаче аргументов. Любопытно, как вы нашли это. К сожалению, я ушел из Лиги 2 месяца назад: это убивало мой творческий потенциал и вызывало у меня бессонницу, но это отличная работа. Alex Popov 9 лет назад 1
Я наблюдал за игрой, затем сделал "ps -Ewww" и искал процессор зрителя. «-Ewww» предоставляет вам полные переменные среды для процесса. Я заметил «riot_launched = true» и решил, что это должно быть актуально. :-) О, и я полностью понимаю, что ты имеешь в виду, что Лига - это огромный отстой. Но это тоже очень весело. dossy 9 лет назад 0
Я не думаю, что кто-то из вас повторно посетил это в последнее время, не так ли? Я попытался выше, заменив последнюю версию, и она вылетает с «ошибкой шины». pcg79 9 лет назад 0
Неважно, я дурачок и, должно быть, опечатка. Прекрасно работает, заменяя `0.0.0.141` на 0.0.0.131`. Спасибо! pcg79 9 лет назад 0
Для любого другого, кто находит это, оказывается, у меня не было опечатки. Я просто думал, что CD'ing в директории MacOS необязателен. Это не. pcg79 9 лет назад 1