正在载入

等待时间过长时请刷新页面

编写于

最近更新

占位符

LinView 占位符用于在渲染时把会话状态或动态行数据写入界面文本。其语法为 {命名空间.键}

当前内建命名空间包括:

  1. state.*:当前 GuiSession 的共享状态。
  2. row.*:当前动态槽位绑定的 GuiRow.data()
  3. player.nameplayer.uuidplayer.world:当前 Bukkit 玩家信息。
  4. view.id:当前视图 ID。
  5. area.id:当前动态区 ID。
  6. widget.uid:当前静态控件 UID。

未找到值时,占位符会保留原样,以便开发者发现错误键名。

状态

打开界面时可以初始化状态:

GuiSession session = lin.linView().open(player, "demo.shop", state -> {
    state.put("category", "food");
    state.put("page", 0);
});

资源文件随后可以使用:

title: "§f商店 - {state.category} - 第 {state.page} 页"

Hook 中可以读取和更新状态:

lin.linView().hook("shop.next", ctx -> {
    int page = ctx.state().integer("page", 0);
    ctx.state().put("page", page + 1);
    ctx.refresh();
});

GuiState 还提供 str(...)integer(...)bool(...) 便捷方法;取值不存在或转换失败时返回传入的默认值。

Source 或代码通过 GuiRow.data() 提供动态行数据:

GuiRow row = GuiRow.of(null, java.util.Map.of(
        "id", "apple",
        "material", "APPLE",
        "name", "苹果",
        "price", 10
));

动态模板中可以使用:

icon:
  kind: "vanilla"
  key: "{row.material}"
  name: "§f{row.name}"
  lore:
    - "§7价格:§e{row.price}"

action:
  type: "hook"
  args:
    hookId: "shop.buy"
    itemId: "{row.id}"
  refresh: ""

点击时,action.args 中的字符串占位符已经被替换:

lin.linView().hook("shop.buy", ctx -> {
    String itemId = String.valueOf(ctx.args().get("itemId"));
    Object originalId = ctx.row().data().get("id");
});

ctx.args() 适合读取资源文件声明的动作参数;ctx.row().data() 保留 Source 提供的原始值类型。

支持字段

当前会执行占位符替换的字段包括:

  1. title:可使用 state.*player.*view.id
  2. icon.key:静态控件可使用会话、玩家、视图和控件命名空间;动态模板还可使用 row.*area.id
  3. icon.name:规则同上。
  4. icon.lore:规则同上。
  5. icon.meta 中 Map 或 List 内的字符串。
  6. action.args 中 Map 或 List 内的字符串。
  7. action.refresh
  8. source.args 中 Map 或 List 内的字符串;此时可使用会话、玩家、视图和区域命名空间。
  9. variants.when:由表达式求值器读取 rowstate

当前不会替换:

  1. idtyperowslayoutareaChar
  2. icon.kindicon.amount

占位符替换只改变字符串内容,不会把结果自动转换为数字或布尔值。需要保留原始值类型时,应从 ctx.state()ctx.row().data() 读取。

外部占位符

当前 Core 不会解析以下外部内容:

  1. PlaceholderAPI 占位符。
  2. 语言文件键或全局前缀。

需要这些值时,应先在业务代码中得到实际文本,再写入 state 或 row:

lin.linView().open(player, "demo.profile", state -> {
    state.put("playerName", player.getName());
    state.put("playerUuid", player.getUniqueId().toString());
});
title: "§f{state.playerName} 的资料"

键名与转义

占位符键支持字母、数字、下划线、点和连字符。staterow 中的嵌套 Map 会被递归展开,例如嵌套路径 row.product.price 对应 {row.product.price};Map 中原本就包含点号的键也可以直接使用。

{{ 会被输出为一个字面量 {。当前转义只处理左花括号;编写需要同时包含花括号的普通文本时,应通过 state 提供整段文本,避免与占位符语法混淆。

讨论

请登录账号