Предыстория: 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 в первый раз :(