版本握手
基本信息
| 属性 | 值 |
|---|---|
| 处理器 | @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)的判定流程:
- 取出对端报告的
cubicchunks版本;若对端完全没有该模组,仅允许"服务器端无 CC、客户端有 CC"以外的组合——即return !remoteSide.isClient()(CubicChunks.java:211-212),注释写明 “don’t allow client without CC to connect” - 双方版本字符串格式都无法识别时直接放行(
:214-218) - 用
ArtifactVersion比较新旧:本方更旧则放行,把决定权交给较新的一方(:221-226) - 否则按对端是客户端还是服务端,套用
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) |
相关条目
- CubicChunks 网络通道 - 握手通过后使用的 8 个封包