feat: 完善GUI工具

This commit is contained in:
2022-11-11 06:44:18 +08:00
parent 6ad3ca3148
commit 29a6e3247d
6 changed files with 165 additions and 46 deletions

View File

@@ -9,15 +9,13 @@ import cn.hamster3.mc.plugin.core.bukkit.hook.VaultAPI;
import cn.hamster3.mc.plugin.core.bukkit.listener.CallbackListener; import cn.hamster3.mc.plugin.core.bukkit.listener.CallbackListener;
import cn.hamster3.mc.plugin.core.bukkit.listener.DebugListener; import cn.hamster3.mc.plugin.core.bukkit.listener.DebugListener;
import cn.hamster3.mc.plugin.core.bukkit.page.listener.PageListener; import cn.hamster3.mc.plugin.core.bukkit.page.listener.PageListener;
import cn.hamster3.mc.plugin.core.bukkit.util.BukkitSerializeUtils; import cn.hamster3.mc.plugin.core.bukkit.util.ItemStackAdapter;
import cn.hamster3.mc.plugin.core.common.constant.CoreConstantObjects; import cn.hamster3.mc.plugin.core.common.constant.CoreConstantObjects;
import com.google.gson.*;
import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.lang.reflect.Type;
import java.util.logging.Logger; import java.util.logging.Logger;
public class HamsterCorePlugin extends JavaPlugin { public class HamsterCorePlugin extends JavaPlugin {
@@ -94,26 +92,3 @@ public class HamsterCorePlugin extends JavaPlugin {
} }
} }
class ItemStackAdapter implements JsonSerializer<ItemStack>, JsonDeserializer<ItemStack> {
public static final ItemStackAdapter INSTANCE = new ItemStackAdapter();
private ItemStackAdapter() {
}
@Override
public ItemStack deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonNull()) {
return null;
}
return BukkitSerializeUtils.deserializeItemStack(json.getAsString());
}
@Override
public JsonElement serialize(ItemStack src, Type typeOfSrc, JsonSerializationContext context) {
String s = BukkitSerializeUtils.serializeItemStack(src);
if (s == null) {
return JsonNull.INSTANCE;
}
return new JsonPrimitive(s);
}
}

View File

@@ -1,20 +1,5 @@
package cn.hamster3.mc.plugin.core.bukkit.page; package cn.hamster3.mc.plugin.core.bukkit.page;
import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public interface PageElement { public interface PageElement {
@NotNull
default ItemStack getDisplayItem(@NotNull HumanEntity player, @NotNull ItemStack defaultItem, @NotNull Map<String, String> pageVariables) {
return defaultItem.clone();
}
default Map<String, String> getVariables(@NotNull HumanEntity player, @NotNull Map<String, String> pageVariables) {
return pageVariables;
}
} }

View File

@@ -10,6 +10,7 @@ import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
@@ -106,10 +107,9 @@ public abstract class PageableHandler<E extends PageElement> extends FixedPageHa
E element = elements.get(elementIndex); E element = elements.get(elementIndex);
elementSlot.put(buttonIndex, element); elementSlot.put(buttonIndex, element);
ItemStack button = group.getButton(getElementButtonName(element)); String buttonName = getElementButtonName(element);
ItemStack displayItem = element.getDisplayItem(player, button == null ? EMPTY_STACK : button, variables); ItemStack buttonItem = group.getButton(buttonName);
initElementButton(element, displayItem, variables); initElementButton(buttonIndex, element, buttonItem, variables);
inventory.setItem(buttonIndex, displayItem);
} }
if (page == 0) { if (page == 0) {
@@ -122,7 +122,31 @@ public abstract class PageableHandler<E extends PageElement> extends FixedPageHa
} }
} }
public void initElementButton(@NotNull E element, @NotNull ItemStack displayItem, @NotNull Map<String, String> variables) { public void initElementButton(int index, @NotNull E element, @NotNull ItemStack stack, @NotNull Map<String, String> variables) {
ItemMeta meta = stack.getItemMeta();
if (meta == null) {
return;
}
if (meta.hasDisplayName()) {
String displayName = meta.getDisplayName();
for (Map.Entry<String, String> entry : variables.entrySet()) {
displayName = displayName.replace(entry.getKey(), entry.getValue());
}
meta.setDisplayName(displayName);
}
List<String> lore = meta.getLore();
if (lore != null) {
for (int i = 0; i < lore.size(); i++) {
String s = lore.get(i);
for (Map.Entry<String, String> entry : variables.entrySet()) {
s = s.replace(entry.getKey(), entry.getValue());
}
lore.set(i, s);
}
meta.setLore(lore);
}
stack.setItemMeta(meta);
inventory.setItem(index, stack);
} }
public void showPreviewPage() { public void showPreviewPage() {

View File

@@ -0,0 +1,30 @@
package cn.hamster3.mc.plugin.core.bukkit.util;
import com.google.gson.*;
import org.bukkit.inventory.ItemStack;
import java.lang.reflect.Type;
public class ItemStackAdapter implements JsonSerializer<ItemStack>, JsonDeserializer<ItemStack> {
public static final ItemStackAdapter INSTANCE = new ItemStackAdapter();
private ItemStackAdapter() {
}
@Override
public ItemStack deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonNull()) {
return null;
}
return BukkitSerializeUtils.deserializeItemStack(json.getAsString());
}
@Override
public JsonElement serialize(ItemStack src, Type typeOfSrc, JsonSerializationContext context) {
String s = BukkitSerializeUtils.serializeItemStack(src);
if (s == null) {
return JsonNull.INSTANCE;
}
return new JsonPrimitive(s);
}
}

View File

@@ -0,0 +1,57 @@
title: "&c固定页面"
graphic:
- "####!####"
- "# 1 2 3 #"
- "#########"
groups:
default:
'#': "barrier"
'1': "accept"
'2': "deny"
'3': "close"
'!': "info"
sounds:
"default": "UI_BUTTON_CLICK"
"accept": "ENTITY_PLAYER_LEVELUP"
"deny": "BLOCK_ANVIL_HIT"
buttons:
'barrier':
==: org.bukkit.inventory.ItemStack
type: STAINED_GLASS_PANE
damage: 4
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: "§c屏障"
'accept':
==: org.bukkit.inventory.ItemStack
type: ARROW
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: "§a同意"
'deny':
==: org.bukkit.inventory.ItemStack
type: BARRIER
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: "§c拒绝"
'close':
==: org.bukkit.inventory.ItemStack
type: REDSTONE
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: "§c关闭"
'info':
==: org.bukkit.inventory.ItemStack
type: REDSTONE
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: "§c页面信息展示"

View File

@@ -0,0 +1,48 @@
title: "&c分页页面"
graphic:
- "#########"
- "# #"
- "# 11111 #"
- "# 11111 #"
- "# #"
- "<#######>"
groups:
default:
'#': "barrier"
'1': "element"
sounds:
"default": "UI_BUTTON_CLICK"
buttons:
'barrier':
==: org.bukkit.inventory.ItemStack
type: STAINED_GLASS_PANE
damage: 4
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: "§c屏障"
'preview':
==: org.bukkit.inventory.ItemStack
type: REDSTONE
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: "§c上一页"
'next':
==: org.bukkit.inventory.ItemStack
type: ARROW
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: "§a下一页"
'element':
==: org.bukkit.inventory.ItemStack
type: ARROW
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: "§a玩家信息"