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 lol
die 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.LoLLauncher
wird von der gestartetUserKernel
(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 $PID
allem, was mir einfiel, fort: dem LolClient
, dem LolLauncher
und dem UserKernel
und ü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 lol
zu sehen, ob noch etwas in dem Prozess geöffnet wurde, fand aber nichts Passendes. Offen waren UserKernel
, LolLauncher
, LolClient
, Adobe AIR
, LeagueofLegends
und 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 dtruss
aufgedreht 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 :(
quelle
0.0.0.141
für0.0.0.131
. Danke!Um die Antwort von Dossy zu erweitern, habe ich eine Bash-Funktion erstellt, um dies zu vereinfachen:
Fügen Sie dies zu Ihrer hinzu,
~/.bash_profile
und diespectator
Funktion 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:
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.
quelle
spectate.sh
und liefln -s /usr/local/bin/spectate
, um es global verfügbar zu haben. Ich habe Ihren Code hier in ein Skript eingefügt~/.bash_profile
wird derspectator
Befehl 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öglicherweiseset -e
Ihr Skript erweitern,&&
wenn ein Befehl fehlschlägt.