Crest Mount GUI

基本信息

属性 值
类型 GUI + 自定义网络包(CLIENT→SERVER)
GUI ID TinkersDefense.GUI_ITEM_INV = 0
触发条件 右键 CrestMount 方块(玩家不在 sneak)
容器 Container_CrestMount(4 TE 槽 + 玩家背包 3×9 + 9 快捷栏)
客户端类 Gui_CrestMount(GuiContainer)
纹理 tinkersdefense:textures/gui/crest_mount.png

行为

打开 CrestMount 的 GUI,进入 4 槽 IInventory:

  • TE 槽布局:Slot(TE, 0, 62,28)、Slot(1, 98,28)、Slot(2, 80,28)、Slot(3, 80,46)(菱形/十字对称)。
  • 每槽 getInventoryStackLimit() == 1(强行限制单件,是放 Crests / 勋章 / 装饰品的视觉面板)。
  • 玩家背包:3×9 主背包 + 9 快捷栏。
  • transferStackInSlot 返回 null(shift-click 行为未实现)。

GUI 顶部有 4 个 18×18 按钮,全部文字 “Flip”,位置:

  • 按钮 1: (guiLeft+61, guiTop+8)
  • 按钮 2: (guiLeft+79, guiTop+8)
  • 按钮 3: (guiLeft+97, guiTop+8)
  • 按钮 4: (guiLeft+79, guiTop+63)

点击按钮 → 翻转对应 inventory.flip[i-1],立即通过 TinkersDefense.INSTANCE.sendToServer(new Message_CrestMount(xCoord, yCoord, zCoord, flip)) 同步到服务端。

网络包

字段 值
Channel TinkersDefense.INSTANCE(SimpleNetworkWrapper,channel = tinkersdefense)
Discriminator 0
方向 CLIENT → SERVER
消息类 Message_CrestMount(x, y, z + boolean[4] flip)
Handler Handler_CrestMount

服务端在 Handler_CrestMount.onMessage 中:

TileEntity te = ctx.getServerHandler().playerEntity.worldObj
    .getTileEntity(message.x, message.y, message.z);
if (te instanceof TileEntity_CrestMount)
    ((TileEntity_CrestMount) te).flip = message.flip;

注意:服务端处理器未调 markDirty() 也未广播 markBlockForUpdate,因此客户端/服务端 flip 字段可能长期不一致(源码现状)。

TileEntity 通过标准 getDescriptionPacket/onDataPacket 把 inventory 与 flip 数据同步给客户端:

// 服务端
NBTTagCompound tag = new NBTTagCompound();
writeToNBT(tag);
return new S35PacketUpdateTileEntity(x, y, z, 0, tag);
// 客户端
readFromNBT(pkt.func_148857_g());

数值

数值 默认值
GUI ID 0
TE inventory 槽数 4
TE 槽 stackLimit 1
Flip 按钮数 4
按钮尺寸 18×18
玩家背包槽数 27(3×9)
玩家快捷栏槽数 9
网络包 discriminator 0
网络包方向 CLIENT → SERVER
NBT 字段(flip) flip_1, flip_2, flip_3, flip_4(boolean)

相关条目