Ошибка множителя суммы предмета в графическом интерфейсеJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка множителя суммы предмета в графическом интерфейсе

Сообщение Anonymous »

У меня есть этот графический интерфейс, в середине которого находится элемент, который ранее был получен из другого класса, и количество этого элемента можно увеличить или уменьшить с помощью кнопок. Когда у игрока есть нужная сумма, он может щелкнуть алмазы и получить предмет, если у него достаточно дублонов. Но у меня возникла проблема: когда игрок открывает графический интерфейс и, скажем, хочет получить один из этих предметов, а затем нажимает «Подтвердить» (он же бриллиант), затем он дает ему 1 элемент, и графический интерфейс закрывается. Однако, если они снова откроют графический интерфейс и скажем, что им снова нужен один предмет, они снова нажмут кнопку «Подтвердить», и теперь в их инвентаре будет всего 3 таких предмета. Оно продолжает увеличиваться до тех пор, пока сервер не будет перезапущен, а затем все начинается заново. По сути, это означает, что он получает последнюю покупку плюс новую, и это то, что получает игрок, и сумма продолжает расти.
Вот мой код:

Код: Выделить всё

package pro.jabo.jabo.gui;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import pro.jabo.jabo.utils.PlayerConfigUtils;

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

public class PurchaseItemGUI implements Listener {

private final Inventory inventory;
private int amount = 1;
private final PlayerConfigUtils playerConfigUtils;
private final UUID shopOwnerUUID;
private final double pricePerItem;
private final String shopName;
private boolean isConfirming = false;

public PurchaseItemGUI(JavaPlugin plugin, ItemStack item, Player player, UUID shopOwnerUUID, double pricePerItem, String shopName) {
this.playerConfigUtils = new PlayerConfigUtils(plugin);
this.shopOwnerUUID = shopOwnerUUID;
this.pricePerItem = pricePerItem;
this.shopName = shopName;

this.inventory = Bukkit.createInventory(null, 27, ChatColor.GOLD + "Purchase " + item.getType());

Bukkit.getPluginManager().registerEvents(this, plugin);

ItemStack itemToPurchase = new ItemStack(item);
itemToPurchase.setAmount(amount);
ItemMeta meta = itemToPurchase.getItemMeta();
meta.setDisplayName(ChatColor.GREEN + item.getType().name());
List lore = new ArrayList();
lore.add(ChatColor.WHITE + "Amount: " + amount);
lore.add(ChatColor.WHITE + "Total Price: " + pricePerItem * amount);
meta.setLore(lore);
itemToPurchase.setItemMeta(meta);

inventory.setItem(13, itemToPurchase);

setControlButtons();
}

private void setControlButtons() {
inventory.setItem(10, createButton(Material.REDSTONE, ChatColor.RED + "-10"));
inventory.setItem(11, createButton(Material.REDSTONE, ChatColor.RED + "-1"));
inventory.setItem(15, createButton(Material.EMERALD, ChatColor.GREEN + "+1"));
inventory.setItem(16, createButton(Material.EMERALD, ChatColor.GREEN + "+10"));
inventory.setItem(22, createButton(Material.DIAMOND, ChatColor.BLUE + "CONFIRM"));
}

private ItemStack createButton(Material material, String name) {
ItemStack item = new ItemStack(material);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(name);
item.setItemMeta(meta);
return item;
}

public Inventory getInventory() {
return inventory;
}

public String getShopName() {
return shopName;
}

public UUID getShopOwnerUUID() {
return shopOwnerUUID;
}

@EventHandler
public void onButtonClick(InventoryClickEvent event) {
if (!event.getView().getTitle().startsWith(ChatColor.GOLD + "Purchase ")) {
return;
}

event.setCancelled(true);

Player player = (Player) event.getWhoClicked();
ItemStack clickedItem = event.getCurrentItem();

if (clickedItem == null || clickedItem.getType() == Material.AIR) {
return;
}

if (clickedItem.getType() == Material.REDSTONE && clickedItem.getItemMeta().getDisplayName().equals(ChatColor.RED + "-10")) {
amount = Math.max(1, amount - 10);
} else if (clickedItem.getType() == Material.REDSTONE && clickedItem.getItemMeta().getDisplayName().equals(ChatColor.RED + "-1")) {
amount = Math.max(1, amount - 1);
} else if (clickedItem.getType() == Material.EMERALD && clickedItem.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "+1")) {
amount++;
} else if (clickedItem.getType() == Material.EMERALD &&  clickedItem.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "+10")) {
amount += 10;
} else if (clickedItem.getType() == Material.DIAMOND && clickedItem.getItemMeta().getDisplayName().equals(ChatColor.BLUE + "CONFIRM")) {
if (!isConfirming) {
isConfirming = true;
confirmPurchase(player);
isConfirming = false;
}
}

updateGUI();
}

private void updateGUI() {
ItemStack item = inventory.getItem(13);
if (item != null) {
ItemMeta meta = item.getItemMeta();
if (meta != null) {
List lore = new ArrayList();
lore.add(ChatColor.WHITE + "Amount: " + amount);
lore.add(ChatColor.WHITE + "Total Price: " + pricePerItem * amount);
meta.setLore(lore);
item.setItemMeta(meta);
inventory.setItem(13, item);
}
}
}

private void confirmPurchase(Player player) {
double totalCost = pricePerItem * amount;
FileConfiguration playerConfig = playerConfigUtils.getPlayerConfig(player.getUniqueId());
int playerDoubloons = playerConfig.getInt("doubloons");

if (playerDoubloons < totalCost) {
player.sendMessage(ChatColor.RED + "You do not have enough doubloons.");
player.closeInventory();
return;
}

playerConfig.set("doubloons", playerDoubloons - totalCost);
FileConfiguration shopOwnerConfig = playerConfigUtils.getPlayerConfig(shopOwnerUUID);
int shopOwnerDoubloons = shopOwnerConfig.getInt("doubloons");
shopOwnerConfig.set("doubloons", shopOwnerDoubloons + totalCost);

ItemStack purchasedItem = new ItemStack(inventory.getItem(13));
purchasedItem.setAmount(amount);
player.getInventory().addItem(purchasedItem);

player.sendMessage(ChatColor.GREEN + "Purchase successful!");

playerConfigUtils.savePlayerConfig(player.getUniqueId(), playerConfig);
playerConfigUtils.savePlayerConfig(shopOwnerUUID, shopOwnerConfig);
player.updateInventory();

amount = 1;
updateGUI();

player.closeInventory();
}
}

Я пробовал много разных способов сброса суммы, но несмотря ни на что, игроку каждый раз выдается последняя покупка плюс новая покупка!

Подробнее здесь: https://stackoverflow.com/questions/787 ... bug-in-gui
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»