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
|
||||
items:
|
||||
"CLOSE":
|
||||
icon:
|
||||
==: org.bukkit.ItemStack
|
||||
material: RED_STONE
|
||||
data: 0
|
||||
slot: 0
|
||||
name: "关闭界面"
|
||||
lore:
|
||||
- "点击后您将关闭本界面。"
|
||||
actions:
|
||||
- "[LEFT:CLOSE]"
|
||||
- "[SHIFT_LEFT:CLOSE]"
|
||||
|
@ -1,5 +1,6 @@
|
||||
package cc.carm.plugin.ultradepository;
|
||||
|
||||
import cc.carm.plugin.ultradepository.command.DepositoryCommand;
|
||||
import cc.carm.plugin.ultradepository.configuration.PluginConfig;
|
||||
import cc.carm.plugin.ultradepository.hooker.PAPIExpansion;
|
||||
import cc.carm.plugin.ultradepository.listener.CollectListener;
|
||||
@ -81,7 +82,7 @@ public class Main extends JavaPlugin {
|
||||
regListener(new CollectListener());
|
||||
|
||||
log("注册指令...");
|
||||
|
||||
registerCommand("UltraDepository", new DepositoryCommand(), new DepositoryCommand());
|
||||
|
||||
if (MessageUtil.hasPlaceholderAPI()) {
|
||||
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)) {
|
||||
ConfigurationSection itemSection = section.getConfigurationSection(key);
|
||||
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;
|
||||
|
@ -2,26 +2,26 @@ package cc.carm.plugin.ultradepository.configuration.gui;
|
||||
|
||||
import cc.carm.plugin.ultradepository.util.ColorParser;
|
||||
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 com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.Multimap;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
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 {
|
||||
|
||||
String title;
|
||||
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.lines = lines;
|
||||
this.guiItems = guiItems;
|
||||
@ -52,68 +52,31 @@ public class GUIConfiguration {
|
||||
}
|
||||
}
|
||||
|
||||
public Multimap<GUIItem, Integer> getGuiItems() {
|
||||
public List<GUIItemConfiguration> getGuiItems() {
|
||||
return guiItems;
|
||||
}
|
||||
|
||||
public void setupItems(GUI gui) {
|
||||
getGuiItems().forEach((gui::setItem));
|
||||
public void setupItems(Player player, GUI gui) {
|
||||
getGuiItems().forEach(itemConfiguration -> itemConfiguration.setupItems(player, gui));
|
||||
}
|
||||
|
||||
|
||||
public static GUIConfiguration readConfiguration(@Nullable ConfigurationSection section) {
|
||||
if (section == null) {
|
||||
return new GUIConfiguration("name", 6, ArrayListMultimap.create());
|
||||
}
|
||||
if (section == null) return new GUIConfiguration("name", 6, new ArrayList<>());
|
||||
|
||||
String title = section.getString("title", "");
|
||||
int lines = section.getInt("lines", 6);
|
||||
Multimap<GUIItem, Integer> guiItemMap = ArrayListMultimap.create();
|
||||
ConfigurationSection itemsSection = section.getConfigurationSection("items");
|
||||
if (itemsSection != null) {
|
||||
itemsSection.getKeys(false).stream()
|
||||
.map(key -> readItem(itemsSection.getConfigurationSection(key)))
|
||||
.filter(Objects::nonNull)
|
||||
.forEach(entry -> guiItemMap.putAll(entry.getKey(), entry.getValue()));
|
||||
if (itemsSection == null) return new GUIConfiguration(title, lines, new ArrayList<>());
|
||||
|
||||
}
|
||||
return new GUIConfiguration(title, lines, guiItemMap);
|
||||
return new GUIConfiguration(
|
||||
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) {
|
||||
return Arrays.stream(ClickType.values())
|
||||
.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;
|
||||
JsonObject contentsObject = new JsonObject();
|
||||
contentsData.getContents().entrySet().stream()
|
||||
// 只存取有数值的部分,减少数据量
|
||||
.filter(entry -> entry.getValue().getSold() > 0 || entry.getValue().getAmount() > 0)
|
||||
.forEach(entry -> contentsObject.add(entry.getKey(), serializeItemData(entry.getValue())));
|
||||
return contentsObject;
|
||||
|
@ -13,6 +13,7 @@ import cc.carm.plugin.ultradepository.util.gui.GUIItem;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.IntStream;
|
||||
@ -34,7 +35,7 @@ public class DepositoryGUI extends GUI {
|
||||
}
|
||||
|
||||
public void setupItems() {
|
||||
depository.getGUIConfiguration().setupItems(this);
|
||||
depository.getGUIConfiguration().setupItems(player, this);
|
||||
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);
|
||||
}
|
||||
|
||||
public static void open(Player player, Depository depository) {
|
||||
public static void open(@NotNull Player player, @NotNull Depository depository) {
|
||||
DepositoryGUI gui = new DepositoryGUI(player, depository);
|
||||
gui.openGUI(player);
|
||||
}
|
||||
|
@ -7,6 +7,15 @@ website: ${project.url}
|
||||
|
||||
author: CarmJos
|
||||
|
||||
commands:
|
||||
"UltraDepository":
|
||||
description: "超级仓库的主指令"
|
||||
permission: "UltraDepository.use"
|
||||
aliases:
|
||||
- ud
|
||||
- depository
|
||||
- depositories
|
||||
|
||||
permissions:
|
||||
|
||||
"UltraDepository.use":
|
||||
@ -22,3 +31,9 @@ permissions:
|
||||
"UltraDepository.admin":
|
||||
description: "超级仓库的管理权限"
|
||||
default: op
|
||||
|
||||
"UltraDepository.Command.Sell":
|
||||
description: "超级仓库的出售指令权限"
|
||||
|
||||
"UltraDepository.Command.SellAll":
|
||||
description: "超级仓库的出售全部指令权限"
|
Loading…
Reference in New Issue
Block a user