This repository has been archived on 2024-12-26. You can view files and clone it, but cannot push or open issues or pull requests.
QSeller/src/main/java/ru/redguy/qseller/QSellerMenu.java
2022-11-15 00:42:00 +03:00

172 lines
7.9 KiB
Java
Executable File

package ru.redguy.qseller;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.material.MaterialData;
import org.ipvp.canvas.ClickInformation;
import org.ipvp.canvas.Menu;
import org.ipvp.canvas.slot.Slot;
import org.ipvp.canvas.type.ChestMenu;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class QSellerMenu {
Menu menu;
/**
* Removes the items of type from an inventory.
* @param inventory Inventory to modify
* @param type The type of Material to remove
* @param amount The amount to remove, or Integer.MAX_VALUE to remove all
* @return The amount of items that could not be removed, 0 for success, or -1 for failures
*/
public static int removeItems(Inventory inventory, Material type, short meta, int amount) {
if(type == null || inventory == null)
return -1;
if (amount <= 0)
return -1;
if (amount == Integer.MAX_VALUE) {
inventory.remove(type);
return 0;
}
HashMap<Integer,ItemStack> retVal = inventory.removeItem(new ItemStack(type,amount,meta));
int notRemoved = 0;
for(ItemStack item: retVal.values()) {
notRemoved+=item.getAmount();
}
return notRemoved;
}
public void sell(Player player, ClickInformation info) {
ItemStack item = info.getClickedSlot().getItem(player);
if(player.getInventory().contains(new ItemStack(item.getType(),item.getType().getMaxStackSize(),item.getData().getData()))) {
Optional<SellItem> items = QSeller.getInstance().getSellItemList("game.menu.items").stream().filter(i -> item.getType().equals(i.getItem())&&i.getMeta()==item.getData().getData()).findFirst();
if(items.isPresent()) {
int startStacks = QSeller.getInstance().getInt("game.menu.startStacks");
int step = QSeller.getInstance().getInt("game.menu.step");
int villagerLevel = Database.getInstance().getVillagerLevel(player.getUniqueId());
SellItem sellItem = items.get();
Database.getInstance().progressItem(player.getUniqueId(), item.getType());
removeItems(player.getInventory(), item.getType(), (short) sellItem.getMeta(), item.getType().getMaxStackSize());
double price = countPrice(player,sellItem,villagerLevel,startStacks, step);
QSeller.getInstance().econ.depositPlayer(player, price);
player.sendMessage(QSeller.getInstance().getParsedString("messages.sold", player).replaceAll("\\{\\{price}}",String.valueOf(price)));
checkForNewLevel(player,villagerLevel,startStacks, step);
render(player);
menu.update(player);
}
} else {
player.sendMessage(QSeller.getInstance().getParsedString("messages.notEnoughItems", player));
}
}
private double countPrice(Player player, SellItem sellItem, int villagerLevel, int startStacks, int step) {
int progress = Database.getInstance().getItemProgress(player.getUniqueId(),sellItem.getItem());
return Math.max(sellItem.getHighPrice()+villagerLevel-1-progress, sellItem.getBasePrice());
}
private void checkForNewLevel(Player player,int villagerLevel, int startStacks, int step) {
if(QSeller.getInstance().getInt("game.menu.maxVillagerLevel")<=villagerLevel) return;
for (SellItem sellItem : QSeller.getInstance().getSellItemList("game.menu.items")) {
int progress = Database.getInstance().getItemProgress(player.getUniqueId(),sellItem.getItem());
int maxProgress = startStacks+(villagerLevel-1)*step;
if(progress<maxProgress) return;
}
Database.getInstance().progressVillager(player.getUniqueId());
Menu oldMenu = menu;
menu = ChestMenu.builder(6)
.title(QSeller.getInstance().getParsedString("game.menu.title", player))
.build();
render(player);
oldMenu.close();
menu.open(player);
}
private void render(Player player) {
int i = 0;
int item = 0;
int villagerLevel = Database.getInstance().getVillagerLevel(player.getUniqueId());
int startStacks = QSeller.getInstance().getInt("game.menu.startStacks");
int step = QSeller.getInstance().getInt("game.menu.step");
List<SellItem> items = QSeller.getInstance().getSellItemList("game.menu.items");
for (char ch : String.join("", QSeller.getInstance().getStringList("game.menu.structure")).toCharArray()) {
Slot slot = menu.getSlot(i);
ItemStack stack;
ItemMeta meta;
switch (ch) {
case '#':
stack = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) QSeller.getInstance().getInt("game.menu.backgroundColor"));
meta = stack.getItemMeta();
meta.setLocalizedName(" ");
stack.setItemMeta(meta);
slot.setItem(stack);
break;
case 'b':
stack = new ItemStack(Material.SIGN);
meta = stack.getItemMeta();
meta.setLocalizedName(QSeller.getInstance().getParsedString("game.menu.info.tittle", player));
meta.setLore(QSeller.getInstance().getParsedStringList("game.menu.info.lore", player));
stack.setItemMeta(meta);
slot.setItem(stack);
break;
case 'i':
if (item < items.size()) {
SellItem sellItem = items.get(item);
stack = new ItemStack(sellItem.getItem(),1, (byte) sellItem.getMeta());
if(stack.getType().equals(Material.AIR)) {
item++;
break;
}
meta = stack.getItemMeta();
meta.setLore(
QSeller.getInstance().getParsedStringList("game.menu.item.lore", player).stream()
.map(str -> str.replaceAll("\\{\\{price}}", String.valueOf(countPrice(player,sellItem,villagerLevel,startStacks, step))))
.map(str -> str.replaceAll("\\{\\{min_price}}", String.valueOf(sellItem.getBasePrice()+villagerLevel-1)))
.map(str -> str.replaceAll("\\{\\{progress_cur}}", String.valueOf(Database.getInstance().getItemProgress(player.getUniqueId(),stack.getType()))))
.map(str -> str.replaceAll("\\{\\{progress_max}}", String.valueOf(startStacks+(villagerLevel-1)*step)))
.collect(Collectors.toList())
);
stack.setItemMeta(meta);
slot.setItem(stack);
slot.setClickHandler(this::sell);
} else {
stack = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 8);
meta = stack.getItemMeta();
meta.setLocalizedName(" ");
stack.setItemMeta(meta);
slot.setItem(stack);
}
item++;
break;
}
i++;
}
}
public void open(Player player) {
menu = ChestMenu.builder(6)
.title(QSeller.getInstance().getParsedString("game.menu.title", player))
.build();
render(player);
menu.open(player);
}
}