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