фон: 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-INFAIRapplication.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)- очень длинные команды (ПИД: 24927) как зритель запустил режим и и запустил
UserKernel
. - режим наблюдателя запускается точно так же, как и OP.GG .бат хотел, с той лишь разницей, что режим зрителя подключается к 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 был открыт в режиме наблюдения.
очевидно can быть сделано, так как режим зрителя доступен изнутри клиента.
Кажется вероятным, что это может быть сделано от CLI, так как Windows может сделать это, и клиенты, как предполагается, равны. Если я не упускаю что-то в разнице между тем, как UNIX и окна ручки запускает программы CLI.
мой вопрос в том, есть ли какие-либо другие вещи, которые я могу попытаться выяснить, как запустить режим наблюдателя сам.
tl; dr:
попытка войти в режим наблюдателя из CLI. Это возможно в Windows (см. Первый блок кода), но он просто перезапускает League на Mac. Что еще я могу попробовать найти, какой звонок сделан, и как его воспроизвести?
EDIT 1: я нашел точную строку (в GDB), когда запускается режим наблюдателя. Это все dtruss
появился за один шаг.
PS: пожалуйста, дайте мне знать, как я могу улучшить этот вопрос или его форматирование, я хотел бы использовать StackOverflow/SuperUser, но, как сказали ребята на подкасте на этой неделе (Ep. 59) это очень пугает. Извините за публикацию этого на StackOverflow в первый раз: (