版本握手

基本信息

属性 值
处理器 @NetworkCheckHandler checkCanConnectWithMods(Map<String,String>, Side)
来源 CubicChunks.java:208-210
客户端支持范围 [1.12.2-0.0.887.0,)
服务端支持范围 [1.12.2-0.0.887.0,)
版本正则 \d+\.\d+\.\d+\.\d+(-.+)?
调试开关 系统属性 cubicchunks.debug(CubicChunks.java:97-98)

功能

模组实现了 FML 的 @NetworkCheckHandler,在玩家进出服务器时决定是否放行。

checkCanConnectWithMods(Map<String,String> modVersions, Side remoteSide)(CubicChunks.java:209)的判定流程:

  1. 取出对端报告的 cubicchunks 版本;若对端完全没有该模组,仅允许"服务器端无 CC、客户端有 CC"以外的组合——即 return !remoteSide.isClient()(CubicChunks.java:211-212),注释写明 “don’t allow client without CC to connect”
  2. 双方版本字符串格式都无法识别时直接放行(:214-218)
  3. 用 ArtifactVersion 比较新旧:本方更旧则放行,把决定权交给较新的一方(:221-226)
  4. 否则按对端是客户端还是服务端,套用 SUPPORTED_CLIENT_VERSIONS / SUPPORTED_SERVER_VERSIONS(:226)

checkVersionFormat(String, Side)(:230-268)负责第 2 步:按第一个 - 切开 MC 版本与模组版本,若切不开(:232-239)或模组版本部分为空(:244-251),记录警告后放行(视为开发环境);模组版本部分不匹配四段式正则时同样放行(:256-266)。

⚠️ 关键点:握手对"陌生版本"一律放行。所有拒绝路径都要求版本字符串可解析且不匹配 SUPPORTED_*_VERSIONS 区间才会发生。

⚠️ 另需注意:这两个区间常量写的是 1.12.2 的版本号(CubicChunks.java:88-89),是上游遗留值,与本移植的 1.7.10 目标版本不一致。因为格式检查在前,1.7.10 玩家的 1.7.10-<modversion> 字符串在模组版本段不匹配四段式正则时会走"放行"分支,故该常量在本移植中实际不起拦截作用。

preInit 末尾还会重做一次 FML 的网络兼容检查,原因是该检查依赖配置而配置在 Forge 检查之后才完成(注释见 CubicChunks.java:150-151),实现为取回自身 NetworkModHolder 后调用 holder.testVanillaAcceptance()(:152-156)。

数值

数值名 值 来源
SUPPORTED_SERVER_VERSIONS [1.12.2-0.0.887.0,) CubicChunks.java:88
SUPPORTED_CLIENT_VERSIONS [1.12.2-0.0.887.0,) CubicChunks.java:89
模组版本正则 \d+\.\d+\.\d+\.\d+(-.+)? CubicChunks.java:254
切分分隔符 第一个 - CubicChunks.java:231

交互

触发 行为
客户端进服务器 交换版本表;对端无 CC 时按方向判定
双方版本均为开发环境格式 记录警告并放行
对端版本可解析但落在支持区间外 拒绝连接
本方版本比对方旧 放行,交由较新一方裁决
启动时 -Dcubicchunks.debug=true 启用调试日志(CubicChunks.java:97-98)

相关条目