GUI开发
代码示例
public void example_代码式创建GUI() {
//新建一个空的界面
GermGuiScreen germGuiScreen = GermGuiScreen.getGermGuiScreen("MyFirstGermGui");
//新建一个图片的实例
GermGuiTexture germGuiTexture = new GermGuiTexture("textureTest");
//这是他必要的一些参数
germGuiTexture.setPath("textures/gui/slot.png");
germGuiTexture.setHeight("20");
germGuiTexture.setWidth("20");
germGuiTexture.setLocationX("w*0.5");
germGuiTexture.setLocationY("h*0.5");
//将图片添加给GUI
germGuiScreen.addGuiPart(germGuiTexture);
//现在我们给 germGuiScreen 加个按钮
GermGuiButton germGuiButton = new GermGuiButton("buttonTest")
//这是一些必要的参数 哪些参数必要 可以去default里看
//这里与germGuiTexture不同 使用链式构造
.setDefaultPath("textures/gui/slot.png")
.setHoverPath("textures/misc/logo.png")
.setHeight("20")
.setWidth("20")
.setLocationX("w*0.5")
.setLocationY("h*0.5")
//与图片不同的事 germGuiButton 可以设置交互执行一段代码
//使用 GermGuiButtonEvent 事件一样能达到效果
.registerPlayerHandler(player -> player.sendMessage("我被点击了"), GermGuiButton.EventType.LEFT_CLICK);
//添加给界面
germGuiScreen.addGuiPart(germGuiButton);
//其实图片也可以加交互事件的~
//注意最后的 事件类型 是GermGuiScreen类里的哦
germGuiTexture.registerPlayerHandler(player -> player.sendMessage("我不是按钮也能交互"), GermGuiScreen.ClickType.SIDE_NEAR_CLICK);
//为玩家打开界面
germGuiScreen.openGui(Bukkit.getPlayer("test"));
//当玩家已经打开界面时 添加组件也是有效的
germGuiScreen.addGuiPart(germGuiTexture);
//当玩家已经打开界面时 删除组件也可以
germGuiScreen.removeGuiPart(germGuiTexture);
//当玩家已经打开界面时 调整组件参数也可以
germGuiTexture.setLocationY("10*2");
}
public void example_直接从配置中加载数据() {
//这里是要获得一个 YamlConfiguration实例 而且里面包含接下来要创建gui的配置
YamlConfiguration yamlConfiguration = YamlConfiguration.loadConfiguration(new File("germ"));
//从配置中直接加载所有属性到界面里
GermGuiScreen germGuiScreen = GermGuiScreen.getGermGuiScreen("shop3", yamlConfiguration);
//我们假设刚才从配置中加载进来一个 名为 scroll 的滚动框
//假如这是本次需要插入的商品
int size = 5;
//获得滚动框
GermGuiScroll scroll = (GermGuiScroll) germGuiScreen.getGuiPart("scroll");
//或者这么写
scroll = germGuiScreen.getGuiPart("scroll", GermGuiScroll.class);
if (size <= 8) {//因为滚动框是有一部分初始大小的 超过了初始大小的高度才需要滚动 我们假设商品数量小于8滚动框是不需要滚动的
//设置可滚动的距离为0
scroll.setScrollableV("0");
} else {
//大于8就也要改变滚动框可滚动的距离
int f = (size - 8) % 4; //一行能放四个商品 对4求余数
scroll.setScrollableV(f + "*50"); //每行加上 50 个可滚动像素 (应该不是50 我随便打的)
}
//开始往滚动框内插入数据
//新建一个要插入的物品槽
for (int i = 0; i < size; i++) {
//组件也可以直接根据一个默认配置加载后再修改其数据哦
//新建一个名字叫做 slot_i 的 GermGuiSlot 然后从配置文件里获取他的具体设置
GermGuiSlot germGuiSlot = new GermGuiSlot("slot_" + i).loadSrc("slot", ShopSettings.INSTANCE);
germGuiSlot.setItemStack(ItemUtil.getAir());//放入要卖的物品
germGuiSlot.setInteract(true);//取消掉互动 让玩家只能看这个槽位不能点击
//要调整他的位置 QAQ
germGuiSlot.setLocationX(1);
germGuiSlot.setLocationY(1);
GermGuiButton germGuiButton = new GermGuiButton("button_" + i).loadSrc("button", ShopSettings.INSTANCE);
germGuiButton.registerPlayerHandler(player -> player.sendMessage("666"), GermGuiButton.EventType.LEFT_CLICK);
germGuiButton.setLocationX(1);
germGuiButton.setLocationY(1);
scroll.addGuiPart(germGuiSlot);
scroll.addGuiPart(germGuiButton);
}
//可以打开啦!
germGuiScreen.openGui(Bukkit.getPlayer("abaaba"));
}
public void example_更多的回调() {
Player playerGermMC = Bukkit.getPlayer("GermMC");
GermGuiScreen germGuiScreen = GermGuiScreen.getGermGuiScreen("test_germplugin");
germGuiScreen.addGuiPart(new GermGuiTexture("test_color")
.setPath("textures/misc/translucent.png")
.setLocationX("w*0.2")
.setLocationY("h*0.2")
.setWidth("w*0.2")
.setHeight("h*0.3"));
//这里展示下支持的回调方式 你也可以根据 GermGuiClickEvent 事件监听
germGuiScreen.getGuiPart("test_color")
.registerPlayerHandler(clickPlayer -> clickPlayer.sendMessage("左键 test_color"), GermGuiScreen.ClickType.LEFT_CLICK)
.registerPlayerHandler(clickPlayer -> clickPlayer.sendMessage("左键松开 test_color"), GermGuiScreen.ClickType.LEFT_CLICK_RELEASE)
.registerPlayerHandler(clickPlayer -> clickPlayer.sendMessage("滚轮 test_color"), GermGuiScreen.ClickType.SCROLL_CLICK)
.registerPlayerHandler(clickPlayer -> clickPlayer.sendMessage("滚轮松开 test_color"), GermGuiScreen.ClickType.SCROLL_CLICK_RELEASE)
.registerPlayerHandler(clickPlayer -> clickPlayer.sendMessage("侧键1 test_color"), GermGuiScreen.ClickType.SIDE_NEAR_CLICK)
.registerPlayerHandler(clickPlayer -> clickPlayer.sendMessage("侧键1松开 test_color"), GermGuiScreen.ClickType.SIDE_NEAR_CLICK_RELEASE);
germGuiScreen.openGui(playerGermMC);
}
常见的问题
问:从配置文件加载数据的时候重载方法中 YamlConfiguration 与 ConfigurationSection 的区别
答:当是 YamlConfiguration 时,例如 GermGuiScreen 中的这个方法
/**
* @param indexName 界面配置在 yamlConfiguration 中的索引节点名 并且作为构建出来的界面名字
* @param yamlConfiguration Yaml实例
* @return 界面实例
*/
public static GermGuiScreen getGermGuiScreen(String indexName, YamlConfiguration yamlConfiguration) {
return getGermGuiScreen(indexName, indexName, yamlConfiguration);
}
这时候配置就需要是这样的
#索引节点名
example_gui:
#构建这个GUI所需要的真正节点1
example_part1:
type: 1
width: 99
height: 99
locationX: 99
locationY: 99
#构建这个GUI所需要的真正节点2
example_part2:
type: 1
width: 99
height: 99
locationX: 99
locationY: 99
当是 ConfigurationSection 时,例如 GermGuiScreen 中的这个方法
/**
* 直接将yml内的配置文件转化为界面
*
* @param guiName GUI的名字
* @param configurationSection 界面的配置
* @return 界面实例
*/
public static GermGuiScreen getGermGuiScreen(String guiName, ConfigurationSection configurationSection) {}
这时候配置的第一个节点就需要是构建这个界面需要的真正节点,前面没有其他节点
#构建这个GUI所需要的真正节点1
example_part:
type: 1
width: 99
height: 99
locationX: 99
locationY: 99
问:我想做一个带槽位交互的插件,我需要写槽位的储存吗
答:萌芽插件封装了数据储存,但是前提是槽位的identity属性字段以 germplugin_ 开头,这个玩家给这个槽位放入物品就会储存在数据库(sqlite、mysql)
然后不管任何情况下,只要槽位的identity相同,这个槽位都会显示这个物品出来。
例如HUD有上一个germplugin_skil_1的槽位,此时又给玩家打开了个界面,这个界面也有个germplugin_skil_1的槽位为了让玩家放技能进去,这个时候玩家放进去后HUD上的槽位就会同步显示了。
问:我想做个冷却显示。
答:手持物品输入/gp cooldown 可以测试冷却,相关API在 ItemUtil 类下
问:我想做个按键监听,监听不到想要的按键值
答:你得这么搞,先注册后才会监听到,注册是因为防止所有按键都发包通知服务端,浪费流量
public ExampleKey() {
GermKeyAPI.registerKey(KeyType.KEY_G);
}
@EventHandler
public void keyDown(GermKeyDownEvent event) {
if (event.getKeyID() == KeyType.KEY_G) {
}
}