使用萌芽Yaml模板联动插件创建简单萌芽商店
你需要符合以下条件才可以看得懂此页面! 1.你需要理解并明白上一章所讲解的代码式创建GUI简单商店 2. 拥有良好的Java基础 3. 拥有良好的Bukkit编程基础
接上篇 我们使用代码式GUI制作了简单的萌芽界面商店。
我们发现他实在是太丑了,我们一点一点调试代码中的 魔数 来调整GUI,确实太麻烦了,我们修改一次,就要重启加载一次插件。那么我们现在来学习一下如何使用 萌芽Yaml模板 进行创建我们的简单萌芽GUI商店。
我们使用萌芽插件编写GUI的时候 可以将 萌芽Yaml界面 中 options 选项中的 guide 设置为 true,这样我们就可以在Minecraft游戏中使用 /gp open <玩家 ID> <界面名称> 打开页面以后,使用鼠标指针对各个组件进行拖动。
OK,我们已经在Minecraft中使用该操作调整好了页面,我们发现他比以前看起来要舒服。

那么如何使用插件引入该萌芽Yaml页面进行操作呢?
具体示例代码如下 我们首先约定 该商店只有两个商品 一个为 神奇玻璃 一个为 神奇工作台 分别对应我们 在我们所编写的插件 yaml config.yml 中配置的 test-sell1 和 test-sell2 。
本篇教程以学会使用萌芽Yaml模板联动为目的,插件逻辑可能比较简单 ,大家学会后可以自由发挥。
/**
* 以模板打开萌芽商店界面
* @param player 玩家
* @param templateName 模板名称
*/
public static void openGuiPlayerByTemplate(Player player, String templateName) {
// 从我们的 插件文件夹 中的 templates文件夹 中获取模板
File templateFile = new File(GermLearnPlugin.getInstance().getDataFolder(), "templates/" + templateName + ".yml");
// 简单判不存在
if(!templateFile.exists()) {
player.sendMessage("§c模板不存在!");
return;
}
// 加载模板 Yaml
YamlConfiguration templateYaml = YamlConfiguration.loadConfiguration(templateFile);
// 将 模板Yaml 直接转换为 萌芽Screen
GermGuiScreen screen = GermGuiScreen.getGermGuiScreen("演示商店", templateYaml);
// 将我们缓存中所有的商店物品名字转换为列表 以便于我们使用下标获取
List array = new ArrayList<>(SellItemManager.getInstance().getAllSellItemName());
// 我们有两个商品
for (int i = 0; i < 2; i ++) {
// 通过我们 模板Yaml 中定义的组件名 获取对应的萌芽界面中的组件 以便于我们进行操作
String germSlotName = "shop_slot_" + i;
String germLabelName = "shop_label_" + i;
String germButtonName = "shop_button_" + i;
// 通过渲染下标 获取我们本次要渲染的出售物品
String sellItemName = array.get(i);
// 获取渲染的出售物品 获取数据
SellItemManager.SellItem sellItem = SellItemManager.getInstance().getSellItemByName(sellItemName);
// 使用组件名字获取对应的组件
GermGuiSlot slot = (GermGuiSlot) screen.getGuiPart(germSlotName);
GermGuiLabel label = (GermGuiLabel) screen.getGuiPart(germLabelName);
GermGuiButton buyButton = (GermGuiButton) screen.getGuiPart(germButtonName);
// 设置对应数据 因为我们已经在模板中规定了各组件大小以及位置所以我们只需要设置我们需要的数据即可
slot.setItemStack(sellItem.getShowItem().clone());
label.setText(sellItem.getName());
// 购买逻辑 函数式编程
// 接上篇注释
// 我们向萌芽按钮注册了一个左键点击事件的监听器
// 使用了 Java 函数式编程 lambda 表达式
// 此处的 clickPlayer 是 点击的玩家的实例
// 此处的 btn 是 点击的萌芽按钮的实例
buyButton.registerCallbackHandler((clickPlayer, btn) -> {
// 判断玩家是否有足够的钱
if (!VaultUtils.getEconomy().hasMoney(clickPlayer, sellItem.getPrice())) {
clickPlayer.sendMessage("§c你没有足够的钱, 需要 " + sellItem.getPrice());
return;
}
// 扣除钱
VaultUtils.getEconomy().takeMoney(clickPlayer, sellItem.getPrice());
clickPlayer.sendMessage("§a你已成功购买");
// 将我们出售的物品给予他
PlayerUtils.giveItem(clickPlayer, sellItem.getShowItem().clone());
// 如果我们想实现按钮只可以在本次页面点一次我们就可以在这里设置btn的属性 萌芽会自动更新
// 执行以下代码即可
// btn.setEnable(false);
}, GermGuiButton.EventType.LEFT_CLICK);
// 注意!
// 至此我们已经完成了所有的处理 我们不需要再往screen添加组件 当组件更新时 萌芽会自动帮我们重新渲染
}
// 向玩家渲染界面
screen.openGui(player);
}
至此 我们已经完成了我们的渲染 我们再注册一个 openTemplate 的指令 用于我们的模板商店打开 代码就不贴了 跟上节一样。
打开Minecraft进行调试 并且在插件文件夹中的 templates 文件夹中 放入 我们的 演示模板.yml 并且将 "演示模板" 作为参数传入 openGuiPlayerByTemplate 方法 我们就可以得到如下界面。

