Software: Starten des Zuschauermodus für League of Legends über die Befehlszeile (Mac)

4585
Alex Popov

Hintergrund: tl; dr am Ende

League of Legends verfügt über einen Zuschauermodus, in dem Sie das Spiel eines anderen Spielers (im Wesentlichen eine Wiederholung) mit einer Verzögerung von 3 Minuten verfolgen können. Die beliebte LoL-Website OP.GG hat eine clevere Methode gefunden, um diese Zuschauerspiele auf ihren eigenen Servern zu hosten und sie dadurch spielbar zu machen, anstatt nur während des Spiels verfügbar zu sein (wie Riot dies tut).

Wenn Sie eine Wiederholung von OP.GG anfordern, wird eine Batch-Datei gesendet, in der nach dem Standort der Liga gesucht wird und der Zauber dann auftritt:

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

Dies funktioniert gut unter Windows. Ich versuche, es auf einem Mac (der einen offiziellen Client hat) zum Laufen zu bringen.

Zuerst habe ich versucht, den gleichen Befehl von Hand auszuführen (aus Gründen der Zweckmäßigkeit zur Teilung)

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

Wenn Sie dies ausführen, wird jedoch nur der LoLLauncher gestartet, der alle aktiven League-Prozesse schließt. Das gleiche passiert, wenn ich nur anrufe/Applications/ ... /LeagueOfLegends.app/ ... /LeagueofLegends

Als nächstes habe ich versucht, zu sehen, was wirklich passiert, wenn Zuschauer - Modus gestartet wird, so lief ich $ ps -axf | grep -i loldie zeigten ,

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 

Von Interesse:

  • Es gibt etwas, (LolClient)das ich nicht durch seine PID töten kann.
  • UserKernel updateandrun lol_launcher LoLLauncher.app wird zuerst gestartet.
  • LoLLauncherwird von der gestartet UserKernel(wie wir der PPID entnehmen können)
  • Mit dem sehr langen Befehl (PID: 24927) wird der Spectator-Modus gestartet, und er wird auch von gestartet UserKernel.
  • Der Spectator-Modus wird genau so gestartet, wie es der OP.GG .bat wollte, mit dem einzigen Unterschied, dass sich der Spectator-Modus mit Riot verbindet, anstatt mit dem Spectate-Server von OP.GG.

Ich habe versucht, GDB an den LolClient anzuschließen, konnte aber nichts Sinnvolles daraus entnehmen, da es sich um eine Adobe AIR-Anwendung handelt (und ich habe GDB nie mit anderem als meinem eigenen Code verwendet).

Als nächstes lief ich dtruss -a -b 100m -f -p $PIDauf alles, woran ich denken konnte: die LolClient, die LolLauncherund die UserKernelund eine halbe Million produzierte Zeilen. Ich fand Sachen wie die GET-Anfrage, mit der die Informationen des Spiels angezeigt wurden, aber ich konnte keinen Start des Äquivalents von League of Legends.exe mit Zuschaueroptionen sehen.

Schließlich lief ich lsof | grep -i lolzu sehen, ob dabei noch etwas geöffnet wurde, fand aber nichts, was angemessen schien. Offen waren UserKernel, LolLauncher, LolClient, Adobe AIR, LeagueofLegendsund dann Bugsplat, von denen alle erwartet. Nichts davon schien besonders relevant zu sein, um herauszufinden, wie LeagueofLegends im Zuschauermodus geöffnet wurde.

Dies ist natürlich möglich, da der Spectator-Modus vom Client aus zugänglich ist. Es ist wahrscheinlich, dass dies von der CLI aus möglich ist, da Windows dies kann und die Clients gleich sind. Es sei denn, mir fehlt etwas im Unterschied zwischen der Handhabung von CLI-Anwendungen unter UNIX und Windows.

Meine Frage ist, ob es noch andere Dinge gibt, mit denen ich herausfinden kann, wie der Spectator-Modus selbst gestartet wird.

tl; dr:

Der Versuch, über die CLI in den Zuschauermodus zu gelangen. Es ist unter Windows möglich (siehe erster Codeblock), aber es wird nur League auf dem Mac neu gestartet. Was kann ich sonst noch versuchen, herauszufinden, welcher Anruf getätigt wird und wie ich ihn reproduzieren kann?

BEARBEITEN 1: Ich habe die genaue Linie (in GDB) gefunden, wenn der Zuschauermodus gestartet wird. Das ist alles, was dtrussaufgedreht für diesen einen Schritt.

