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。

相关条目