背景:最后再做个总结
英雄联盟有一个观众模式,您可以在该模式下观看其他人的游戏(基本上是重播),延迟 3 分钟。 热门英雄联盟网站 OP.GG已经找到了一种巧妙的方法,在自己的服务器上托管这些观众游戏,从而使它们可重玩,而不是仅在游戏进行时可用(就像 Riot 所做的那样)。
如果你请求 OP.GG 重播,它会发送一个批处理文件,查找联盟所在的位置,然后奇迹就会发生:
@start "" "League of Legends.exe" "8394" "LoLLauncher.exe" "" "spectator fspectate.op.gg:4081 tjJbtRLQ/HMV7HuAxWV0XsXoRB4OmFBr 1391881421 NA1"
这在 Windows 上运行良好。我正在尝试让它在 Mac 上运行(它有一个官方客户端)。
首先,我尝试手动运行相同的命令(为了方便起见,分开运行)
/Applications/ ... /LeagueOfLegends.app/ ... /LeagueofLegends 8393 LoLLauncher \
/Applications/ ... /LolClient spectator fspectate.op.gg:4081 tjJbtRLQ/HMV7HuAxWV0XsXoRB4OmFBr 1391881421 NA1
但是,运行此程序只会启动 LoLLauncher,它会关闭所有活动的英雄联盟进程。如果我只是称呼/Applications/ ... /LeagueOfLegends.app/ ... /LeagueofLegends
接下来我尝试看看启动观众模式时实际发生了什么,所以我运行了,$ ps -axf | grep -i lol
结果显示
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
出于兴趣:
- 我无法
(LolClient)
通过其 PID 来杀死它。 UserKernel updateandrun lol_launcher LoLLauncher.app
首先启动。LoLLauncher
是由UserKernel
(从 PPID 中我们可以看出)启动的- 很长的命令(PID:24927)是如何启动观众模式的,并且还由 推出
UserKernel
。 - 旁观者模式的启动方式与 OP.GG .bat 完全相同,唯一的区别是旁观者模式连接到 Riot 而不是 OP.GG 的旁观服务器。
我尝试将 GDB 附加到 LolClient,但是由于它是一个 Adobe AIR 应用程序(并且我从未将 GDB 与我自己的代码以外的代码一起使用过),所以我无法从中获得任何有意义的东西。
接下来,我运行了dtruss -a -b 100m -f -p $PID
所有我能想到的程序: 、LolClient
和LolLauncher
,UserKernel
并浏览了生成的五十万行代码。我发现了用于获取游戏信息以供观看的 GET 请求之类的东西,但我看不到任何与英雄联盟.exe 相当的带有观看选项的启动。
最后,我跑去查看是否在此过程中打开了其他内容lsof | grep -i lol
,但没有找到任何合适的内容。打开的是,,,,,UserKernel
然后是,所有这些都是预期的。所有这些似乎都与弄清楚LolLauncher
LolClient
Adobe AIR
LeagueofLegends
Bugsplat
如何英雄联盟已开放观看模式。
显然能可以完成,因为 Spectator 模式可以从客户端内部访问。似乎可以从 CLI 完成,因为 Windows 可以做到这一点,并且客户端应该是平等的。除非我遗漏了 UNIX 和 Windows 处理 CLI 应用程序启动方式之间的差异。
我的问题是,我是否可以尝试其他方法来自己弄清楚如何启动观众模式。
总结:
尝试从 CLI 进入观察者模式。在 Windows 上可以这样做(参见第一个代码块),但在 Mac 上它只会重新启动 League。我还能尝试什么来查找进行了什么调用,以及如何重现它?
编辑 1:我找到了启动观察者模式的确切行(在 GDB 中)。这是dtruss
出现的一切为了那一步。
附言:请告诉我如何改进这个问题或其格式,我很想使用 StackOverflow/SuperUser,但正如本周播客(第 59 集)中的人所说,它非常令人生畏。抱歉第一次在 StackOverflow 上发布此内容 :(
答案1
我也想知道同样的问题,你离答案太近了……但是,这是答案,至少是针对 4.14.14_08_11_13_42(见下文)。仅供参考,我进行了大量搜索,似乎没有其他人为 Mac 找到答案,所以我希望我是第一个找到答案的人…… ;-)
首先,启动联盟客户端并正常登录。然后,在终端中:
$ 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]"
对我来说,这个方法很管用。唯一的问题是,观战结束后,大厅无法正常重置——以这种方式启动观战客户端时,“游戏已结束”事件似乎无法正常显示。因此,我只能关闭应用并重新启动……但至少这样,我可以观战那些不是“朋友”的人的比赛。
答案2
扩展 dossy 的答案,我创建了一个 bash 函数以使这变得容易:
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 & ) }
将其添加到您的终端后,每次打开新终端时~/.bash_profile
该功能将可用。spectator
我正在做一些通配符魔法,以便自动与未来版本兼容。
用法:
spectator [ip:port] [token] [number] [region]
要测试,请使用lolquickfind找到一个受欢迎的主播的现场比赛来观看。
(我在环境变量 + 通配符 + 带空格的目录方面遇到了一些问题。无论我如何转义空格,它似乎都不起作用。不过,使用通配符代替空格可以解决问题。)
干杯。