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

Предыстория: 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

Затем я попытался увидеть, что на самом деле происходит при запуске режима "Зритель", поэтому я запустил $ 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,
  • Режим зрителя запускается точно так же, как и хотел OP.GG .bat, с той лишь разницей, что режим зрителя подключается к 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 ответа

Решение

Мне было интересно то же самое, и вы были НАСТОЛЬКО близки... но вот ответ, по крайней мере, для 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]"

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

Разбираясь с ответом Досси, я сделал функцию 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, чтобы найти живую игру популярного стримера для просмотра.

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

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

Другие вопросы по тегам