LinView 占位符用于在渲染时把会话状态或动态行数据写入界面文本。其语法为 {命名空间.键}。
当前内建命名空间包括:
state.*:当前 GuiSession 的共享状态。row.*:当前动态槽位绑定的 GuiRow.data()。player.name、player.uuid、player.world:当前 Bukkit 玩家信息。view.id:当前视图 ID。area.id:当前动态区 ID。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 提供的原始值类型。
当前会执行占位符替换的字段包括:
title:可使用 state.*、player.* 与 view.id。icon.key:静态控件可使用会话、玩家、视图和控件命名空间;动态模板还可使用 row.* 与 area.id。icon.name:规则同上。icon.lore:规则同上。icon.meta 中 Map 或 List 内的字符串。action.args 中 Map 或 List 内的字符串。action.refresh。source.args 中 Map 或 List 内的字符串;此时可使用会话、玩家、视图和区域命名空间。variants.when:由表达式求值器读取 row 与 state。当前不会替换:
id、type、rows、layout、areaChar。icon.kind 与 icon.amount。占位符替换只改变字符串内容,不会把结果自动转换为数字或布尔值。需要保留原始值类型时,应从 ctx.state() 或 ctx.row().data() 读取。
当前 Core 不会解析以下外部内容:
需要这些值时,应先在业务代码中得到实际文本,再写入 state 或 row:
lin.linView().open(player, "demo.profile", state -> {
state.put("playerName", player.getName());
state.put("playerUuid", player.getUniqueId().toString());
});
title: "§f{state.playerName} 的资料"
占位符键支持字母、数字、下划线、点和连字符。state 与 row 中的嵌套 Map 会被递归展开,例如嵌套路径 row.product.price 对应 {row.product.price};Map 中原本就包含点号的键也可以直接使用。
{{ 会被输出为一个字面量 {。当前转义只处理左花括号;编写需要同时包含花括号的普通文本时,应通过 state 提供整段文本,避免与占位符语法混淆。
讨论