TileBlueprintLibrary
事实基准:
/Users/evlos/a/mirror/BuildCraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | net.minecraft.src.builders.TileBlueprintLibrary |
BuildCraftBuilders.java:633-634 |
| 注册类 | buildcraft.builders.TileBlueprintLibrary |
同上 |
| 所属 modid | BuildCraft|Builders |
BuildCraftBuilders.java:144 @Mod |
| 关联方块 | Library(注册变量 libraryBlock) |
BuildCraftBuilders.java:631 上下文 |
| 实现接口 | IInventory / ICommandReceiver |
builders/TileBlueprintLibrary.java:40 |
| 是否配置门控 | 否(无条件注册) | BuildCraftBuilders.java:634 |
槽位数量与布局
builders/TileBlueprintLibrary.java:45:
public SimpleInventory inv = new SimpleInventory(4, "Electronic Library", 1);
即 4 槽,单槽上限 1,内部名 "Electronic Library"。
| 槽位 | 用途 |
|---|---|
| 0–3 | 蓝图(每槽 1 张,可存 4 张) |
处理速率 / 耗时(两个独立常量,勿混)
builders/TileBlueprintLibrary.java:42-43:
private static final int PROGRESS_TIME = 100;
private static final int CHUNK_SIZE = 16384;
| 常量 | 值 | 含义 |
|---|---|---|
PROGRESS_TIME |
100 | 进度条上限 tick 数:updateEntity() 中 progressIn++ / progressOut++ 每 tick 一次,涨到 100 封顶(:204-211,条件 progressIn < PROGRESS_TIME) |
CHUNK_SIZE |
16384 | 单个传输分块的字节数(16 KiB) |
这两个数语义完全不同:PROGRESS_TIME 是 tick 计数、CHUNK_SIZE 是 字节。
蓝图大于 CHUNK_SIZE 时会被切成多块,源码的块数算法在 :287:
final int chunks = (bptData.length + CHUNK_SIZE - 1) / CHUNK_SIZE;
即向上取整;每块的起点 CHUNK_SIZE * chunk、长度 Math.min(CHUNK_SIZE, bptData.length - start)(:300-301)。
接收端按 CHUNK_SIZE * stream.readUnsignedShort() 分配缓冲(:345),偏移为 CHUNK_SIZE * 块序号(:347)。
蓝图库还要扫描区块以发现附近蓝图,该扫描步进同样以 CHUNK_SIZE 为界。
传输状态机
| 字段 | 含义 | 行 |
|---|---|---|
progressIn / progressOut |
上传 / 下载进度计数 | :47-48 |
uploadingPlayer / downloadingPlayer |
正在传输的玩家 | :54-55 |
blueprintDownloadId / blueprintDownload |
待写入的蓝图 id 与字节数组 | :57-58 |
selected |
当前选中条目索引,初值 -1(即「无选中」) | :52 |
entries |
蓝图条目列表 | :50 |
GUI / Container 配对
| GUI 类 | Container 类 | 配对处 |
|---|---|---|
buildcraft.builders.gui.GuiBlueprintLibrary |
buildcraft.builders.gui.ContainerBlueprintLibrary |
builders/BuildersGuiHandler.java:45 |
网络封包
有独立封包:TileBlueprintLibrary 实现 ICommandReceiver,
蓝图字节流通过 BuildCraft 的 NetworkUtils 通道传输(BC 主频道 + Builders 模块注册)。
这是少数真的按分块传大数据的方块实体。
源码缺陷
CHUNK_SIZE(:43)用的是字节语义,但传包时若未按整数倍切分,
大蓝图会在 blueprintDownload 数组上产生部分块;本条目不对其正确性下断言。