通过点击测试我们也发现购买逻辑正常完成,至此本篇教程结束,你已经掌握了基本的 代码式创建GUI 以及 Yaml模板式创建GUI 的方法。
教程所使用的模板Yaml代码
演示商店:
options:
guide: false
interactiveHud: false
dropCursorItem: false
escCloseOnly: false
topperHud: false
consume: true
escCancel: false
dragSwallow: true
背景贴图:
width: h/870*870
height: h/519*450
type: 0
path: local<->textures/learn/bg.png
locationX: w*0.2
locationY: h*0.05
shop_slot_0:
locationX: 0.337*w
locationY: 0.213*h
locationZ: '10'
type: 5
identity: shop_slot_0
interactCooldown: 100
shop_label_0:
align: left
texts:
- '&c商品名字1'
fontSize: 0
stroke: 0.0
strokeColor: -16777215
shadow: false
type: 4
scale: '1'
locationX: 0.314*w
locationY: 0.314*h
locationZ: '10'
shop_button_0:
invalid: false
strokeColor: -16777215
font: minecraft
hoverFontSize: 0
type: 3
hoverPath: local<->textures/learn/btnh.png
texts:
- 购买
clickSound: none
defaultPath: local<->textures/learn/btn.png
hoverSound: none
hoverTextShadow: true
textShadow: true
align: center
hoverStroke: 0.0
hoverStrokeColor: -16777215
locationX: 0.263*w
locationY: 0.390*h
locationZ: '10'
width: '80'
fontSize: 0
stroke: 0.0
height: '20'
shop_slot_1:
locationX: 0.573*w
locationY: 0.213*h
locationZ: '10'
type: 5
identity: shop_slot_1
interactCooldown: 100
shop_label_1:
align: left
texts:
- '&c商品名字2'
fontSize: 0
stroke: 0.0
strokeColor: -16777215
shadow: false
type: 4
scale: '1'
locationX: 0.543*w
locationY: 0.314*h
locationZ: '10'
shop_button_1:
invalid: false
strokeColor: -16777215
font: minecraft
hoverFontSize: 0
type: 3
hoverPath: local<->textures/learn/btnh.png
texts:
- 购买
clickSound: none
defaultPath: local<->textures/learn/btn.png
hoverSound: none
hoverTextShadow: true
textShadow: true
align: center
hoverStroke: 0.0
hoverStrokeColor: -16777215
locationX: 0.500*w
locationY: 0.390*h
locationZ: '10'
width: '80'
fontSize: 0
stroke: 0.0
height: '20'