Antecedentes: tl; dr no final
League of Legends tem um modo de espectador, no qual você pode assistir ao jogo de outra pessoa (essencialmente um replay) com um atraso de 3 minutos.
O popular site LoL OP.GG descobriu uma maneira inteligente de hospedar esses jogos por conta própria servidores, tornando-os assim, ao invés de estarem apenas disponíveis enquanto o jogo estiver ligado (como a Riot faz).
Se você solicitar um replay do OP.GG, ele envia um arquivo em lote que procura onde a Liga está localizada e, em seguida, a mágica acontece:
@start "" "League of Legends.exe" "8394" "LoLLauncher.exe" "" "spectator fspectate.op.gg:4081 tjJbtRLQ/HMV7HuAxWV0XsXoRB4OmFBr 1391881421 NA1"
Isso funciona bem no Windows. Estou tentando fazer com que funcione no Mac (que tem um cliente oficial).
Primeiro, tentei executar o mesmo comando manualmente (dividir por conveniência)
/Applications/ ... /LeagueOfLegends.app/ ... /LeagueofLegends 8393 LoLLauncher \
/Applications/ ... /LolClient spectator fspectate.op.gg:4081 tjJbtRLQ/HMV7HuAxWV0XsXoRB4OmFBr 1391881421 NA1
Rodar isto, no entanto, apenas inicia o LoLLauncher, que fecha todos os processos ativos do League. A mesma coisa acontece se eu apenas chamar /Applications/ ... /LeagueOfLegends.app/ ... /LeagueofLegends
Em seguida, tentei ver o que realmente acontece quando o modo Spectator é iniciado, por isso executei $ ps -axf | grep -i lol
, o que mostrou
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
De interesse:
- há
(LolClient)
que não posso matar pelo PID.
-
UserKernel updateandrun lol_launcher LoLLauncher.app
é lançado primeiro.
-
LoLLauncher
é lançado pelo UserKernel
(como podemos ver no PPID)
- O comando muito longo (PID: 24927) é como o modo Spectator é iniciado e é também lançado por
UserKernel
.
- O modo espectador é lançado exatamente da mesma forma que o OP.GG .bat queria, com a única diferença de que o modo Espectador se conecta à Riot em vez do servidor da OP.GG.
Eu tentei anexar o GDB ao LolClient, mas não consegui nada significativo, já que é um aplicativo do Adobe AIR (e nunca usei o GDB com código diferente do meu).
Em seguida, executei dtruss -a -b 100m -f -p $PID
em tudo que eu conseguia pensar: LolClient
, LolLauncher
e UserKernel
e desnatado o meio milhão de linhas produzidas. Eu encontrei coisas como o pedido GET usado para obter as informações do jogo para assistir, mas eu não pude ver qualquer lançamento do equivalente a League of Legends.exe com opções de espectador.
Por fim, corri lsof | grep -i lol
para ver se havia algo mais aberto no processo, mas não encontrei nada que parecesse apropriado. Aberto foram UserKernel
, LolLauncher
, LolClient
, Adobe AIR
, LeagueofLegends
e, em seguida, Bugsplat
, todos os quais são esperados. Nada disso pareceu especialmente relevante para descobrir como LeagueofLegends foi aberto no modo espectador.
Obviamente pode ser feito, já que o modo Spectator é acessível a partir do cliente.
Parece provável que isso pode ser feito a partir do CLI, uma vez que o Windows pode fazê-lo e os clientes devem ser iguais. A menos que eu esteja faltando alguma coisa na diferença entre como o UNIX e o Windows lidam com lançamentos de aplicativos CLI.
A minha pergunta é se existem outras coisas que eu possa tentar descobrir como iniciar o modo Spectator sozinho.
tl; dr:
Tentando entrar no modo espectador a partir do CLI. É possível no Windows (veja o primeiro bloco de código), mas apenas reinicia o League no Mac. O que mais posso tentar descobrir que chamada é feita e como reproduzi-la?
EDIT 1: Encontrei a linha exata (em GDB) quando o modo espectador é iniciado. Isso é tudo que dtruss
transformou nessa etapa.
PS: Por favor, deixe-me saber como eu posso melhorar esta questão ou sua formatação, eu adoraria usar o StackOverflow / SuperUser, mas como os caras disseram no podcast esta semana (Ep. 59) é muito intimidante. Desculpe por postar isso no StackOverflow pela primeira vez :(