Skip to content

Commit

Permalink
refactor: 将市场面板从 MarketData 分离封装至 MarketGUi, 增加商品分类过滤器
Browse files Browse the repository at this point in the history
  • Loading branch information
blank038 committed Oct 21, 2022
1 parent df2f31d commit 022d809
Show file tree
Hide file tree
Showing 7 changed files with 255 additions and 166 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import com.blank038.servermarket.data.storage.MarketData;
import com.blank038.servermarket.data.cache.PlayerData;
import com.blank038.servermarket.data.sale.SaleItem;
import com.blank038.servermarket.filter.FilterBuilder;
import com.blank038.servermarket.gui.MarketGui;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

Expand Down Expand Up @@ -38,14 +40,14 @@ public void addItem(UUID uuid, ItemStack itemStack) {
* @param player 目标玩家
* @param key 目标市场编号
*/
public void openMarket(Player player, String key, int page, String filter) {
public void openMarket(Player player, String key, int page, FilterBuilder filter) {
MarketData marketData = MarketData.MARKET_DATA.containsKey(key) ? MarketData.MARKET_DATA.get(key)
: MarketData.MARKET_DATA.get(INSTANCE.getConfig().getString("default-market"));
if (marketData == null) {
return;
}
if (player.hasPermission(marketData.getPermission())) {
marketData.openGui(player, page, filter);
new MarketGui(key, page, filter).openGui(player);
}
}

Expand Down
18 changes: 10 additions & 8 deletions src/main/java/com/blank038/servermarket/command/MainCommand.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.blank038.servermarket.command;

import com.blank038.servermarket.ServerMarket;
import com.blank038.servermarket.filter.FilterBuilder;
import com.blank038.servermarket.filter.impl.KeyFilterImpl;
import com.blank038.servermarket.i18n.I18n;
import com.blank038.servermarket.data.storage.MarketData;
import com.blank038.servermarket.data.storage.StoreContainer;
Expand All @@ -16,10 +18,10 @@
* @author Blank038
*/
public class MainCommand implements CommandExecutor {
private final ServerMarket INSTANCE;
private final ServerMarket instance;

public MainCommand(ServerMarket serverMarket) {
INSTANCE = serverMarket;
instance = serverMarket;
}

/**
Expand All @@ -28,7 +30,7 @@ public MainCommand(ServerMarket serverMarket) {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length == 0) {
if (INSTANCE.getConfig().getBoolean("command-help")) {
if (instance.getConfig().getBoolean("command-help")) {
this.sendHelp(sender, label);
} else {
// 打开全球市场
Expand All @@ -54,7 +56,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
break;
case "reload":
if (sender.hasPermission("servermarket.admin")) {
INSTANCE.loadConfig();
instance.loadConfig();
sender.sendMessage(I18n.getString("reload", true));
}
break;
Expand All @@ -73,7 +75,7 @@ private void openServerMarket(CommandSender sender, String key) {
if (!(sender instanceof Player)) {
return;
}
INSTANCE.getApi().openMarket((Player) sender, key, 1, null);
ServerMarket.getApi().openMarket((Player) sender, key, 1, null);
}

/**
Expand All @@ -91,7 +93,7 @@ private void searchItemsAndOpenMarket(CommandSender sender, String[] args) {
sender.sendMessage(I18n.getString("wrong-key", true));
return;
}
INSTANCE.getApi().openMarket((Player) sender, args[1], 1, args[2]);
ServerMarket.getApi().openMarket((Player) sender, args[1], 1, new FilterBuilder().addKeyFilter(new KeyFilterImpl(args[2])));
}

/**
Expand All @@ -106,10 +108,10 @@ private void show(CommandSender sender) {
// 开始设置变量
String permission = entry.getValue().getPermission();
if (permission != null && !"".equals(permission) && !sender.hasPermission(permission)) {
last = last.replace(value, INSTANCE.getConfig().getString("status-text.no-permission"));
last = last.replace(value, instance.getConfig().getString("status-text.no-permission"));
continue;
}
last = last.replace(value, INSTANCE.getConfig().getString("status-text." + entry.getValue().getMarketStatus().name().toLowerCase()));
last = last.replace(value, instance.getConfig().getString("status-text." + entry.getValue().getMarketStatus().name().toLowerCase()));
}
}
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', last));
Expand Down
169 changes: 14 additions & 155 deletions src/main/java/com/blank038/servermarket/data/storage/MarketData.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package com.blank038.servermarket.data.storage;

import com.aystudio.core.bukkit.util.inventory.GuiModel;
import com.blank038.servermarket.ServerMarket;
import com.blank038.servermarket.api.event.MarketLoadEvent;
import com.blank038.servermarket.bridge.BaseBridge;
import com.blank038.servermarket.filter.FilterBuilder;
import com.blank038.servermarket.gui.MarketGui;
import com.blank038.servermarket.i18n.I18n;
import com.blank038.servermarket.data.sale.SaleItem;
import com.blank038.servermarket.enums.MarketStatus;
import com.blank038.servermarket.enums.PayType;
import com.blank038.servermarket.util.CommonUtil;
import com.blank038.servermarket.util.ItemUtil;
import com.google.common.collect.Lists;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
Expand Down Expand Up @@ -99,10 +98,18 @@ public MarketData(File file) {
Bukkit.getPluginManager().callEvent(event);
}

public File getSourceFile() {
return this.sourceFile;
}

public HashMap<String, SaleItem> getSales() {
return saleMap;
}

public SaleItem getSaleItem(String key) {
return this.saleMap.getOrDefault(key, null);
}

public List<String> getSaleTypes() {
return this.saleTypes;
}
Expand Down Expand Up @@ -245,155 +252,7 @@ public ConfigurationSection getShoutTaxSection() {
return this.shoutTaxSection;
}

/**
* 获得市场展示物品
*
* @param saleItem 市场商品信息
* @return 展示物品
*/
public ItemStack getShowItem(SaleItem saleItem, FileConfiguration data) {
ItemStack itemStack = saleItem.getSafeItem().clone();
if (this.showSaleInfo) {
ItemMeta itemMeta = itemStack.getItemMeta();
List<String> lore = itemMeta.hasLore() ? itemMeta.getLore() : Lists.newArrayList();
// 设置物品格式
Date date = new Date(saleItem.getPostTime());
SimpleDateFormat sdf = new SimpleDateFormat(this.dateFormat);
// 设置额外信息
for (String i : data.getStringList("sale-info")) {
lore.add(ChatColor.translateAlternateColorCodes('&', i).replace("%seller%", saleItem.getOwnerName())
.replace("%price%", String.valueOf(saleItem.getPrice())).replace("%time%", sdf.format(date)));
}
itemMeta.setLore(lore);
itemStack.setItemMeta(itemMeta);
}
return ServerMarket.getNMSControl().addNbt(itemStack, "SaleUUID", saleItem.getSaleUUID());
}

/**
* 打开市场面板
*
* @param player 目标玩家
* @param currentPage 页码
*/
public void openGui(Player player, int currentPage, String filter) {
if (this.marketStatus == MarketStatus.ERROR) {
player.sendMessage(I18n.getString("market-error", true));
return;
}
if (this.permission != null && !"".equals(this.permission) && !player.hasPermission(this.permission)) {
player.sendMessage(I18n.getString("no-permission", true));
return;
}
// 读取配置文件
FileConfiguration data = YamlConfiguration.loadConfiguration(this.sourceFile);
GuiModel guiModel = new GuiModel(data.getString("title"), data.getInt("size"));
guiModel.registerListener(ServerMarket.getInstance());
guiModel.setCloseRemove(true);
// 设置界面物品
HashMap<Integer, ItemStack> items = new HashMap<>();
if (data.contains("items")) {
for (String key : data.getConfigurationSection("items").getKeys(false)) {
ConfigurationSection section = data.getConfigurationSection("items." + key);
ItemStack itemStack = new ItemStack(Material.valueOf(section.getString("type").toUpperCase()),
section.getInt("amount"), (short) section.getInt("data"));
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', section.getString("name")));
// 开始遍历设置Lore
List<String> list = new ArrayList<>();
for (String lore : section.getStringList("lore")) {
list.add(ChatColor.translateAlternateColorCodes('&', lore));
}
itemMeta.setLore(list);
itemStack.setItemMeta(itemMeta);
// 开始判断是否有交互操作
if (section.contains("action")) {
itemStack = ServerMarket.getNMSControl().addNbt(itemStack, "MarketAction", section.getString("action"));
}
for (int i : CommonUtil.formatSlots(section.getString("slot"))) {
items.put(i, itemStack);
}
}
}
// 开始获取全球市场物品
Integer[] slots = CommonUtil.formatSlots(data.getString("sale-item-slots"));
String[] keys = saleMap.keySet().toArray(new String[0]);
// 计算下标
int maxPage = saleMap.size() / slots.length;
maxPage += (saleMap.size() % slots.length) == 0 ? 0 : 1;
// 判断页面是否超标, 如果是的话就设置为第一页
if (currentPage > maxPage) {
currentPage = 1;
}
// 获得额外增加的信息
int start = slots.length * (currentPage - 1), end = slots.length * currentPage;
for (int i = start, index = 0; i < end; i++, index++) {
if (index >= slots.length || i >= keys.length) {
break;
}
// 开始设置物品
SaleItem saleItem = saleMap.getOrDefault(keys[i], null);
if (saleItem == null || (filter != null && !ItemUtil.isSimilar(saleItem.getSafeItem(), filter))) {
--index;
continue;
}
items.put(slots[index], this.getShowItem(saleItem, data));
}
guiModel.setItem(items);
final int lastPage = currentPage, finalMaxPage = maxPage;
guiModel.execute((e) -> {
e.setCancelled(true);
if (e.getClickedInventory() == e.getInventory()) {
ItemStack itemStack = e.getCurrentItem();
String key = ServerMarket.getNMSControl().getValue(itemStack, "SaleUUID"),
action = ServerMarket.getNMSControl().getValue(itemStack, "MarketAction");
// 强转玩家
Player clicker = (Player) e.getWhoClicked();
if (key != null) {
// 购买商品
this.buySaleItem(clicker, key, e.isShiftClick(), lastPage, filter);
} else if (action != null) {
// 判断交互方式
switch (action) {
case "up":
if (lastPage == 1) {
clicker.sendMessage(I18n.getString("no-previous-page", true));
} else {
this.openGui(player, lastPage - 1, filter);
}
break;
case "down":
if (lastPage >= finalMaxPage) {
clicker.sendMessage(I18n.getString("no-next-page", true));
} else {
this.openGui(player, lastPage + 1, filter);
}
break;
case "store":
new StoreContainer(clicker, lastPage, this.marketKey).open(1);
break;
default:
if (action.contains(":")) {
String[] split = action.split(":");
if (split.length < 2) {
return;
}
if ("player".equalsIgnoreCase(split[0])) {
Bukkit.getServer().dispatchCommand(player, split[1].replace("%player%", player.getName()));
} else if ("console".equalsIgnoreCase(split[0])) {
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), split[1].replace("%player%", player.getName()));
}
}
break;
}
}
}
});
// 打开界面
guiModel.openInventory(player);
}

public void buySaleItem(Player buyer, String uuid, boolean shift, int page, String filter) {
public void buySaleItem(Player buyer, String uuid, boolean shift, int page, FilterBuilder filter) {
// 判断商品是否存在
if (!saleMap.containsKey(uuid)) {
buyer.sendMessage(I18n.getString("error-sale", true));
Expand All @@ -404,7 +263,7 @@ public void buySaleItem(Player buyer, String uuid, boolean shift, int page, Stri
if (shift) {
buyer.getInventory().addItem(saleMap.remove(uuid).getSafeItem().clone());
buyer.sendMessage(I18n.getString("unsale", true));
this.openGui(buyer, 1, filter);
new MarketGui(this.marketKey, page, filter).openGui(buyer);
} else {
buyer.sendMessage(I18n.getString("shift-unsale", true));
}
Expand Down Expand Up @@ -438,7 +297,7 @@ public void buySaleItem(Player buyer, String uuid, boolean shift, int page, Stri
ServerMarket.getApi().addItem(buyer.getUniqueId(), saleItem);
// 给购买者发送消息
buyer.sendMessage(I18n.getString("buy-item", true));
this.openGui(buyer, page, filter);
new MarketGui(this.marketKey, page, filter).openGui(buyer);
} else {
buyer.sendMessage(I18n.getString("shift-buy", true));
}
Expand All @@ -462,7 +321,7 @@ public boolean performSellCommand(Player player, String message) {
return true;
}
if (split.length == 1) {
this.openGui(player, 1, null);
new MarketGui(this.marketKey, 1, null).openGui(player);
return true;
}
if (split.length == 2) {
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/com/blank038/servermarket/filter/FilterBuilder.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.blank038.servermarket.filter;

import com.blank038.servermarket.data.sale.SaleItem;
import com.blank038.servermarket.filter.impl.TypeFilterImpl;
import com.blank038.servermarket.filter.interfaces.ISaleFilter;

import java.util.ArrayList;
Expand All @@ -11,13 +12,22 @@
*/
public class FilterBuilder {
private final List<ISaleFilter> saleFilters = new ArrayList<>();
private TypeFilterImpl typeFilter;

public FilterBuilder addKeyFilter(ISaleFilter saleFilter) {
this.saleFilters.add(saleFilter);
return this;
}

public FilterBuilder setTypeFilter(TypeFilterImpl typeFilter) {
this.typeFilter = typeFilter;
return this;
}

public boolean check(SaleItem saleItem) {
if (this.typeFilter.check(saleItem)) {
return true;
}
return this.saleFilters.stream().anyMatch((saleFilter) -> saleFilter.check(saleItem));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.blank038.servermarket.filter.impl;

import com.blank038.servermarket.data.sale.SaleItem;
import com.blank038.servermarket.filter.interfaces.ISaleFilter;

import java.util.ArrayList;
import java.util.List;

/**
* @author Blank038
*/
public class TypeFilterImpl implements ISaleFilter {
private final List<String> types = new ArrayList<>();

public TypeFilterImpl(List<String> keys) {
this.types.addAll(keys);
}

@Override
public boolean check(SaleItem saleItem) {
return this.types.stream().anyMatch((s) -> saleItem.getSaleTypes().contains(s));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@

public interface ISaleFilter {

boolean check(SaleItem itemStack);
boolean check(SaleItem saleItem);
}

0 comments on commit 022d809

Please sign in to comment.