Snowbreak_ServerSwitcher

国际服兼容研究

研究人:LiuJiewenTT <liuljwtt@163.com>

2024-02-05:

通过比较%APPDATA%\..\Local\Game\Saved在启动国际服游戏本体前后的变化,可以确认以下信息:

  1. 国服国际服有分开,有自己的xg编号,但是分离没做清楚。
    1. 国服为xg_111111639
    2. 国际服为xg_111111680
  2. Logs作为运行日志出现变动可以理解。
  3. CrashReportClient暂且不管。
  4. Config\WindowsNoEditior出现大量变动,十分可疑。
    1. 其中,Engine.iniGame.ini出现了文件大小变化。
  5. PersistentDownloadDir中的User.settings时间戳被更新,内容未确认。
  6. SaveGames中新增XGSDK_SAVE_GAME.sav

此外,如果切回国服发现要重新下载资源,但是明明文件都在,那可能是由于data\manifest.json内容缺失导致的。重新下载时,通过vscode观察此文件,可以发现为文件末尾一直在追加内容,而国际服目录的不会同步更新,可以确认是由于曾经尝试国际服启动器共用国服资源导致的内容列表数据丢失。所以data\manifest.json文件也是很重要的,注意备份。

此外再额外提一嘴,国服国际服的资源版本确实不太一样,在今日的实验中,在已经成功启动了最新版国际服的前提下,发现国服版本已经是1.5.0.143,然而国际服还是1.5.0.120

随后我成功启动了国服(B服),发现在排除Logs(日志)和CrashReportClient之后,发生变化的有:Config\WindowsNoEditor\Engine.ini(有文件大小变化)。

另外,由于再次进入时可能是未同意协议的状态,同意且登录后发现PersistentDownloadDir\目录下的startup.settingsUser.settings发生时间戳变化(未确认内容)。而Config\WindowsNoEditor变化如同after-2.txtafter-3.txt一般,其中出现文件大小变化的有:Game.iniInput.ini

由于此时暂未完成国际服登录,故暂时不能确认Config\WindowsNoEditor\Game.ini是否能被正常修改。而Config\WindowsNoEditor\Engine.ini想必是启动游戏但未登录就已经用到了,从上面的成功启动国际服游戏本体和成功启动国服(B服)游戏本体可以基本认为此文件不造成无法启动的冲突。

登录国际服后,SaveGamesXGSDK_LOGIN_USER.sav存在修改。注册过程会打开页面,对应的webcache下多出Visited Links,其下的Cache也有变化。此外就是xg_111111680出现改变,这个文件夹是属于国际服的文件夹,没什么好研究的。

综上,%APPDATA%\..\Local\Game\Saved在2024年已不存在冲突,国服国际服现今仍然不可以都安装在同一台电脑上属于谣言结论下早了。

现在已经不能登录国服了,看来%APPDATA%\..\Local\Game\Saved还是存在冲突的。

经测试知:SaveGames\XGSDK_LOGIN_USER.sav包含官服账号有关信息,但与B服无关。移除此文件会是官服需要重新登录账号,而B服不受影响。同时,移除此文件并不会改变“卡在’权限识别中’的问题”。

这是Conifg\WindowsNoEditor\Game.ini的内容:

[Distribution]
VoiceLanguage=Chinese
CheckLanguageTip=Set
xgsdk_language=zh-Hans

显然也没什么特别。

Config\WindowsNoEditor\Input.ini看起来全是键位绑定的信息。试过了,也不是它。

这是Config\CrashReportClient\*\CrashReportClient.ini的内容:

[CrashReportClient]
bHideLogFilesOption=false
bIsAllowedToCloseWithoutSending=true
CrashConfigPurgeDays=2

显然也没什么特别。

这是Config\WindowsNoEditor\Engine.ini的部分内容:

[Core.System]
Paths=../../../Engine/Content
Paths=%GAMEDIR%Content
Paths=../../../Game/Plugins/UnLua/Content
Paths=../../../Game/Plugins/GameEventSystem/Content
Paths=../../../Game/Plugins/GameTable/Content

看起来和加载组件有关,我试一下。文件的末尾有一个section只在运行时出现,退出就被删除。通过比较。奇怪的是通过官服重新生成的的文件中反而没了Paths=../../../Game/Plugins/AntiHook/Content,而是Paths=../../../Game/Plugins/CaptureTool/Content,此外还少了Paths=../../../Game/Plugins/Designer/TPS_Survivors/Content, Paths=../../../Game/Plugins/CaptureTool/ContentPaths=../../../Game/Plugins/XGSDKSeasun/Content。但是这个文件不解决问题。

