Software: Lancio della modalità di spettatore League of Legends da Command Line (Mac)

Context: tl; dr alla fine

League of Legends ha una modalità spettatore, in cui puoi guardare la partita di qualcun altro (essenzialmente una replay) con un ritardo di 3 minuti. Il popolare sito web LoL OP.GG ha capito un modo intelligente di ospitare questi giochi di spettatori sui propri server, rendendoli così riproducibili, al contrario di essere disponibili solo mentre il gioco è in gioco (come Riot lo fa).

Se richiedi una replica da OP.GG, invia un file batch che cerca where è la Lega e poi la magia accade:

@start "" "League of Legends.exe" "8394" "LoLLauncher.exe" "" "spectator fspectate.op.gg:4081 tjJbtRLQ/HMV7HuAxWV0XsXoRB4OmFBr 1391881421 NA1" 

Questo funziona bene su Windows. Sto cercando di farlo funzionare su Mac (che ha un client ufficiale).

Innanzitutto ho provato a eseguire lo stesso command a mano, (split per comodità)

 /Applications/ ... /LeagueOfLegends.app/ ... /LeagueofLegends 8393 LoLLauncher \ /Applications/ ... /LolClient spectator fspectate.op.gg:4081 tjJbtRLQ/HMV7HuAxWV0XsXoRB4OmFBr 1391881421 NA1 

L'esecuzione di questo, tuttavia, inizia solo LoLLauncher, che chiude tutti i processi attivi della lega. La stessa cosa succede se /Applications/ ... /LeagueOfLegends.app/ ... /LeagueofLegends solo /Applications/ ... /LeagueOfLegends.app/ ... /LeagueofLegends

Avanti ho provato a vedere cosa accade in realtà quando viene avviata la modalità Spectator e ho eseguito $ ps -axf | grep -i lol $ ps -axf | grep -i lol che ha mostrato

 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 

Di interesse:

  • c'è (LolClient) che non posso uccidere per il suo PID.
  • UserKernel updateandrun lol_launcher LoLLauncher.app viene lanciato per la prima volta.
  • LoLLauncher viene lanciato da UserKernel (come si può vedere dal PPID)
  • Il command molto lungo (PID: 24927) è come avviare la modalità Spectator ed è anche lanciato da UserKernel .
  • La modalità Spectator viene lanciata esattamente come il OP.GG .bat voleva, con l'unica differenza che la modalità Spectator si connette a Riot invece che al server spettatore OP.GG.

Ho provato a colbind GDB al LolClient, ma non ho potuto get niente di significativo in quanto è un'applicazione Adobe AIR (e non ho mai usato GDB con codice diverso da quello mio).

Successivamente ho eseguito dtruss -a -b 100m -f -p $PID su tutto quello che potevo pensare: il LolClient , il LolLauncher e l' UserKernel e scremato i mezzo milione di righe prodotte. Ho trovato cose come la richiesta GET utilizzata per get le informazioni del gioco per spettare, ma non ho potuto vedere alcun lancio dell'equivalente di League of Legends.exe con opzioni di spettatore.

Infine, ho eseguito lsof | grep -i lol lsof | grep -i lol per vedere se qualcos'altro è stato aperto nel process, ma non ha trovato niente che sembrava appropriato. Aperti sono stati UserKernel , LolLauncher , LolClient , Adobe AIR , LeagueofLegends e poi Bugsplat , che sono tutti previsti. Nessuno di questi sembrava particolarmente rilevante per capire come LeagueofLegends fosse stato aperto in modalità spettatore.

Ovviamente può essere fatto, poiché la modalità Spectator è accessibile dall'interno del client. Sembra probabile che possa essere fatto dal CLI, dato che Windows può farlo e che i clienti dovrebbero essere uguali. A less che non mi manchi qualcosa nella differenza tra il modo in cui UNIX e Windows gestiscono l'applicazione CLI.

La mia domanda è se ci sono altre cose che posso cercare di capire come avviare la modalità Spectator stesso.

tl; dr:

Cercando di entrare in modalità spettatore dal CLI. È ansible su Windows (vedere il primo block di codice), ma solo riavvia Lega su Mac. Che altro posso cercare di trovare la chiamata e come riprodurla?

EDIT 1: Ho trovato la linea esatta (in GDB) quando viene lanciata la modalità spettatore. Questo è tutto ciò che dtruss si è presentato per quel passo.

PS: Lasciathemes sapere come posso migliorare questa domanda o la sua formattazione, mi piacerebbe usare StackOverflow / SuperUser, ma come hanno detto i ragazzi nel podcast questa settimana (Ep 59) è molto intimidatorio. Mi dispiace per aver postato questo su StackOverflow la prima volta 🙁

Mi stavo chiedendo questa stessa cosa, e tu eri così vicino … ma, ecco la risposta, alless per 4.14.14_08_11_13_42 (vedi sotto). FYI, ho fatto un sacco di ricerca e nessun altro sembra aver capito questo per Mac, quindi spero di avere il merito di essere il primo … 😉

Innanzitutto, avviare il client League e accedere come normalmente. Poi, in 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]" 

Questo ha funzionato per me. L'unico problema è dopo aver visto il gioco, la lobby non si ripristina correttamente – l'evento "il gioco è finito" non sembra registrarsi correttamente quando il client spettatore viene lanciato in questo modo. Quindi, chiudo l'applicazione e rilancio … ma, alless in questo modo posso spettare giochi di persone con cui non sono "amici".

Espandendo alla risposta di dossy, ho fatto una function bash per rendere questo facile da fare:

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

Aggiungi questo al tuo ~/.bash_profile e la function spectator sarà disponibile each volta che apri un nuovo terminal.

Sto facendo una magia di wildcard per essere compatibile automaticamente con le versioni future.

Uso:

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

Per verificare, utilizza lolquickfind per trovare un gioco live di un popolare streamer per spettare.

(Ho avuto alcuni problemi con le variables di ambiente + tabs wild + directory con spazi. Non import come sono scampati gli spazi che non sembrava funzionare. Utilizzando i caratteri jolly per gli spazi è stato risolto.)

Saluti.