TileMarker / TilePathMarker
事实基准:
/Users/evlos/a/mirror/BuildCraft(master,minecraftVersion = 1.7.10)逐行读源码。 两类合并成篇:TilePathMarker extends TileMarker。
注册信息(集合运算:2 个注册类)
| TileEntity 注册名 | 注册类 | 所属 modid | 注册处 |
|---|---|---|---|
Marker |
buildcraft.core.TileMarker |
BuildCraft|Builders |
BuildCraftBuilders.java:628 |
net.minecraft.src.builders.TilePathMarker |
buildcraft.core.TilePathMarker |
BuildCraft|Builders |
BuildCraftBuilders.java:632 |
⚠️ 两个类都在 buildcraft.core 包,但注册发生在 BuildCraft|Builders 模块(BuildCraftBuilders.java)。
按包名 core 归到 BuildCraft|Core 是错的。
关联方块:Marker 方块(markerBlock)与
Path Marker 方块(pathMarkerBlock)。
槽位数量与布局
两者都没有物品槽位。Marker 系是纯「坐标标记」,不实现 IInventory。
区域数据结构(这是 Marker 的全部内容)
core/TileMarker.java 内定义两个嵌套静态类:
| 类 | 行 | 内容 |
|---|---|---|
TileMarker.TileWrapper |
:26-86 |
单个坐标三元组 |
TileMarker.Origin |
:88-… |
区域定义 |
TileWrapper(core/TileMarker.java:26)
字段 public int x, y, z(:28)。哨兵值 = Integer.MAX_VALUE:
- 无参构造把三者设为
Integer.MAX_VALUE(:32-34) isSet()判定x != Integer.MAX_VALUE(:43-45)reset()重新设回Integer.MAX_VALUE(:63-65)
⚠️ 这是「未设置」哨兵,不是坐标值。写条目时不能把 Integer.MAX_VALUE 当作实际坐标。
Origin(core/TileMarker.java:88)
public TileWrapper vectO = new TileWrapper();
public TileWrapper[] vect = { new TileWrapper(), new TileWrapper(), new TileWrapper() };
即 1 个原点 + 3 个方向向量端点 = 4 个 TileWrapper(:90-91),
外加 6 个已解析的绝对边界(:92):
public int xMin, yMin, zMin, xMax, yMax, zMax;
| 字段 | 行 | 来源 |
|---|---|---|
vectO |
:90 |
原点坐标 |
vect[3] |
:91 |
X / Y / Z 三轴的向量端点 |
xMin, yMin, zMin, xMax, yMax, zMax |
:92 |
区域在三个轴上的绝对最小/最大坐标 |
isSet()(:94-97)代理到 vectO.isSet()。
⚠️ xMin 走 writeInt、yMin 与 yMax 走 writeShort(:104、:105、:108)——
Y 坐标是 16 位写入,X/Z 是 32 位。这意味着 Y 方向存在 32767 的上限,
是一个真实的实现限制(:311 起从 vectO 计算并回填这些边界)。
⚠️ 这三个向量是「轴向半长」,不是「对面角的绝对坐标」。
vect[0]/vect[1]/vect[2] 各表示 X / Y / Z 方向上从原点出发的长度,
所以 Marker 划出的是轴对齐长方体,真正的范围读 xMin..xMax 等 6 个字段。
⚠ 「多方块尺寸」是这套 wiki 头号易编造字段:BuildCraft 的 Marker 不是多方块结构, 没有「几 × 几 × 几」的面板拼接结构,也不可旋转——它标记的是一个体积区域, 尺寸由玩家放置的两个 Marker 之间的相对位置决定,源码里没有任何固定尺寸常量。 任何「Marker 是 7×7×7」之类的说法都是编造。
TilePathMarker 的额外状态
core/TilePathMarker.java:30:
public int x0, y0, z0, x1, y1, z1;
6 个 int:路径的起点三元组 + 终点三元组。
另有静态列表 availableMarkers(:28,ArrayList<TilePathMarker>)登记所有已放置的路径标记。
TilePathMarker 额外实现 IPathProvider(core/TilePathMarker.java:24 类声明),
供 Builder 沿路径移动。
接口
| 类 | 实现接口 | 源码 |
|---|---|---|
TileMarker |
ITileAreaProvider |
core/TileMarker.java:24 |
TilePathMarker |
IPathProvider |
core/TilePathMarker.java:24 |
GUI / Container
两者都没有 GUI,也没有 Container。
BuildersGuiHandler.getClientGuiElement(builders/BuildersGuiHandler.java:27-64)的分支只有
Architect / BlueprintLibrary / Builder / Filler,不含 Marker 与 PathMarker。
网络封包
TileWrapper 自身实现 ISerializable(core/TileMarker.java:26),带
readData(ByteBuf)(:69)与 writeData(ByteBuf)(:78);
Origin 也实现 ISerializable(:88),writeData(:99)按
「vectO → 遍历 vect 3 个 → 6 个 min/max」的顺序写,readData(:113)对应读回。
区域坐标是按 BuildCraft 自己的 ByteBuf 协议传的,不是 NBT。