Added bulk selling/buying

This commit is contained in:
Teriuihi 2022-01-05 21:42:23 +01:00
parent deb2494ce4
commit 149dd46eaf
3 changed files with 82 additions and 31 deletions

View File

@ -20,6 +20,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@ -27,7 +28,7 @@ public class BuyGUI extends GUIMerchant {
private static final MiniMessage miniMessage = MiniMessage.miniMessage();
public BuyGUI(VillagerType villagerType, EconUser econUser) {
public BuyGUI(VillagerType villagerType, EconUser econUser, boolean bulk) {
super(miniMessage.deserialize(Config.BUY_WINDOW, TemplateResolver.resolving(
Template.template("trader", villagerType.getDisplayName()),
Template.template("points", String.valueOf(Objects.requireNonNullElse(
@ -35,6 +36,8 @@ public class BuyGUI extends GUIMerchant {
0)))
)), villagerType);
for (ItemStack itemStack : villagerType.getBuying()) {
if (bulk)
itemStack.setAmount(itemStack.getMaxStackSize());
Price price = Utilities.getPrice(itemStack, WorthConfig.buy);
if (price == null)
continue;
@ -58,7 +61,8 @@ public class BuyGUI extends GUIMerchant {
if (balance < cost) {
player.sendMiniMessage(Config.NOT_ENOUGH_MONEY, List.of(
Template.template("money", String.valueOf(Utilities.round(balance, 2))),
Template.template("price", String.valueOf(cost))));
Template.template("price", String.valueOf(cost))
));
return;
}

View File

@ -18,8 +18,10 @@ import java.util.Objects;
public class OpenGUI extends GUIInventory {
private static final ItemStack BULK_BUY = new ItemStack(Material.GOLD_BLOCK);
private static final ItemStack BUY = new ItemStack(Material.GOLD_INGOT);
private static final ItemStack SELL = new ItemStack(Material.BUCKET);
private static final ItemStack BULK_SELL = new ItemStack(Material.CAULDRON);
private static final MiniMessage miniMessage;
static {
miniMessage = MiniMessage.miniMessage();
@ -34,6 +36,16 @@ public class OpenGUI extends GUIInventory {
itemMeta.displayName(miniMessage.deserialize("<green>Sell</green>"));
SELL.setItemMeta(itemMeta);
}
{
itemMeta = BULK_BUY.getItemMeta();
itemMeta.displayName(miniMessage.deserialize("<green>Bulk Buy</green>"));
BULK_BUY.setItemMeta(itemMeta);
}
{
itemMeta = BULK_SELL.getItemMeta();
itemMeta.displayName(miniMessage.deserialize("<green>Bulk Sell</green>"));
BULK_SELL.setItemMeta(itemMeta);
}
}
public OpenGUI(VillagerType villagerType, EconUser econUser) {
@ -43,29 +55,57 @@ public class OpenGUI extends GUIInventory {
econUser.getPointsMap().get(villagerType.getName()),
0)))))
);
setItem(1, BUY, player -> new BukkitRunnable() {
@Override
public void run() {
BuyGUI buyGUI = new BuyGUI(villagerType, econUser);
new BukkitRunnable() {
@Override
public void run() {
buyGUI.open(player);
}
}.runTask(VillagerUI.getInstance());
}
}.runTaskAsynchronously(VillagerUI.getInstance()));
setItem(3, SELL, player -> new BukkitRunnable() {
@Override
public void run() {
SellGUI sellGUI = new SellGUI(villagerType, econUser);
new BukkitRunnable() {
@Override
public void run() {
sellGUI.open(player);
}
}.runTask(VillagerUI.getInstance());
}
}.runTaskAsynchronously(VillagerUI.getInstance()));
if (!villagerType.getBuying().isEmpty()) {
setItem(0, BULK_BUY, player -> new BukkitRunnable() {
@Override
public void run() {
BuyGUI buyGUI = new BuyGUI(villagerType, econUser, true);
new BukkitRunnable() {
@Override
public void run() {
buyGUI.open(player);
}
}.runTask(VillagerUI.getInstance());
}
}.runTaskAsynchronously(VillagerUI.getInstance()));
setItem(1, BUY, player -> new BukkitRunnable() {
@Override
public void run() {
BuyGUI buyGUI = new BuyGUI(villagerType, econUser, false);
new BukkitRunnable() {
@Override
public void run() {
buyGUI.open(player);
}
}.runTask(VillagerUI.getInstance());
}
}.runTaskAsynchronously(VillagerUI.getInstance()));
}
if (!villagerType.getSelling().isEmpty()) {
setItem(3, SELL, player -> new BukkitRunnable() {
@Override
public void run() {
SellGUI sellGUI = new SellGUI(villagerType, econUser, false);
new BukkitRunnable() {
@Override
public void run() {
sellGUI.open(player);
}
}.runTask(VillagerUI.getInstance());
}
}.runTaskAsynchronously(VillagerUI.getInstance()));
setItem(4, BULK_SELL, player -> new BukkitRunnable() {
@Override
public void run() {
SellGUI sellGUI = new SellGUI(villagerType, econUser, true);
new BukkitRunnable() {
@Override
public void run() {
sellGUI.open(player);
}
}.runTask(VillagerUI.getInstance());
}
}.runTaskAsynchronously(VillagerUI.getInstance()));
}
}
}

View File

@ -30,34 +30,41 @@ public class SellGUI extends GUIMerchant {
private static final MiniMessage miniMessage = MiniMessage.miniMessage();
public SellGUI(VillagerType villagerType, EconUser econUser) {
public SellGUI(VillagerType villagerType, EconUser econUser, boolean bulk) {
super(MiniMessage.miniMessage().deserialize(Config.SELL_WINDOW, TemplateResolver.resolving(
Template.template("trader", villagerType.getDisplayName()),
Template.template("points", String.valueOf(Objects
.requireNonNullElse(econUser.getPointsMap().get(villagerType.getName())
, 0))))), villagerType);
for (ItemStack itemStack : villagerType.getSelling()) {
if (bulk)
itemStack.setAmount(1);
Price price = Utilities.getPrice(itemStack, WorthConfig.sell);
if (price == null)
continue;
addItem(itemStack,
getPriceItem(price.getPrice(itemStack.getAmount())),
null,
player -> sell(villagerType, player, itemStack.getType(), itemStack.getAmount(), price)
player -> sell(villagerType, player, itemStack.getType(), itemStack.getAmount(), price, bulk)
);
}
}
private void sell(VillagerType villagerType, Player player, Material material, int amount, Price price) {
private void sell(VillagerType villagerType, Player player, Material material, int amount, Price price, boolean bulk) {
PlayerInventory inventory = player.getInventory();
if (!inventory.containsAtLeast(new ItemStack(material), amount)) {
if (!inventory.containsAtLeast(new ItemStack(material), bulk ? 1 : amount)) {
player.sendMiniMessage(Config.NOT_ENOUGH_ITEMS, List.of(
Template.template("type", material.name()),
Template.template("amount", String.valueOf(amount))));
Template.template("amount", String.valueOf(bulk ? 1 : amount))));
return;
}
if (bulk)
amount = Arrays.stream(inventory.getContents())
.filter(Objects::nonNull)
.filter(itemStack -> itemStack.getType().equals(material))
.mapToInt(ItemStack::getAmount).sum();
Economy econ = VillagerUI.getInstance().getEconomy();
EconUser econUser = EconUser.getUser(player.getUniqueId());
int oldPoints = Objects.requireNonNullElse(econUser.getPointsMap().get(villagerType.getName()), 0);