Software: Iniciando o modo de espectador League of Legends da Command Line (Mac)

6

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:

  • (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 :(

    
por Alex Popov 30.05.2014 / 23:18

2 respostas

2

Eu estava me perguntando a mesma coisa, e você estava tão perto ... mas, aqui está a resposta, pelo menos para 4.14.14_08_11_13_42 (veja abaixo). FYI, eu fiz um monte de pesquisa e ninguém parece ter descoberto isso para Mac, por isso espero ter crédito por ser o primeiro ...; -)

Primeiro, inicie o cliente da Liga e faça o login normalmente. Então, no terminal:

$ 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]"

Isso funcionou para mim. O único problema é depois de assistir ao jogo, o lobby não é reiniciado corretamente - o evento "game has ended" não parece se registrar corretamente quando o cliente espectador é lançado dessa forma. Então, acabei de fechar o aplicativo e relançar ... mas, pelo menos dessa maneira, posso assistir a jogos de pessoas com quem não sou "amigo".

    
por 26.08.2014 / 17:59
3

Expandindo a resposta dos dossys, criei uma função bash para facilitar o processo:

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 & ) }

Adicione isso ao seu ~/.bash_profile e a função spectator estará disponível toda vez que você abrir um novo terminal.

Eu também faço mágica de coringa para ser compatível automaticamente com versões futuras.

Uso:

spectator [ip:port] [token] [number] [region]

Para testar, use lolquickfind para encontrar um jogo ao vivo de um streamer popular para assistir.

(Eu tive alguns problemas com variáveis de ambiente + curingas + diretórios com espaços. Não importa o quanto eu escapei dos espaços, isso não parece funcionar. Usando curingas para espaços corrigidos).

Felicidades.

    
por 12.11.2014 / 23:14