这是PersistentDownloadDirstartup.settingsUser.settings的部分内容:

CheckSelectVoice	Check
Voice	1.0
Music	1.0
Sound	1.0
Master	1.0
LoginBgId	1
Login.CachedLoginServerID	3002

这个Login.CachedLoginServerID有点可疑,我试试。

KEY	VAL
PlayerSetting_2	[[6],[null,null,null,1,2,1,3,3,2,2,200,2,1,1,300,1,3],[0,8]]
GachaTip	1
PlayerSetting_7	[]
PlayerSetting_1	[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[1011.0],null,null,null,[1],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[50]]
PlayerSetting_3	[]
PlayerSetting_4	[]
PlayerSetting_6	[]
PlayerSetting_8	[]
TEAM_RULE_1.1.1.2011_10102	[[1,101002]]
TEAM_RULE_1.1.1.2011_10103	[[1,101002]]
TEAM_RULE_1.1.1.2011_10104	[[1,101002]]
NOTICE_SAVE_HEAD_804228300	1
NOTICE_SAVE_HEAD_-691779882	1
TEAM_RULE_1.1.1.2011_10105	[[1,101002]]
TEAM_RULE_1.1.1.2011_10106	[[1,101004]]
TEAM_RULE_1.1.1.2011_10107	[[1,101005]]
TEAM_RULE_1.1.1.2011_10108	[[1,101005]]
TEAM_RULE_1.1.1.2011_10109	[[1,101005]]
NOTICE_SAVE_HEAD_1729244809	1
NOTICE_SAVE_HEAD_1317675782	1
NOTICE_SAVE_HEAD_592556732	1

成功进去了!刚才是两个文件都移除了,现在试试仅移除startup.settings是否正常。在此之前,贴出新的内容:

CheckSelectVoice	Check
Sound	1.0
Master	1.0
Music	1.0
Voice	1.0
LoginBgId	1
KEY	VAL
PlayerSetting_2	[null,null,[0,1]]
GachaTip	1
Activity_15403473_22	0
Activity_15403473_24	0
Activity_15403473_20	0
Activity_15403473_23	0

那个可疑的Login.CachedLoginServerID消失了。突然想起来,国服是不需要选择服务器的,但是国际服是要选择区服的,我想这就是为什么会像是在尝试连接国际服服务器一样(就像国际服用魔法进不去的时候一样出现权限识别中)。可以推测,程序上没有给国服设定,或者说启动器自带一个服务器指针,但是如果文件中存在这个值,那就会改用文件中的服务器指针(ID)。至于为什么没有给国服作特判,想来是本来这么干的人就不多,另外也可能是预留未来增加国内区服或特别服务器的支持空间,这在编程的人员看来非常合适,反而加个特殊判定是不必要的。就像很多游戏不给转服一样,之所以还可以既上官服有上B服,大概正是因为没有在这里限定住写死。因为这个值除非不存在,且启动器有要求,否则是不会被修改的。故,依据此猜测,由于国服禁掉了选服功能,而国际服没有,所以国际服不会出问题,但国服就会出问题,因为那个修改服务器指针的功能被禁了!此外,那个选择初始服务器的逻辑,可能在于选服功能之外且允许被配置文件值覆盖,也可能在于设置初始服务器或切换到初始服务器的“初始化”函数/方法在换服功能中从而被顺带禁了。我写个可能的逻辑:

定义:选择的初始服务器。此时应当等于启动器要求的值,(或:也即传入的参数)。
如果文件有对应值,改为对应值。
根据参数,如果允许(或检测到多个可用服务器选项):
	调用选服功能,选服功能设定当前选择。选服功能会设定可用列表中的某一个为第二初始值(或者根本不会主动设第二初始值而默认空)。如果当前(函数外)值不在允许列表,则要求用户选择,完成服务器“指针/选项/柄”纠正。
若不被允许,则跳过。
继续运行,用户点击“开始游戏”,然后开始尝试连接服务器。

可以看到,在上面的逻辑中,“服务器选项纠正”这一逻辑被连带禁用,因为请求用户选择是被禁止的。

在思考这段逻辑的同时,我完成了测试,证明两文件仅需移除startup.settings即可恢复正常

综上,罪魁祸首为:PersistentDownloadDir\startup.settings文件中的Login.CachedLoginServerID选项。