1
mirror of https://github.com/CarmJos/UltraDepository.git synced 2024-09-19 19:55:45 +00:00

优化GUI物品读取方式,提高配置自由度

This commit is contained in:
Carm Jos 2021-12-29 01:59:08 +08:00
parent c71041cb13
commit c5989e4a35
10 changed files with 180 additions and 68 deletions

View File

@ -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]"

View File

@ -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("注册变量...");

View File

@ -1,4 +0,0 @@
package cc.carm.plugin.ultradepository.command;
public class BackpackCommand {
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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))

View File

@ -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)
);
}
}

View File

@ -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;

View File

@ -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);
}

View File

@ -7,6 +7,15 @@ website: ${project.url}
author: CarmJos
commands:
"UltraDepository":
description: "超级仓库的主指令"
permission: "UltraDepository.use"
aliases:
- ud
- depository
- depositories
permissions:
"UltraDepository.use":
@ -21,4 +30,10 @@ permissions:
"UltraDepository.admin":
description: "超级仓库的管理权限"
default: op
default: op
"UltraDepository.Command.Sell":
description: "超级仓库的出售指令权限"
"UltraDepository.Command.SellAll":
description: "超级仓库的出售全部指令权限"