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

完成插件指令

This commit is contained in:
Carm Jos 2021-12-29 23:10:33 +08:00
parent ec30bd89ed
commit 02eae54e7c
5 changed files with 541 additions and 16 deletions

View File

@ -15,6 +15,7 @@
[![License](https://img.shields.io/github/license/CarmJos/UltraDepository)](https://opensource.org/licenses/GPL-3.0)
[![workflow](https://github.com/CarmJos/UltraDepository/actions/workflows/maven.yml/badge.svg?branch=master)](https://github.com/CarmJos/UltraDepository/actions/workflows/maven.yml)
![CodeSize](https://img.shields.io/github/languages/code-size/CarmJos/UltraDepository)
![Support](https://img.shields.io/badge/Minecraft-Java%201.13--Latest-green)
![](https://visitor-badge.glitch.me/badge?page_id=UltraDepository.readme)
超级仓库插件,支持设定不同物品的存储仓库。

View File

@ -1,31 +1,421 @@
package cc.carm.plugin.ultradepository.command;
import cc.carm.plugin.ultradepository.Main;
import cc.carm.plugin.ultradepository.configuration.PluginMessages;
import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.data.DepositoryData;
import cc.carm.plugin.ultradepository.data.DepositoryItemData;
import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.ui.DepositoryGUI;
import cc.carm.plugin.ultradepository.util.ColorParser;
import cc.carm.plugin.ultradepository.util.MessageUtil;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class DepositoryCommand implements CommandExecutor, TabCompleter {
private boolean helpConsole(CommandSender sender) {
PluginMessages.HELP_CONSOLE.send(sender);
return true;
}
private boolean helpPlayer(Player player) {
PluginMessages.HELP_PLAYER.send(player);
return true;
}
@Override
public boolean onCommand(
@NotNull CommandSender sender, @NotNull Command command,
@NotNull String alias, @NotNull String[] args) {
if (sender instanceof Player) {
Player player = (Player) sender;
if (args.length < 1) return helpPlayer(player);
switch (args[0].toLowerCase()) {
case "open": {
if (!player.hasPermission("UltraDepository.use")) {
return false;
}
if (args.length < 2) return helpPlayer(player);
Depository depository = Main.getDepositoryManager().getDepository(args[1]);
if (depository == null) {
PluginMessages.NO_DEPOSITORY.send(player);
return true;
}
DepositoryGUI.open((Player) sender, depository);
return true;
}
case "sell": {
if (!player.hasPermission("UltraDepository.Command.Sell")) {
return false;
}
if (!Main.getEconomyManager().isInitialized()) {
PluginMessages.NO_ECONOMY.send(player);
return true;
}
if (args.length < 4) return helpPlayer(player);
Depository depository = Main.getDepositoryManager().getDepository(args[1]);
if (depository == null) {
PluginMessages.NO_DEPOSITORY.send(player);
return true;
}
if (sender instanceof Player && args.length >= 1) {
Depository depository = Main.getDepositoryManager().getDepository(args[0]);
if (depository != null) DepositoryGUI.open((Player) sender, depository);
DepositoryItem item = depository.getItems().get(args[2]);
if (item == null) {
PluginMessages.NO_ITEM.send(player);
return true;
}
int amount = -1;
try {
amount = Integer.parseInt(args[3]);
} catch (Exception ignore) {
}
if (amount <= 0) {
PluginMessages.WRONG_NUMBER.send(player);
return true;
}
UserData userData = Main.getUserManager().getData(player);
DepositoryItemData itemData = userData.getItemData(item);
int limit = item.getLimit();
int sold = itemData.getSold();
int currentAmount = itemData.getAmount();
if (currentAmount < amount) {
PluginMessages.NO_ENOUGH_ITEM.send(player);
return true;
}
if (currentAmount > (limit - sold)) {
PluginMessages.ITEM_SOLD_LIMIT.send(player, new Object[]{(limit - sold), limit});
return true;
}
sellItem(player, userData, itemData, amount);
return true;
}
case "sellall": {
if (!player.hasPermission("UltraDepository.Command.SellAll")) {
return false;
}
if (!Main.getEconomyManager().isInitialized()) {
PluginMessages.NO_ECONOMY.send(player);
return true;
}
UserData userData = Main.getUserManager().getData(player);
String depositoryID = args.length >= 2 ? args[1] : null;
String itemID = args.length >= 3 ? args[2] : null;
Depository depository = null;
if (depositoryID != null) {
depository = Main.getDepositoryManager().getDepository(depositoryID);
if (depository == null) {
PluginMessages.NO_DEPOSITORY.send(player);
return true;
}
}
if (depository == null) {
userData.getDepositories().values().stream()
.flatMap(depositoryData -> depositoryData.getContents().values().stream())
.forEach(itemData -> sellAllItem(player, userData, itemData));
sender.sendMessage("Success! " + player.getName() + "'s items had been sold.");
return true;
}
DepositoryItem item = null;
if (itemID != null) {
item = depository.getItems().get(itemID);
if (item == null) {
PluginMessages.NO_ITEM.send(player);
return true;
}
}
if (item == null) {
userData.getDepositoryData(depository).getContents().values()
.forEach(itemData -> sellAllItem(player, userData, itemData));
return true;
}
sellAllItem(player, userData, userData.getItemData(item));
return true;
}
default:
return helpPlayer(player);
}
} else {
if (args.length < 1) return helpConsole(sender);
switch (args[0].toLowerCase()) {
case "info": {
if (args.length < 2) return helpConsole(sender);
Player player = Bukkit.getPlayer(args[1]);
if (player == null) {
sender.sendMessage("Player does not exist.");
return false;
}
UserData userData = Main.getUserManager().getData(player);
String depositoryID = args.length >= 3 ? args[2] : null;
String itemID = args.length >= 4 ? args[3] : null;
Depository depository = null;
if (depositoryID != null) {
depository = Main.getDepositoryManager().getDepository(depositoryID);
if (depository == null) {
PluginMessages.NO_DEPOSITORY.send(player);
return true;
}
}
sender.sendMessage(ColorParser.parse("&fInfo &6" + player.getName() + " &f:"));
if (depository == null) {
userData.getDepositories().values().forEach(depositoryData -> {
MessageUtil.send(sender, "&8# &e" + depositoryData.getIdentifier());
depositoryData.getContents().values().forEach(itemData -> {
String typeID = itemData.getSource().getTypeID();
int amount = itemData.getAmount();
int sold = itemData.getSold();
MessageUtil.send(sender, "&8- &f" + typeID + " &7[&f " + amount + "&8|&f " + sold + "&7]");
});
});
return true;
}
DepositoryItem item = null;
if (itemID != null) {
item = depository.getItems().get(itemID);
if (item == null) {
PluginMessages.NO_ITEM.send(player);
return true;
}
}
if (item == null) {
DepositoryData depositoryData = userData.getDepositoryData(depository);
MessageUtil.send(sender, "&8# &e" + depositoryData.getIdentifier());
depositoryData.getContents().values().forEach(itemData -> {
String typeID = itemData.getSource().getTypeID();
int amount = itemData.getAmount();
int sold = itemData.getSold();
MessageUtil.send(sender, "&8- &f" + typeID + " &7[&f " + amount + "&8|&f " + sold + "&7]");
});
return true;
}
DepositoryItemData itemData = userData.getItemData(item);
String typeID = itemData.getSource().getTypeID();
int amount = itemData.getAmount();
int sold = itemData.getSold();
MessageUtil.send(sender, "&8# &e" + depository.getIdentifier());
MessageUtil.send(sender, "&8- &f" + typeID + " &7[&f " + amount + "&8|&f " + sold + "&7]");
return true;
}
case "add": {
if (args.length < 5) return true;
Player player = Bukkit.getPlayer(args[1]);
if (player == null) {
sender.sendMessage("Player does not exist.");
return false;
}
Depository depository = Main.getDepositoryManager().getDepository(args[2]);
if (depository == null) {
PluginMessages.NO_DEPOSITORY.send(sender);
return true;
}
DepositoryItem item = depository.getItems().get(args[3]);
if (item == null) {
PluginMessages.NO_ITEM.send(sender);
return true;
}
int amount = -1;
try {
amount = Integer.parseInt(args[4]);
} catch (Exception ignore) {
}
if (amount <= 0) {
PluginMessages.WRONG_NUMBER.send(sender);
return true;
}
Integer after = Main.getUserManager().getData(player)
.addItemAmount(depository.getIdentifier(), item.getTypeID(), amount);
if (after != null) {
sender.sendMessage("Success! Now " + player.getName() + "'s " + item.getTypeID() + " is " + after + " .");
} else {
sender.sendMessage("Failed!");
}
return true;
}
case "remove": {
if (args.length < 4) return true;
Player player = Bukkit.getPlayer(args[1]);
if (player == null) {
sender.sendMessage("Player does not exist.");
return false;
}
Depository depository = Main.getDepositoryManager().getDepository(args[2]);
if (depository == null) {
PluginMessages.NO_DEPOSITORY.send(sender);
return true;
}
DepositoryItem item = depository.getItems().get(args[3]);
if (item == null) {
PluginMessages.NO_ITEM.send(sender);
return true;
}
Integer amount = null;
try {
amount = Integer.parseInt(args[4]);
} catch (Exception ignore) {
}
if (amount != null && amount < 0) {
PluginMessages.WRONG_NUMBER.send(sender);
return true;
}
UserData userData = Main.getUserManager().getData(player);
if (amount != null) {
Integer after = userData.removeItemAmount(depository.getIdentifier(), item.getTypeID(), amount);
if (after != null) {
sender.sendMessage("Success! Now " + player.getName() + "'s " + item.getTypeID() + " is " + after + " .");
} else {
sender.sendMessage("Failed!");
}
} else {
userData.setItemAmount(depository.getIdentifier(), item.getTypeID(), 0);
sender.sendMessage("Success! Cleared " + player.getName() + "'s " + item.getTypeID() + " .");
}
return true;
}
case "sell": {
if (args.length < 2) return true;
Player player = Bukkit.getPlayer(args[1]);
if (player == null) {
sender.sendMessage("Player does not exist.");
return false;
}
String depositoryID = args.length >= 3 ? args[2] : null;
String itemID = args.length >= 4 ? args[3] : null;
Depository depository = null;
if (depositoryID != null) {
depository = Main.getDepositoryManager().getDepository(depositoryID);
if (depository == null) {
PluginMessages.NO_DEPOSITORY.send(sender);
return true;
}
}
UserData userData = Main.getUserManager().getData(player);
if (depository == null) {
userData.getDepositories().values().stream()
.flatMap(depositoryData -> depositoryData.getContents().values().stream())
.forEach(itemData -> sellAllItem(player, userData, itemData));
sender.sendMessage("Success! " + player.getName() + "'s items had been sold.");
return true;
}
DepositoryItem item = null;
if (itemID != null) {
item = depository.getItems().get(itemID);
if (item == null) {
PluginMessages.NO_ITEM.send(player);
return true;
}
}
if (item == null) {
userData.getDepositoryData(depository).getContents().values()
.forEach(itemData -> sellAllItem(player, userData, itemData));
sender.sendMessage("Success! " + player.getName() + "'s " + depository.getIdentifier() + " had been sold.");
return true;
}
Integer amount = null;
if (args.length >= 5) {
try {
amount = Integer.parseInt(args[4]);
} catch (Exception ignore) {
}
}
if (amount != null && amount < 0) {
PluginMessages.WRONG_NUMBER.send(sender);
return true;
}
if (amount == null) {
sellAllItem(player, userData, userData.getItemData(item));
sender.sendMessage("Success! " + player.getName() + "'s " + item.getTypeID() + " had been sold.");
return true;
}
DepositoryItemData itemData = userData.getItemData(item);
int limit = item.getLimit();
int sold = itemData.getSold();
int currentAmount = itemData.getAmount();
if (currentAmount < amount) {
PluginMessages.NO_ENOUGH_ITEM.send(sender);
return true;
}
if (currentAmount > (limit - sold)) {
PluginMessages.ITEM_SOLD_LIMIT.send(sender, new Object[]{(limit - sold), limit});
return true;
}
sellItem(player, userData, userData.getItemData(item), amount);
sender.sendMessage("Success! " + player.getName() + "'s " + amount + " " + item.getTypeID() + " had been sold.");
return true;
}
default:
return helpConsole(sender);
}
}
}
return false;
private void sellAllItem(Player player, UserData userData, DepositoryItemData itemData) {
int amount = itemData.getAmount();
int sold = itemData.getSold();
int limit = itemData.getSource().getLimit();
int finalAmount = Math.min(amount, (limit - sold));
if (finalAmount > 0) {
sellItem(player, userData, itemData, finalAmount);
}
}
private void sellItem(Player player, UserData userData, DepositoryItemData itemData, int amount) {
userData.addItemSold(itemData.getOwner().getSource().getIdentifier(), itemData.getSource().getTypeID(), amount);
userData.removeItemAmount(itemData.getOwner().getSource().getIdentifier(), itemData.getSource().getTypeID(), amount);
double money = Main.getEconomyManager().sell(player, itemData.getSource().getPrice(), amount);
PluginMessages.SOLD.send(player, new Object[]{itemData.getSource().getName(), amount, money});
}
@Nullable
@ -33,8 +423,75 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
public List<String> onTabComplete(
@NotNull CommandSender sender, @NotNull Command command,
@NotNull String alias, @NotNull String[] args) {
List<String> allCompletes = new ArrayList<>();
if (sender instanceof Player) {
// 玩家指令部分
Player player = (Player) sender;
if (player.hasPermission("UltraDepository.use")) {
switch (args.length) {
case 1: {
allCompletes.add("open");
if (player.hasPermission("UltraDepository.Command.Sell")) allCompletes.add("sell");
if (player.hasPermission("UltraDepository.Command.SellAll")) allCompletes.add("sellAll");
break;
}
case 2: {
String aim = args[0];
if (aim.equalsIgnoreCase("open")
|| (aim.equalsIgnoreCase("sell")
&& player.hasPermission("UltraDepository.Command.Sell"))
|| (aim.equalsIgnoreCase("sellAll")
&& player.hasPermission("UltraDepository.Command.SellAll"))) {
allCompletes.addAll(Main.getDepositoryManager().getDepositories().keySet());
}
break;
}
case 3: {
String aim = args[0];
String depositoryID = args[1];
if ((aim.equalsIgnoreCase("sell")
&& player.hasPermission("UltraDepository.Command.Sell"))
|| (aim.equalsIgnoreCase("sellAll")
&& player.hasPermission("UltraDepository.Command.SellAll"))) {
Depository depository = Main.getDepositoryManager().getDepository(depositoryID);
if (depository != null) {
allCompletes.addAll(depository.getItems().keySet());
}
}
break;
}
}
}
} else {
//后台指令部分
switch (args.length) {
case 1: {
allCompletes.add("info");
allCompletes.add("add");
allCompletes.add("remove");
allCompletes.add("sell");
break;
}
case 2: {
allCompletes = Bukkit.getOnlinePlayers().stream().map(HumanEntity::getName).collect(Collectors.toList());
break;
}
case 3: {
allCompletes.addAll(Main.getDepositoryManager().getDepositories().keySet());
break;
}
case 4: {
Depository depository = Main.getDepositoryManager().getDepository(args[2]);
if (depository != null) {
allCompletes.addAll(depository.getItems().keySet());
}
break;
}
}
}
return null;
return allCompletes.stream()
.filter(s -> StringUtil.startsWithIgnoreCase(s, args[args.length - 1]))
.limit(10).collect(Collectors.toList());
}
}

View File

@ -5,6 +5,11 @@ import cc.carm.plugin.ultradepository.configuration.message.ConfigMessageList;
public class PluginMessages {
public static final ConfigMessageList HELP_CONSOLE = new ConfigMessageList("help.console");
public static final ConfigMessageList HELP_PLAYER = new ConfigMessageList("help.player");
public static final ConfigMessageList SOLD = new ConfigMessageList(
"item-sold", new String[0], new String[]{
"%(item)", "%(amount)", "%(money)"
@ -20,5 +25,22 @@ public class PluginMessages {
"%(item)", "%(amount)", "%(depository)"
});
public static final ConfigMessageList NO_ECONOMY = new ConfigMessageList("no-economy");
public static final ConfigMessageList NO_SPACE = new ConfigMessageList("no-space");
public static final ConfigMessageList NO_DEPOSITORY = new ConfigMessageList("no-depository");
public static final ConfigMessageList NO_ITEM = new ConfigMessageList("no-item");
public static final ConfigMessageList NO_ENOUGH_ITEM = new ConfigMessageList("no-enough-item");
public static final ConfigMessageList ITEM_SOLD_LIMIT = new ConfigMessageList(
"item-sold-limit", new String[0], new String[]{
"%(amount)", "%(limit)"
});
public static final ConfigMessageList WRONG_NUMBER = new ConfigMessageList("wrong-number");
}

View File

@ -79,16 +79,16 @@ public class UserData {
public @Nullable Integer setItemAmount(@NotNull String depositoryID, @NotNull String typeID, int amount) {
DepositoryItemData data = getItemData(depositoryID, typeID);
if (data == null) return null;
data.setAmount(amount);
return amount;
data.setAmount(Math.max(0, amount)); // 最小为0
return data.getAmount();
}
public @Nullable Integer setItemSold(@NotNull String depositoryID, @NotNull String typeID, int soldAmount) {
DepositoryItemData data = getItemData(depositoryID, typeID);
if (data == null) return null;
data.setSold(soldAmount);
return soldAmount;
data.setSold(Math.max(0, soldAmount));
return data.getSold();
}

View File

@ -1,13 +1,58 @@
item-collected:
- "&f您收集了 &e%(item)&7x%(amount) &f已自动放入到您的 &6%(depository) &f中。"
help:
player:
- "&6&l超级仓库 &f玩家指令帮助"
- "&8#&f open &e[仓库ID]"
- "&8-&7 打开对应仓库的界面。"
- "&8#&f sell &6<仓库ID> &6<物品ID> &6<数量>"
- "&8-&7 售出对应数量的对应物品。"
- "&8-&7 该指令受到玩家每日售出数量的限制。"
- "&8#&f sellAll &e[仓库ID] &e[物品ID]"
- "&8-&7 该指令受到玩家每日售出数量的限制。"
console:
- "&6&l超级仓库 &f后台指令帮助"
- "&8#&f info &6<玩家> &e[仓库ID] &e[物品ID]"
- "&8-&7 得到玩家的相关物品信息。"
- "&8#&f add &6<玩家> &6<仓库ID> &6<物品ID> &6<数量>"
- "&8-&7 为玩家添加对应仓库中对于物品的数量。"
- "&8#&f remove &6<玩家> &6<仓库ID> &6<物品ID> &e[数量]"
- "&8-&7 为玩家减少对应仓库中对于物品的数量。"
- "&8-&7 若不填写数量,则清空对应仓库的对应物品。"
- "&8#&f sell &6<玩家> &e[仓库ID] &e[物品ID] &e[数量]"
- "&8-&7 为玩家售出相关物品。"
- "&8-&7 若不填写数量,则售出所有对应仓库的对应物品。"
- "&8-&7 若不填写物品,则售出对应仓库内所有物品。"
- "&8-&7 若不填写仓库,则售出所有仓库内所有物品。"
- "&8-&7 该指令受到玩家每日售出数量的限制。"
item-collected:
- "&f您收集了 &r%(item)&7x%(amount) &f已自动放入到您的 &6%(depository) &f中。"
item-pickup:
- "&f您取出了 &e%(item)&7x%(amount) &f已自动放入到您的背包中。"
- "&f您取出了 &r%(item)&7x%(amount) &f已自动放入到您的仓库中。"
item-sold:
- "&f您出售了 &e%(item)&7x%(amount) &f共赚取 &6%(money) &f元。"
- "&f您出售了 &r%(item)&7x%(amount) &f共赚取 &6%(money) &f元。"
item-sold-limit:
- "&f该物品今日剩余可出售额度为 &a%(amount)&8/%(limit) &f个。"
no-economy:
- "&f本服务器暂未启用出售功能。"
no-space:
- "&f您背包内没有足够的空间取出物品"
- "&f您仓库内没有足够的空间取出物品"
no-depository:
- "&f不存在该仓库请检查仓库ID是否正确。"
no-item:
- "&f仓库中不存在该物品请检查物品ID是否正确。"
no-enough-item:
- "&f仓库中不存在足够的物品。"
wrong-number:
- "&f数目输入错误请输入正确的数字"