Skip to content
On this page

替换第一个箱子界面

这篇教程会使用 ChaUI 自带示例,把一个三行箱子自动替换成自定义页面。你不需要修改箱子插件,也不需要让第三方插件调用 ChaUI API。

完成后,箱子中央第 14 格会映射为 ChaUI 按钮:物品图标、名称和 Lore 会自动显示;点击按钮仍然点击原版箱子的同一格,因此已有插件的库存点击逻辑可以继续工作。

开始前,请先完成服务端安装客户端安装制作第一个界面

第一步:找到内置页面

启动安装了新版 ChaUI 的服务器后,插件会在缺少文件时自动释放:

txt
plugins/ChaUI/pages/first_chest_replacement.yml

这个页面只匹配下面两个条件:

  • 箱子标题去掉颜色样式后等于 ChaUI First Chest
  • 箱子顶部区域正好有 3 行。

严格匹配可以避免教程页面意外替换其他商店、小游戏或锻造菜单。

第二步:准备测试箱子

准备一个单箱子,在铁砧中把箱子物品改名为 ChaUI First Chest,再把它放到世界中。单箱子顶部区域正好是 3 行。

打开箱子前,在第 2 行中央,也就是从左上角开始数的第 14 格放入一个物品。ChaUI 的槽位编号从 0 开始,因此这一格写作:

txt
container_13

为了观察名称映射,可以先给物品改名。若测试的是已有插件菜单,也可以直接让插件在这一格放入带名称和 Lore 的菜单物品。

第三步:打开箱子

右键打开刚才的箱子。匹配成功后,你会看到自定义深色面板,而不是原版箱子背景。

依次检查:

  1. 中央按钮左侧显示第 14 格的真实物品图标。
  2. 按钮文字与物品名称一致。
  3. 物品有 Lore 时,按钮下方会按原行顺序显示。
  4. 鼠标悬浮按钮时仍能看到原版完整物品提示。
  5. 点击按钮会操作第 14 格,而不是执行一套伪造的 ChaUI 物品逻辑。

普通箱子中,点击后会按原版规则拿起或放下物品。第三方菜单中,插件仍会收到原来的库存点击事件。

第四步:在编辑器中修改外观

通过页面编辑入口打开 first_chest_replacement。你可以移动背景、修改颜色、更换按钮素材,或增加更多绑定组件。

页面属性中的容器设置保持为:

属性
打开模式container
替换目标chest
标题模式exact
标题内容ChaUI First Chest
箱子行数3
优先级100

选中 menu_button 后,可以看到它的“容器绑定”为 container_13。“容器提示”保持开启,鼠标悬浮时就会显示原版物品提示。

保存后关闭并重新打开箱子。容器页面会使用新配置重新匹配和显示。

完整页面配置

下面是本教程使用的完整页面。也可以直接下载第一个箱子替换示例

yaml
id: first_chest_replacement
version: 1
title: 第一个箱子替换示例
size:
  width: window.width
  height: window.height
coordinateMode: absolute
display:
  mode: container
  container:
    target: chest
    title:
      mode: exact
      value: ChaUI First Chest
    rows:
      - 3
    priority: 100
elements:
  - id: panel
    type: rect
    visible: true
    enabled: false
    pointerEvents: block
    opacity: 0.92
    z: 0
    layout:
      x: window.width * 0.5 - 120
      y: window.height * 0.5 - 65
      width: 240
      height: 130
    rect:
      color: '#151A24'
  - id: title
    type: text
    visible: true
    enabled: false
    pointerEvents: pass
    z: 1
    layout:
      x: window.width * 0.5 - 105
      y: window.height * 0.5 - 52
      width: 210
      height: 14
    text:
      value: 第一个箱子替换界面
      textSize: 1.0
      textLineLength: 24
      align: center
  - id: menu_button_back
    type: rect
    visible: true
    enabled: false
    pointerEvents: pass
    z: 1
    layout:
      x: window.width * 0.5 - 70
      y: window.height * 0.5 - 20
      width: 140
      height: 30
    rect:
      color: '#334866'
  - id: menu_item
    type: item_display
    visible: true
    enabled: false
    pointerEvents: pass
    containerBinding: container_13
    z: 2
    layout:
      x: window.width * 0.5 - 62
      y: window.height * 0.5 - 13
      width: 18
      height: 18
    itemDisplay: {}
  - id: menu_button
    type: button
    visible: true
    enabled: true
    pointerEvents: auto
    containerBinding: container_13
    containerTooltip: true
    z: 3
    layout:
      x: window.width * 0.5 - 70
      y: window.height * 0.5 - 20
      width: 140
      height: 30
    button:
      label: '{vals.container.components.menu_button.name}'
      textSize: 0.9
      textX: 12
      textY: 0
      textLineLength: 20
      align: center
  - id: menu_lore
    type: text
    visible: true
    enabled: false
    pointerEvents: pass
    containerBinding: container_13
    z: 2
    layout:
      x: window.width * 0.5 - 100
      y: window.height * 0.5 + 22
      width: 200
      height: 32
    text:
      value: '{vals.container.components.menu_lore.loreText}'
      textSize: 0.75
      textLineLength: 34
      align: center

为什么第三方插件不需要接入

ChaUI 只替换原版界面的绘制与命中区域。真实物品、鼠标光标、槽位同步和库存事件仍由当前原版容器负责。按钮点击最终回到 container_13,已有插件看到的仍是对原菜单槽位的点击。

下一步请阅读认识自动替换。那里会继续讲标题匹配、玩家背包、完整槽位交互、脚本动态改绑和冲突回退。

常见问题

打开后还是原版箱子

先确认箱子是单箱子、标题大小写完全等于 ChaUI First Chest,并确认客户端与服务端使用相同协议版本。双箱子有 6 行,不符合教程的 3 行限制。

按钮没有名称或图标

确认物品放在第 14 格,而不是按人类习惯误写成第 13 格。container_13 的数字从 0 开始。

点击后插件没有反应

确认插件原菜单确实监听的是这一格,并检查 menu_button 仍为启用、pointerEventsautocontainerBindingcontainer_13