SaveSection2D(二维存档区)
基本信息
| 属性 | 值 |
|---|---|
| 实现类 | cubicchunks.regionlib.impl.save.SaveSection2D |
| 继承 | SaveSection<SaveSection2D, EntryLocation2D> |
| key 类型 | EntryLocation2D(实现 IKey<EntryLocation2D>) |
| 每区域条目数 | ENTRIES_PER_REGION = (1 << 5) * (1 << 5) = 1024 |
| 区域文件名 | <regX>.<regZ>.2dr |
| 目录 | SaveCubeColumns.create() 里固定为 <directory>/region2d |
| 扇区大小 | 512(SimpleRegionFactory.createDefault(..., 512)) |
⚠️ 这不是一个 Minecraft 维度。 本 mod 没有
WorldProvider、没有DimensionType、没有registerDimension(见分类页的"本 mod 没有的内容")。这里的"2D"指存档数据空间是二维的(只有 X/Z 两个坐标轴,对应原版世界的"柱列 column"),与下界、末地这些游戏维度无关。归到dimension/只是因为它是本 mod 里唯一"多套坐标空间变体"的地方。
坐标 ↔ 区域 / id 的换算
public static final int LOC_BITS = 5; // 32
public static final int LOC_BITMASK = (1 << 5) - 1; // 31
public static final int ENTRIES_PER_REGION = 1024;
getRegionKey() → new RegionKey(regX + "." + regZ + ".2dr") // regX = entryX >> 5
getId() → ((entryX & 31) << 5) | (entryZ & 31)
| 性质 | 说明 |
|---|---|
equals |
比较 entryX 与 entryZ 两字段 |
hashCode |
31 * entryX + entryZ |
| 字段访问 | getEntryX() / getEntryZ() |
toString |
EntryLocation2D{entryX=…, entryZ=…} |
| 可变性 | 两个字段都是 final,类整体不可变(符合 IKey “should be immutable” 的约定) |
EntryLocation2D.Provider
IKeyProvider<EntryLocation2D> 的实现,作为 EntryLocation2D 的静态内部类。
| 方法 | 行为 |
|---|---|
getKeyCount(RegionKey) |
恒返回 ENTRIES_PER_REGION = 1024 |
isValid(RegionKey) |
key.getName().matches("-?\\d+\\.-?\\d+\\.2dr") |
fromRegionAndId(RegionKey, int) |
先 isValid 校验,不通过抛 IllegalArgumentException("Invalid name " + regionKey.getName());然后按 split("\\.") 拆出 [regX, regZ],relativeX = id >>> 5、relativeZ = id & 31,还原成 `new EntryLocation2D(regX << 5 |
构造与工厂
| 签名 | 说明 |
|---|---|
SaveSection2D(IRegionProvider<EntryLocation2D> regionProvider) |
单提供者(继承自 SaveSection) |
SaveSection2D(IRegionProvider<EntryLocation2D>... regionProvider) |
变参 → super(Arrays.asList(regionProvider)),多提供者回退链靠这个构造 |
static SaveSection2D createAt(Path directory) |
标准装配,见下 |
createAt(Path) 装的是两层回退(详见 多提供者回退链):
| 顺序 | IRegionProvider |
底层 IRegion |
存在判定 |
|---|---|---|---|
| 1 | SharedCachedRegionProvider(SimpleRegionFactory.createDefault(new EntryLocation2D.Provider(), directory, 512)) |
Region(512 B 扇区) |
Files.exists(directory.resolve(key.getName())) |
| 2 | SharedCachedRegionProvider(new SimpleRegionFactory<>(new EntryLocation2D.Provider(), directory, (kp, rk) -> new ExtRegion<>(directory, Collections.emptyList(), kp, rk), (kp, rk) -> Files.exists(directory.resolve(rk.getName() + ".ext")))) |
ExtRegion(.ext 目录) |
Files.exists(dir/<name>.ext) |
数据访问
SaveSection2D 自身没有覆写任何数据方法,全部来自 SaveSection:save(K, ByteBuffer) / save(Map) / load(K, boolean) / load(Collection, boolean) / allKeys(boolean) / allEntries(boolean) / hasEntry(K) / flush() / close()。
SaveCubeColumns 把它包装成对外入口:
| 方法 | 签名 |
|---|---|
| 单条写 | save2d(EntryLocation2D location, ByteBuffer data) |
| 批量写 | save2d(Map<EntryLocation2D, ByteBuffer> entries) |
| 单条读 | load(EntryLocation2D location, boolean createRegion) → Optional<ByteBuffer> |
| 批量读 | load2D(Collection<EntryLocation2D> positions, boolean createRegion) → BatchReadResult<EntryLocation2D> |
| 取本节 | getSaveSection2D() |
SaveCubeColumns上有两个同签名的load重载(一个收EntryLocation3D、一个收EntryLocation2D),靠实参静态类型区分;批量接口则必须用load2D/load3D这两个不同名字。
数值
| 数值 | 值 |
|---|---|
| 单区域条目数 | 1024 |
| 单条目字节上限 | 130556(255 扇区 × 512 − 4 字节长度前缀);超出自动落 .ext |
| 单区域扇区数 | 头表 1024 × 4 字节 = 4096 字节 = 8 扇区(entryMapSectors),开局即标记为已占用 |
相关条目
- 存档目录与文件命名 -
region2d/<X>.<Z>.2dr的来龙去脉 - 多提供者回退链
- 区域文件格式
- SaveSection3D - 同构的三维版本