Turret Base GUI

基本信息

属性 值
GUI 处理器 openmodularturrets.handler.GuiHandler implements IGuiHandler
注册方式 NetworkRegistry.INSTANCE.registerGuiHandler(this, gui)(ModularTurrets.java:65)
GUI ID 范围 1 – 7(ID 6 / 7 跨等级共用,其余按底座等级)
客户端 GUI 类 ConfigureGui、ExpanderInvGui、TurretBaseTierOneGui – TurretBaseTierFiveGui、TurretBaseAbstractGui
容器类 ConfigContainer、ExpanderInvContainer、TurretBaseContainer、TurretBaseTierOneContainer – TurretBaseTierFiveContainer
创造标签页 openmodularturrets.client.gui.ModularTurretsTab

GUI ID 对照

GuiHandler.getServerGuiElement 与 getClientGuiElement 用同一套 switch(GuiHandler.java:30-56 与 :59-84):

ID 客户端 GUI 服务器容器 触发方
1 TurretBaseTierOneGui TurretBaseTierOneContainer Tier 1 底座
2 TurretBaseTierTwoGui TurretBaseTierTwoContainer Tier 2 底座
3 TurretBaseTierThreeGui TurretBaseTierThreeContainer Tier 3 底座
4 TurretBaseTierFourGui TurretBaseTierFourContainer Tier 4 底座
5 TurretBaseTierFiveGui TurretBaseTierFiveContainer Tier 5 底座
6 ConfigureGui ConfigContainer 任意底座的配置面板
7 ExpanderInvGui ExpanderInvContainer 库存扩展器

底座 GUI 的 ID 由 player.openGui(ModularTurrets.instance, base.getBaseTier(), ...) 直接传入等级(BlockAbstractTurretBase.java:78)。

数值

底座容器槽位坐标

以 Tier 5 容器 TurretBaseTierFiveContainer.java:25-34 为准(5 个等级同构,Tier 1 无后两类):

槽位 构造 坐标
0 – 8(3×3 供弹) new Slot(tileEntity, x + y * 3, 8 + x * 18, 17 + y * 18) 左上 (8, 17),步距 18
9、10(附加件) new AddonSlot(tileEntity, 9, 72, 18) / new AddonSlot(tileEntity, 10, 92, 18) (72, 18) 与 (92, 18)
11、12(升级) new UpgradeSlot(tileEntity, 11, 72, 52) / new UpgradeSlot(tileEntity, 12, 92, 52) (72, 52) 与 (92, 52)
玩家背包 3×9 new Slot(inventoryPlayer, 9 + x + y * 9, 8 + x * 18, 84 + y * 18) 左上 (8, 84)
玩家快捷栏 new Slot(inventoryPlayer, x, 8 + x * 18, 142) 左上 (8, 142)

各等级的扩展槽:Tier 1 仅 3×3;Tier 2/3/4 为 3×3 + 2 附加件 + 1 升级(TurretBaseTierTwo/Three/FourContainer.java:31-33);Tier 5 为 3×3 + 2 附加件 + 2 升级(TurretBaseTierFiveContainer.java:31-34)。这与 getSizeInventory() 的 9 / 12 / 12 / 12 / 13 完全对应。

库存扩展器容器槽位(ID 7)

ExpanderInvContainer.java:23-34:

槽位 坐标
扩展器 3×3 (62 + j * 18, 17 + i * 18)
玩家背包 3×9 (8 + j * 18, 84 + i * 18)
玩家快捷栏 (8 + i * 18, 142)

ConfigureGui 按钮

ConfigureGui.initGui(ConfigureGui.java:65-104)创建 11 个按钮:

ID 位置 作用
1 (x+10, y+20, 155×20) 切换 Attack Mobs
2 (x+10, y+40, 155×20) 切换 Attack Neutrals
3 (x+10, y+60, 155×20) 切换 Attack Players
4 (x+114, y+98, 51×20) + 添加受信任玩家
5 (x+35, y+135, 30×20) - 移除受信任玩家
6 (x+10, y+135, 20×20) << 列表左翻
7 (x+145, y+135, 20×20) >> 列表右翻
8–10 三行各 100×20 受信任玩家的 canOpenGUI 等权限位
999 × 3 (x+70/93/116, y+135, 23×20) 三个 ? 帮助按钮

按钮文案前缀取自 ConfigureGui.java:54-56,Yes/No 分别用 §2 / §c 着色。

背景贴图:openmodularturrets:textures/gui/configure.png(ConfigureGui.java:411-416)。

权限校验:所有 actionPerformed 分支都先比对主人 UUID,失败时聊天栏输出 status.ownership(ConfigureGui.java:132,146,158,177)。

交互

触发 行为
右键底座 打开对应等级的底座 GUI(ID 1 – 5)
配置面板 通过 6 个网络封包改设置:切换三类目标各 1 个(MessageToggleAttackMobs / MessageToggleAttackNeutralMobs / MessageToggleAttackPlayers),添加/移除受信任玩家各 1 个(MessageAddTrustedPlayer / MessageRemoveTrustedPlayer),批量改权限 1 个(MessageModifyPermissions)
-Y 偏移 通过 MessageAdjustYAxisDetect 调整,范围 0 – 9
右键库存扩展器 打开 GUI ID 7

网络封包

NetworkingHandler.initNetworking(NetworkingHandler.java:24-93)在 SimpleNetworkWrapper(NetworkRegistry.INSTANCE.newSimpleChannel(ModInfo.ID),:22)上注册 12 个封包:

判别符 封包类 方向
0 MessageAddTrustedPlayer SERVER
1 MessageRemoveTrustedPlayer SERVER
2 MessageToggleAttackMobs SERVER
3 MessageToggleAttackNeutralMobs SERVER
4 MessageToggleAttackPlayers SERVER
5 MessageSetTurretOwner SERVER
7 MessageAdjustYAxisDetect SERVER
8 MessageDropTurrets SERVER
9 MessageDropBase SERVER
10 MessageModifyPermissions SERVER
11 MessageSetBaseTargetingType SERVER
12 MessageTurretBase CLIENT

11 个客户端→服务端封包,只有 MessageTurretBase 是服务端→客户端的状态同步(NetworkingHandler.java:88-92)。

判别符 6 缺号(已核实):源码中实际使用的判别符为 0–5、7–12,跳过 6(NetworkingHandler.java:29,35,41,47,53,59,65,71,74,79,85,91)。这不影响功能,但说明历史上曾有一个封包被移除。本条按源码原文记录。

MessageSetBaseTargetingType 的存在说明底座的目标类型除三个 MessageToggleAttack* 封包外,还有一条整体设置路径。

相关条目