mirror of
https://github.com/CarmJos/UltraDepository.git
synced 2024-09-19 19:55:45 +00:00
优化GUI物品读取方式,提高配置自由度
This commit is contained in:
parent
c71041cb13
commit
c5989e4a35
@ -10,9 +10,12 @@ gui:
|
|||||||
lines: 6
|
lines: 6
|
||||||
items:
|
items:
|
||||||
"CLOSE":
|
"CLOSE":
|
||||||
icon:
|
material: RED_STONE
|
||||||
==: org.bukkit.ItemStack
|
data: 0
|
||||||
slot: 0
|
slot: 0
|
||||||
|
name: "关闭界面"
|
||||||
|
lore:
|
||||||
|
- "点击后您将关闭本界面。"
|
||||||
actions:
|
actions:
|
||||||
- "[LEFT:CLOSE]"
|
- "[LEFT:CLOSE]"
|
||||||
- "[SHIFT_LEFT:CLOSE]"
|
- "[SHIFT_LEFT:CLOSE]"
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cc.carm.plugin.ultradepository;
|
package cc.carm.plugin.ultradepository;
|
||||||
|
|
||||||
|
import cc.carm.plugin.ultradepository.command.DepositoryCommand;
|
||||||
import cc.carm.plugin.ultradepository.configuration.PluginConfig;
|
import cc.carm.plugin.ultradepository.configuration.PluginConfig;
|
||||||
import cc.carm.plugin.ultradepository.hooker.PAPIExpansion;
|
import cc.carm.plugin.ultradepository.hooker.PAPIExpansion;
|
||||||
import cc.carm.plugin.ultradepository.listener.CollectListener;
|
import cc.carm.plugin.ultradepository.listener.CollectListener;
|
||||||
@ -81,7 +82,7 @@ public class Main extends JavaPlugin {
|
|||||||
regListener(new CollectListener());
|
regListener(new CollectListener());
|
||||||
|
|
||||||
log("注册指令...");
|
log("注册指令...");
|
||||||
|
registerCommand("UltraDepository", new DepositoryCommand(), new DepositoryCommand());
|
||||||
|
|
||||||
if (MessageUtil.hasPlaceholderAPI()) {
|
if (MessageUtil.hasPlaceholderAPI()) {
|
||||||
log("注册变量...");
|
log("注册变量...");
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
package cc.carm.plugin.ultradepository.command;
|
|
||||||
|
|
||||||
public class BackpackCommand {
|
|
||||||
}
|
|
@ -0,0 +1,40 @@
|
|||||||
|
package cc.carm.plugin.ultradepository.command;
|
||||||
|
|
||||||
|
import cc.carm.plugin.ultradepository.Main;
|
||||||
|
import cc.carm.plugin.ultradepository.configuration.depository.Depository;
|
||||||
|
import cc.carm.plugin.ultradepository.ui.DepositoryGUI;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.TabCompleter;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class DepositoryCommand implements CommandExecutor, TabCompleter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(
|
||||||
|
@NotNull CommandSender sender, @NotNull Command command,
|
||||||
|
@NotNull String alias, @NotNull String[] args) {
|
||||||
|
|
||||||
|
if (sender instanceof Player && args.length >= 1) {
|
||||||
|
Depository depository = Main.getDepositoryManager().getDepository(args[0]);
|
||||||
|
if (depository != null) DepositoryGUI.open((Player) sender, depository);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public List<String> onTabComplete(
|
||||||
|
@NotNull CommandSender sender, @NotNull Command command,
|
||||||
|
@NotNull String alias, @NotNull String[] args) {
|
||||||
|
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -88,7 +88,8 @@ public class Depository {
|
|||||||
for (String key : section.getKeys(false)) {
|
for (String key : section.getKeys(false)) {
|
||||||
ConfigurationSection itemSection = section.getConfigurationSection(key);
|
ConfigurationSection itemSection = section.getConfigurationSection(key);
|
||||||
if (itemSection != null) {
|
if (itemSection != null) {
|
||||||
items.put(key, DepositoryItem.readFrom(depository, key, itemSection));
|
DepositoryItem item = DepositoryItem.readFrom(depository, key, itemSection);
|
||||||
|
if (item != null) items.put(item.getTypeID(), item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return items;
|
return items;
|
||||||
|
@ -2,26 +2,26 @@ package cc.carm.plugin.ultradepository.configuration.gui;
|
|||||||
|
|
||||||
import cc.carm.plugin.ultradepository.util.ColorParser;
|
import cc.carm.plugin.ultradepository.util.ColorParser;
|
||||||
import cc.carm.plugin.ultradepository.util.gui.GUI;
|
import cc.carm.plugin.ultradepository.util.gui.GUI;
|
||||||
import cc.carm.plugin.ultradepository.util.gui.GUIItem;
|
|
||||||
import cc.carm.plugin.ultradepository.util.gui.GUIType;
|
import cc.carm.plugin.ultradepository.util.gui.GUIType;
|
||||||
import com.google.common.collect.ArrayListMultimap;
|
|
||||||
import com.google.common.collect.Multimap;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.inventory.ClickType;
|
import org.bukkit.event.inventory.ClickType;
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class GUIConfiguration {
|
public class GUIConfiguration {
|
||||||
|
|
||||||
String title;
|
String title;
|
||||||
int lines;
|
int lines;
|
||||||
|
|
||||||
Multimap<GUIItem, Integer> guiItems;
|
List<GUIItemConfiguration> guiItems;
|
||||||
|
|
||||||
public GUIConfiguration(String title, int lines, Multimap<GUIItem, Integer> guiItems) {
|
public GUIConfiguration(String title, int lines, List<GUIItemConfiguration> guiItems) {
|
||||||
this.title = title;
|
this.title = title;
|
||||||
this.lines = lines;
|
this.lines = lines;
|
||||||
this.guiItems = guiItems;
|
this.guiItems = guiItems;
|
||||||
@ -52,68 +52,31 @@ public class GUIConfiguration {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Multimap<GUIItem, Integer> getGuiItems() {
|
public List<GUIItemConfiguration> getGuiItems() {
|
||||||
return guiItems;
|
return guiItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setupItems(GUI gui) {
|
public void setupItems(Player player, GUI gui) {
|
||||||
getGuiItems().forEach((gui::setItem));
|
getGuiItems().forEach(itemConfiguration -> itemConfiguration.setupItems(player, gui));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static GUIConfiguration readConfiguration(@Nullable ConfigurationSection section) {
|
public static GUIConfiguration readConfiguration(@Nullable ConfigurationSection section) {
|
||||||
if (section == null) {
|
if (section == null) return new GUIConfiguration("name", 6, new ArrayList<>());
|
||||||
return new GUIConfiguration("name", 6, ArrayListMultimap.create());
|
|
||||||
}
|
|
||||||
String title = section.getString("title", "");
|
String title = section.getString("title", "");
|
||||||
int lines = section.getInt("lines", 6);
|
int lines = section.getInt("lines", 6);
|
||||||
Multimap<GUIItem, Integer> guiItemMap = ArrayListMultimap.create();
|
|
||||||
ConfigurationSection itemsSection = section.getConfigurationSection("items");
|
ConfigurationSection itemsSection = section.getConfigurationSection("items");
|
||||||
if (itemsSection != null) {
|
if (itemsSection == null) return new GUIConfiguration(title, lines, new ArrayList<>());
|
||||||
itemsSection.getKeys(false).stream()
|
|
||||||
.map(key -> readItem(itemsSection.getConfigurationSection(key)))
|
|
||||||
.filter(Objects::nonNull)
|
|
||||||
.forEach(entry -> guiItemMap.putAll(entry.getKey(), entry.getValue()));
|
|
||||||
|
|
||||||
}
|
return new GUIConfiguration(
|
||||||
return new GUIConfiguration(title, lines, guiItemMap);
|
title, lines, itemsSection.getKeys(false).stream()
|
||||||
|
.map(key -> GUIItemConfiguration.readFrom(itemsSection.getConfigurationSection(key)))
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private static AbstractMap.SimpleEntry<GUIItem, List<Integer>> readItem(@Nullable ConfigurationSection itemSection) {
|
|
||||||
if (itemSection == null) return null;
|
|
||||||
ItemStack icon = itemSection.getItemStack("icon", new ItemStack(Material.STONE));
|
|
||||||
List<Integer> slots = itemSection.getIntegerList("slots");
|
|
||||||
int slot = itemSection.getInt("slot", 0);
|
|
||||||
|
|
||||||
List<String> actionsString = itemSection.getStringList("actions");
|
|
||||||
List<GUIActionConfiguration> actions = new ArrayList<>();
|
|
||||||
for (String actionString : actionsString) {
|
|
||||||
int prefixStart = actionString.indexOf("[");
|
|
||||||
int prefixEnd = actionString.indexOf("]");
|
|
||||||
if (prefixStart < 0 || prefixEnd < 0) continue;
|
|
||||||
|
|
||||||
String prefix = actionString.substring(prefixStart + 1, prefixEnd);
|
|
||||||
ClickType clickType = null;
|
|
||||||
GUIActionType actionType;
|
|
||||||
if (prefix.contains(":")) {
|
|
||||||
String[] args = prefix.split(":");
|
|
||||||
clickType = readClickType(args[0]);
|
|
||||||
actionType = GUIActionType.readActionType(args[1]);
|
|
||||||
} else {
|
|
||||||
actionType = GUIActionType.readActionType(prefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actionType == null) continue;
|
|
||||||
actions.add(new GUIActionConfiguration(clickType, actionType, actionString.substring(prefixEnd + 1).trim()));
|
|
||||||
}
|
|
||||||
GUIItem item = new GUIItem(icon);
|
|
||||||
actions.stream().map(GUIActionConfiguration::toClickAction).forEach(item::addClickAction);
|
|
||||||
|
|
||||||
return new AbstractMap.SimpleEntry<>(item, slots.size() > 0 ? slots : Collections.singletonList(slot));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static ClickType readClickType(String type) {
|
public static ClickType readClickType(String type) {
|
||||||
return Arrays.stream(ClickType.values())
|
return Arrays.stream(ClickType.values())
|
||||||
.filter(click -> click.name().equalsIgnoreCase(type))
|
.filter(click -> click.name().equalsIgnoreCase(type))
|
||||||
|
@ -0,0 +1,91 @@
|
|||||||
|
package cc.carm.plugin.ultradepository.configuration.gui;
|
||||||
|
|
||||||
|
import cc.carm.plugin.ultradepository.util.ItemStackFactory;
|
||||||
|
import cc.carm.plugin.ultradepository.util.MessageUtil;
|
||||||
|
import cc.carm.plugin.ultradepository.util.gui.GUI;
|
||||||
|
import cc.carm.plugin.ultradepository.util.gui.GUIItem;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class GUIItemConfiguration {
|
||||||
|
|
||||||
|
Material material;
|
||||||
|
int data;
|
||||||
|
String name;
|
||||||
|
@NotNull List<String> lore;
|
||||||
|
|
||||||
|
@NotNull List<Integer> slots;
|
||||||
|
@NotNull List<GUIActionConfiguration> actions;
|
||||||
|
|
||||||
|
public GUIItemConfiguration(Material material, int data,
|
||||||
|
String name, @NotNull List<String> lore,
|
||||||
|
@NotNull List<GUIActionConfiguration> actions,
|
||||||
|
@NotNull List<Integer> slots) {
|
||||||
|
this.material = material;
|
||||||
|
this.data = data;
|
||||||
|
this.name = name;
|
||||||
|
this.lore = lore;
|
||||||
|
this.slots = slots;
|
||||||
|
this.actions = actions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setupItems(Player player, GUI gui) {
|
||||||
|
ItemStackFactory icon = new ItemStackFactory(this.material);
|
||||||
|
icon.setDurability(this.data);
|
||||||
|
if (this.name != null) icon.setDisplayName(this.name);
|
||||||
|
icon.setLore(MessageUtil.setPlaceholders(player, this.lore));
|
||||||
|
|
||||||
|
GUIItem item = new GUIItem(icon.toItemStack());
|
||||||
|
this.actions.stream().map(GUIActionConfiguration::toClickAction).forEach(item::addClickAction);
|
||||||
|
this.slots.forEach(slot -> gui.setItem(slot, item));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static GUIItemConfiguration readFrom(@Nullable ConfigurationSection itemSection) {
|
||||||
|
if (itemSection == null) return null;
|
||||||
|
Material material = Material.matchMaterial(itemSection.getString("material", "STONE"));
|
||||||
|
int data = itemSection.getInt("data", 0);
|
||||||
|
String name = itemSection.getString("name");
|
||||||
|
List<String> lore = itemSection.getStringList("lore");
|
||||||
|
|
||||||
|
List<Integer> slots = itemSection.getIntegerList("slots");
|
||||||
|
int slot = itemSection.getInt("slot", 0);
|
||||||
|
|
||||||
|
List<String> actionsString = itemSection.getStringList("actions");
|
||||||
|
List<GUIActionConfiguration> actions = new ArrayList<>();
|
||||||
|
for (String actionString : actionsString) {
|
||||||
|
int prefixStart = actionString.indexOf("[");
|
||||||
|
int prefixEnd = actionString.indexOf("]");
|
||||||
|
if (prefixStart < 0 || prefixEnd < 0) continue;
|
||||||
|
|
||||||
|
String prefix = actionString.substring(prefixStart + 1, prefixEnd);
|
||||||
|
ClickType clickType = null;
|
||||||
|
GUIActionType actionType;
|
||||||
|
if (prefix.contains(":")) {
|
||||||
|
String[] args = prefix.split(":");
|
||||||
|
clickType = GUIConfiguration.readClickType(args[0]);
|
||||||
|
actionType = GUIActionType.readActionType(args[1]);
|
||||||
|
} else {
|
||||||
|
actionType = GUIActionType.readActionType(prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (actionType == null) continue;
|
||||||
|
actions.add(new GUIActionConfiguration(clickType, actionType, actionString.substring(prefixEnd + 1).trim()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new GUIItemConfiguration(
|
||||||
|
material, data, name, lore, actions,
|
||||||
|
slots.size() > 0 ? slots : Collections.singletonList(slot)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -214,6 +214,7 @@ public class MySQLStorage implements DataStorage {
|
|||||||
if (contentsData == null) return null;
|
if (contentsData == null) return null;
|
||||||
JsonObject contentsObject = new JsonObject();
|
JsonObject contentsObject = new JsonObject();
|
||||||
contentsData.getContents().entrySet().stream()
|
contentsData.getContents().entrySet().stream()
|
||||||
|
// 只存取有数值的部分,减少数据量
|
||||||
.filter(entry -> entry.getValue().getSold() > 0 || entry.getValue().getAmount() > 0)
|
.filter(entry -> entry.getValue().getSold() > 0 || entry.getValue().getAmount() > 0)
|
||||||
.forEach(entry -> contentsObject.add(entry.getKey(), serializeItemData(entry.getValue())));
|
.forEach(entry -> contentsObject.add(entry.getKey(), serializeItemData(entry.getValue())));
|
||||||
return contentsObject;
|
return contentsObject;
|
||||||
|
@ -13,6 +13,7 @@ import cc.carm.plugin.ultradepository.util.gui.GUIItem;
|
|||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.inventory.ClickType;
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.IntStream;
|
import java.util.stream.IntStream;
|
||||||
@ -34,7 +35,7 @@ public class DepositoryGUI extends GUI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setupItems() {
|
public void setupItems() {
|
||||||
depository.getGUIConfiguration().setupItems(this);
|
depository.getGUIConfiguration().setupItems(player, this);
|
||||||
depository.getItems().values().forEach(depositoryItem -> setItem(depositoryItem.getSlot(), createGUIItem(depositoryItem)));
|
depository.getItems().values().forEach(depositoryItem -> setItem(depositoryItem.getSlot(), createGUIItem(depositoryItem)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +80,7 @@ public class DepositoryGUI extends GUI {
|
|||||||
.anyMatch(i -> i == null || i.getType() == Material.AIR);
|
.anyMatch(i -> i == null || i.getType() == Material.AIR);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void open(Player player, Depository depository) {
|
public static void open(@NotNull Player player, @NotNull Depository depository) {
|
||||||
DepositoryGUI gui = new DepositoryGUI(player, depository);
|
DepositoryGUI gui = new DepositoryGUI(player, depository);
|
||||||
gui.openGUI(player);
|
gui.openGUI(player);
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,15 @@ website: ${project.url}
|
|||||||
|
|
||||||
author: CarmJos
|
author: CarmJos
|
||||||
|
|
||||||
|
commands:
|
||||||
|
"UltraDepository":
|
||||||
|
description: "超级仓库的主指令"
|
||||||
|
permission: "UltraDepository.use"
|
||||||
|
aliases:
|
||||||
|
- ud
|
||||||
|
- depository
|
||||||
|
- depositories
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
|
|
||||||
"UltraDepository.use":
|
"UltraDepository.use":
|
||||||
@ -21,4 +30,10 @@ permissions:
|
|||||||
|
|
||||||
"UltraDepository.admin":
|
"UltraDepository.admin":
|
||||||
description: "超级仓库的管理权限"
|
description: "超级仓库的管理权限"
|
||||||
default: op
|
default: op
|
||||||
|
|
||||||
|
"UltraDepository.Command.Sell":
|
||||||
|
description: "超级仓库的出售指令权限"
|
||||||
|
|
||||||
|
"UltraDepository.Command.SellAll":
|
||||||
|
description: "超级仓库的出售全部指令权限"
|
Loading…
Reference in New Issue
Block a user