PS: Bitte lassen Sie mich wissen, wie ich diese Frage oder deren Formatierung verbessern kann. Ich würde gerne StackOverflow / SuperUser verwenden, aber wie die Jungs diese Woche im Podcast sagten (Ep. 59), ist das sehr einschüchternd. Es tut uns leid, dass Sie das erste Mal auf StackOverflow gepostet haben :(

6

2 Antworten auf die Frage

3
Eric Boehs

Um auf die Antwort von Dossy einzugehen, habe ich eine Bash-Funktion erstellt, um dies einfach zu machen:

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

Fügen Sie dies Ihrem hinzu ~/.bash_profileund die spectatorFunktion ist bei jedem Öffnen eines neuen Terminals verfügbar.

Ich verwende eine Wildcard-Magie, um automatisch auch mit zukünftigen Versionen kompatibel zu sein.

Verwendungszweck:

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

Um dies zu testen, verwenden Sie lolquickfind, um ein Live-Spiel eines beliebten Streamers zu suchen.

(Ich hatte einige Probleme mit Umgebungsvariablen + Platzhaltern + Verzeichnissen mit Leerzeichen. Egal wie ich die Leerzeichen verlassen habe, es schien nicht zu funktionieren. Die Verwendung von Platzhaltern für Leerzeichen hat es jedoch behoben.)

Prost.

Exzellente Arbeit! Ich würde empfehlen, es zu einem separaten Skript zu machen, anstatt es in das bash_profile zu schreiben. Ich rief meine "spectate.sh" an und ließ "ln -s / usr / local / bin / spectate" laufen, damit es global verfügbar ist. Ich habe Ihren Code hier in ein Skript eingefügt: http://cl.ly/YWOk Alex Popov vor 9 Jahren 0
Ich gehe davon aus, dass zukünftige Leser nicht technisch genug sind, um ein Skript auszuführen (da Sie sich im richtigen Verzeichnis befinden müssen oder es in einem Verzeichnis ablegen müssen, das sich in Ihrem PFAD befindet). Durch Kopieren / Einfügen eines Alias ​​in `~ / .bash_profile` wird der` Zuschauer'-Befehl von überall aus funktionieren. Ich denke, der Link funktioniert auch, vorausgesetzt, Sie bewahren das Skript an einem sicheren Ort auf, den Sie nicht löschen werden. Übrigens möchten Sie vielleicht Ihrem Skript "set -e" hinzufügen, wenn ich meine Befehle für den Fall eines Befehls versuche. Eric Boehs vor 9 Jahren 0
2
dossy

Ich wunderte mich dasselbe, und Sie waren so nah dran ... aber hier ist die Antwort, zumindest für 4.14.14_08_11_13_42 (siehe unten). Zu Ihrer Information, ich habe eine Menge gesucht und KEIN anderer scheint das für Mac herausgefunden zu haben, also hoffe ich, dass ich die Anerkennung bekomme, dass ich der erste bin ... ;-)

Starten Sie zuerst den League-Client und melden Sie sich wie gewohnt an. Dann im 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]" 

Das hat bei mir funktioniert. Das einzige Problem besteht darin, dass die Lobby nach dem Betrachten des Spiels nicht ordnungsgemäß zurückgesetzt wird. Das Ereignis "Spiel ist beendet" scheint sich nicht ordnungsgemäß zu registrieren, wenn der Zuschauerkunden auf diese Weise gestartet wird. Also schließe ich einfach die App und starte den Relaunch ... aber so kann ich mir Spiele von Leuten ansehen, mit denen ich nicht "befreundet" bin.

Sie gewinnen heute das Internet. Ich kann nicht glauben, dass es nur eine Variable gibt, die den Relayunch von Argumenten verhindert. Neugierig, wie du es gefunden hast. Leider habe ich vor 2 Monaten mit League aufgehört: Es hat meine Kreativität zerstört und mir Schlaflosigkeit gebracht, aber das ist eine ausgezeichnete Arbeit. Alex Popov vor 9 Jahren 1
Ich schaute mir ein Spiel an, machte dann ein "ps -Ewww" und suchte nach dem Zuschauerprozessor. Das "-Ewww" gibt Ihnen die vollständigen Umgebungsvariablen für den Prozess. Ich entdeckte das "riot_launched = true" und stellte fest, dass dies relevant sein musste. :-) Oh, und ich verstehe total, was du damit meinst, dass League eine große Zeitsaugerin ist. Aber es macht auch Spaß. dossy vor 9 Jahren 0
Ich kann mir nicht vorstellen, dass einer von euch dies in letzter Zeit noch einmal besucht hat, oder? Ich habe versucht, die obige Version zu ersetzen und stürzt mit einem "Busfehler" ab. pcg79 vor 9 Jahren 0
Nevermind, ich bin ein Dummy und muss einen Tippfehler gehabt haben. Funktioniert hervorragend, wenn Sie 0.0.0.131 durch 0.0.0.141 ersetzen. Vielen Dank! pcg79 vor 9 Jahren 0
Für jeden, der das findet, stellt sich heraus, dass ich keinen Tippfehler hatte. Ich dachte nur, CD'ing in das MacOS-Verzeichnis sei optional. Es ist nicht. pcg79 vor 9 Jahren 1