Software: League of Legends-Zuschauermodus über die Befehlszeile starten (Mac)

6

Hintergrund: 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 ansehen können. Die beliebte LoL-Website OP.GG hat eine clevere Methode gefunden, um diese Zuschauerspiele auf ihren eigenen Servern zu hosten, sodass sie nicht nur verfügbar sind, während das Spiel läuft (wie Riot es tut).

Wenn Sie eine Wiederholung von OP.GG anfordern, wird eine Batch-Datei gesendet, in der gesucht wird, wo sich die Liga befindet, und dann geschieht die Magie:

    @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 zum Laufen zu bringen (der einen offiziellen Client hat).

Zuerst habe ich versucht, den gleichen Befehl von Hand auszuführen (der Einfachheit halber aufgeteilt)

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

Wenn Sie dies ausführen, wird nur der LoLLauncher gestartet, der alle aktiven Ligaprozesse 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 mit der PID töten kann.
  • UserKernel updateandrun lol_launcher LoLLauncher.app wird zuerst gestartet.
  • LoLLauncherwird von der gestartet UserKernel(wie wir aus der PPID sehen können)
  • Mit dem sehr langen Befehl (PID: 24927) wird der Zuschauermodus gestartet und auch von UserKernel.
  • Der Zuschauermodus wird genau so gestartet, wie es der OP.GG .bat wollte, mit dem einzigen Unterschied, dass der Zuschauermodus eine Verbindung zu Riot anstelle des Zuschauerservers von OP.GG herstellt.

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

Als nächstes fuhr ich mit dtruss -a -b 100m -f -p $PIDallem, was mir einfiel, fort: dem LolClient, dem LolLauncherund dem UserKernelund überflog die eine halbe Million produzierten Linien. Ich fand Dinge wie die GET-Anfrage, mit der die Informationen des Spiels zum Zuschauen gebracht wurden, aber ich konnte keinen Start des Äquivalents von League of Legends.exe mit Zuschaueroptionen feststellen.

Schließlich rannte ich los, um lsof | grep -i lolzu sehen, ob noch etwas in dem Prozess geöffnet wurde, fand aber nichts Passendes. 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 für den Zuschauermodus geöffnet wurde.

Dies ist offensichtlich möglich, da der Zuschauermodus vom Client aus zugänglich ist. Es ist wahrscheinlich, dass dies über die CLI erfolgen kann, da Windows dies kann und die Clients gleichberechtigt sein sollen. Es sei denn, ich vermisse etwas im Unterschied zwischen dem Start von CLI-Anwendungen unter UNIX und Windows.

Meine Frage ist, ob es noch andere Dinge gibt, die ich versuchen kann, um herauszufinden, wie ich den Zuschauermodus selbst starten kann.

tl; dr:

Versucht, über die CLI in den Zuschauermodus zu gelangen. Es ist unter Windows möglich (siehe ersten Codeblock), startet aber nur League auf dem Mac neu. Was kann ich noch versuchen, um herauszufinden, welcher Anruf getätigt wird und wie er reproduziert wird?

EDIT 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 ihre Formatierung verbessern kann. Ich würde gerne StackOverflow / SuperUser verwenden, aber wie die Jungs im Podcast dieser Woche (Ep. 59) sagten, ist es sehr einschüchternd. Entschuldigen Sie, dass Sie dies zum ersten Mal auf StackOverflow gepostet haben :(

Alex Popov
quelle

Antworten:

2

Ich habe mich dasselbe gefragt, 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 ein paar Mal gesucht und niemand anderes scheint das für den Mac herausgefunden zu haben, also hoffe ich, dass ich als erster die Ehre bekomme ... ;-)

Starten Sie zunächst 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 ist, dass nach dem Zuschauen des Spiels die Lobby nicht richtig zurückgesetzt wird - das Ereignis "Spiel ist beendet" scheint nicht richtig registriert zu werden, wenn der Zuschauerclient auf diese Weise gestartet wird. Also schließe ich einfach die App und starte neu ... aber zumindest auf diese Weise kann ich Spiele von Leuten sehen, mit denen ich nicht "befreundet" bin.

dossy
quelle
1
Sie gewinnen heute das Internet. Ich kann nicht glauben, dass es nur eine Variable gibt, die einen Neustart verhindert, wenn Argumente übergeben werden. Neugierig, wie du es gefunden hast. Leider habe ich die Liga vor zwei Monaten verlassen: Es hat meine Kreativität zerstört und mir Schlaflosigkeit beschert, aber das ist eine hervorragende Arbeit.
Alex Popov
Ich habe ein Spiel angeschaut, dann ein "ps -Ewww" gemacht und nach dem Zuschauerprozessor gesucht. Das "-Ewww" gibt Ihnen die vollständigen Umgebungsvariablen für den Prozess. Ich entdeckte "riot_launched = true" und stellte fest, dass dies relevant sein musste. :-) Oh, und ich verstehe total, was du damit meinst, dass League ein riesiger Zeitvertreib ist. Aber es macht auch großen Spaß.
Dossy
Ich kann mir nicht vorstellen, dass einer von Ihnen dies in letzter Zeit wiederholt hat, oder? Ich habe oben versucht, die neueste Version zu ersetzen, und es stürzt mit einem "Busfehler" ab.
pcg79
Egal, ich bin ein Schnuller und muss einen Tippfehler gehabt haben. Funktioniert hervorragend als Ersatz 0.0.0.141für 0.0.0.131. Danke!
pcg79
1
Für alle anderen, die dies finden, stellte sich heraus, dass ich keinen Tippfehler hatte. Ich dachte nur, dass das Einspielen von CDs in das MacOS-Verzeichnis optional ist. Es ist nicht.
pcg79
3

Um die Antwort von Dossy zu erweitern, habe ich eine Bash-Funktion erstellt, um dies zu vereinfachen:

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 zu Ihrer hinzu, ~/.bash_profileund die spectatorFunktion steht bei jedem Öffnen eines neuen Terminals zur Verfügung.

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

Verwendungszweck:

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

Verwenden Sie zum Testen lolquickfind , um ein Live-Spiel eines beliebten Streamers zum Zuschauen zu finden.

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

Prost.

Eric Boehs
quelle
Exzellente Arbeit! Ich würde empfehlen, ein separates Skript zu erstellen, anstatt es in bash_profile abzulegen. Ich rief meine an spectate.shund lief ln -s /usr/local/bin/spectate, um es global verfügbar zu haben. Ich habe Ihren Code hier in ein Skript eingefügt
Alex Popov
Ich gehe davon aus, dass zukünftige Leser nicht technisch genug sind, um ein Skript auszuführen (da Sie sich im richtigen Verzeichnis befinden oder es in einem Verzeichnis ablegen müssen, das sich in Ihrem PATH befindet). Durch Kopieren / Einfügen eines Alias ​​in ~/.bash_profilewird der spectatorBefehl von überall aus ausgeführt. Ich denke, der Link funktioniert auch, wenn Sie das Skript an einem sicheren Ort aufbewahren, den Sie nicht löschen werden. Übrigens möchten Sie möglicherweise set -eIhr Skript erweitern, &&wenn ein Befehl fehlschlägt.
Eric Boehs