Вопрос При первом открытии меню totalPages = 0

Версия Minecraft
1.12.X

GoldenSunsetMine

Пользователь
Сообщения
91
Возникла такая проблема, что при первом открытии меню после запуска сервера, либо при первом открытии меню когда количество его страниц изменилось, totalPages = 0 и из-за этой проблемы, когда totalPages = 0, меню не доступно для исполнения Listener и вообще ни для чего. Вот при повторном открытии меню, оно уже начинает нормально функционировать и totalPages устанавливается на нужное значение. Помогите исправить и сделать чтобы меню всегда нормально функционировало и всегда устанавливалось правильное значение totalPages. Я перепробовал очень много способов и ни один не оказался результатным.

Java:
package com.bodya.rpbank.GUI.Computer;

import com.bodya.rpbank.Balance.BankAccounts;
import com.bodya.rpbank.Balance.Credits;
import com.bodya.rpbank.Balance.Fines;
import com.bodya.rpbank.Main;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;

public class AllAccountsGUI {

    public static int currentPage = 0;
    public static int totalPages = 0;

    public static Inventory openBankAccountsGUI(Player player, int page) {
        FileConfiguration config = YamlConfiguration.loadConfiguration(new File(Main.getInstance().getDataFolder() + "/data/bankaccounts.yml"));
        ConfigurationSection accountsSection = config.getConfigurationSection("");

        Inventory accountsMenu = Bukkit.createInventory(player, 54, "Банковские счета (" + (page + 1) + "/" + totalPages + ")");

        if (accountsSection != null) {
            List<ItemStack> accountItems = new ArrayList<>();

            for (String ownerUUID : accountsSection.getKeys(false)) {
                ConfigurationSection ownerSection = accountsSection.getConfigurationSection(ownerUUID);

                if (ownerSection != null) {
                    UUID offlineOwnerUUID = UUID.fromString(ownerUUID);
                    OfflinePlayer offlineOwner = Bukkit.getOfflinePlayer(offlineOwnerUUID);
                    String ownerName = offlineOwner.getName();

                    for (String accountNumber : ownerSection.getKeys(false)) {
                        String accountPath = ownerUUID + "." + accountNumber;

                        if (config.isConfigurationSection(accountPath)) {
                            String accountName = config.getString(accountPath + ".name");
                            String category = config.getString(accountPath + ".category");
                            BankAccounts.AccountStatus status = BankAccounts.AccountStatus.valueOf(config.getString(accountPath + ".status"));

                            Fines fines = new Fines(Integer.parseInt(accountNumber));
                            int numberOfFines = fines.getNumberOfFines(Integer.parseInt(accountNumber));
                            String finesL = (numberOfFines > 0) ? ChatColor.RED + "да" : ChatColor.YELLOW + "нет";

                            Credits credits = new Credits(Integer.parseInt(accountNumber));
                            int numberOfCredits = credits.getNumberOfCredits(Integer.parseInt(accountNumber));
                            String creditsL = (numberOfCredits > 0) ? ChatColor.RED + "да" : ChatColor.YELLOW + "нет";

                            String accountDisplayName = ChatColor.translateAlternateColorCodes('&', "&a► &fСчёт #" + accountNumber);
                            ItemStack accountItem = createAccountItem(accountDisplayName, accountName, category, status, ownerName, finesL, creditsL);
                            accountItems.add(accountItem);
                            addBackGUIItem(accountsMenu);
                        }
                    }
                }
            }

            accountItems.sort(new Comparator<ItemStack>() {
                @Override
                public int compare(ItemStack item1, ItemStack item2) {
                    String category1 = item1.getItemMeta().getLore().get(2).replace(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Категория: &e"), "");
                    String category2 = item2.getItemMeta().getLore().get(2).replace(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Категория: &e"), "");
                    return category1.compareToIgnoreCase(category2);
                }
            });

            int start = page * 45;
            int end = Math.min((page + 1) * 45, accountItems.size());

            for (int i = start; i < end; i++) {
                accountsMenu.addItem(accountItems.get(i));
            }

            totalPages = calculateTotalPages(accountItems);

            if (accountItems.size() > 45) {
                addBackItem(accountsMenu, page);
                addForwardItem(accountsMenu, page);
            }

            player.openInventory(accountsMenu);
            currentPage = page;
        }
        return accountsMenu;
    }

    private static int calculateTotalPages(List<ItemStack> accountItems) {
        return (int) Math.ceil((double) accountItems.size() / 45);
    }

    private static void addBackGUIItem(Inventory menu) {
        ItemStack back = new ItemStack(Material.ARROW);
        ItemMeta meta_back = back.getItemMeta();
        meta_back.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&7Вернуться назад..."));
        back.setItemMeta(meta_back);
        menu.setItem(45, back);
    }

    private static void addBackItem(Inventory menu, int page) {
        if (page > 0) {
            ItemStack back = new ItemStack(Material.ARROW);
            ItemMeta meta_back = back.getItemMeta();
            meta_back.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&f<---"));
            back.setItemMeta(meta_back);
            menu.setItem(52, back);
        }
    }

    private static void addForwardItem(Inventory menu, int page) {
        if (page < totalPages - 1) {
            ItemStack forward = new ItemStack(Material.ARROW);
            ItemMeta meta_forward = forward.getItemMeta();
            meta_forward.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&f--->"));
            forward.setItemMeta(meta_forward);
            menu.setItem(53, forward);
        }
    }

    private static ItemStack createAccountItem(String accountDisplayName, String accountName, String category, BankAccounts.AccountStatus status, String ownerName, String finesL, String creditsL) {
        Material material;

        if (status == BankAccounts.AccountStatus.OPENED) {
            material = Material.PAPER;
        } else {
            material = Material.EMPTY_MAP;
        }
        ItemStack accountItem = new ItemStack(material);
        ItemMeta meta = accountItem.getItemMeta();
        String statusL = (status == BankAccounts.AccountStatus.OPENED) ? ChatColor.GREEN + "Открыт" : ChatColor.RED + "Заблокирован";
        meta.setDisplayName(accountDisplayName);
        List<String> lore = new ArrayList<>();
        lore.add("");
        lore.add(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Наименование: &e" + accountName));
        lore.add(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Категория: &e" + category));
        lore.add("");
        lore.add(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Наличие кредитов: &r" + creditsL));
        lore.add(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Наличие штрафов: &r" + finesL));
        lore.add("");
        lore.add(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Владелец: &e" + ownerName));
        lore.add(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Статус: &r" + statusL));
        lore.add("");
        lore.add(ChatColor.translateAlternateColorCodes('&', "&a➥ &fЛКМ &eчтобы открыть данный счёт"));
        lore.add(ChatColor.translateAlternateColorCodes('&', "&a➥ &fShift + ЛКМ &eчтобы поменять статус"));
        meta.setLore(lore);

        accountItem.setItemMeta(meta);
        return accountItem;
    }
}
 
Последнее редактирование:
Возникла такая проблема, что при первом открытии меню после запуска сервера, либо при первом открытии меню когда количество его страниц изменилось, totalPages = 0 и из-за этой проблемы, когда totalPages = 0, меню не доступно для исполнения Listener и вообще ни для чего. Вот при повторном открытии меню, оно уже начинает нормально функционировать и totalPages устанавливается на нужное значение. Помогите исправить и сделать чтобы меню всегда нормально функционировало и всегда устанавливалось правильное значение totalPages. Я перепробовал очень много способов и ни один не оказался результатным.

Java:
package com.bodya.rpbank.GUI.Computer;

import com.bodya.rpbank.Balance.BankAccounts;
import com.bodya.rpbank.Balance.Credits;
import com.bodya.rpbank.Balance.Fines;
import com.bodya.rpbank.Main;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;

public class AllAccountsGUI {

    public static int currentPage = 0;
    public static int totalPages = 0;

    public static Inventory openBankAccountsGUI(Player player, int page) {
        FileConfiguration config = YamlConfiguration.loadConfiguration(new File(Main.getInstance().getDataFolder() + "/data/bankaccounts.yml"));
        ConfigurationSection accountsSection = config.getConfigurationSection("");

        Inventory accountsMenu = Bukkit.createInventory(player, 54, "Банковские счета (" + (page + 1) + "/" + totalPages + ")");

        if (accountsSection != null) {
            List<ItemStack> accountItems = new ArrayList<>();

            for (String ownerUUID : accountsSection.getKeys(false)) {
                ConfigurationSection ownerSection = accountsSection.getConfigurationSection(ownerUUID);

                if (ownerSection != null) {
                    UUID offlineOwnerUUID = UUID.fromString(ownerUUID);
                    OfflinePlayer offlineOwner = Bukkit.getOfflinePlayer(offlineOwnerUUID);
                    String ownerName = offlineOwner.getName();

                    for (String accountNumber : ownerSection.getKeys(false)) {
                        String accountPath = ownerUUID + "." + accountNumber;

                        if (config.isConfigurationSection(accountPath)) {
                            String accountName = config.getString(accountPath + ".name");
                            String category = config.getString(accountPath + ".category");
                            BankAccounts.AccountStatus status = BankAccounts.AccountStatus.valueOf(config.getString(accountPath + ".status"));

                            Fines fines = new Fines(Integer.parseInt(accountNumber));
                            int numberOfFines = fines.getNumberOfFines(Integer.parseInt(accountNumber));
                            String finesL = (numberOfFines > 0) ? ChatColor.RED + "да" : ChatColor.YELLOW + "нет";

                            Credits credits = new Credits(Integer.parseInt(accountNumber));
                            int numberOfCredits = credits.getNumberOfCredits(Integer.parseInt(accountNumber));
                            String creditsL = (numberOfCredits > 0) ? ChatColor.RED + "да" : ChatColor.YELLOW + "нет";

                            String accountDisplayName = ChatColor.translateAlternateColorCodes('&', "&a► &fСчёт #" + accountNumber);
                            ItemStack accountItem = createAccountItem(accountDisplayName, accountName, category, status, ownerName, finesL, creditsL);
                            accountItems.add(accountItem);
                            addBackGUIItem(accountsMenu);
                        }
                    }
                }
            }

            accountItems.sort(new Comparator<ItemStack>() {
                @Override
                public int compare(ItemStack item1, ItemStack item2) {
                    String category1 = item1.getItemMeta().getLore().get(2).replace(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Категория: &e"), "");
                    String category2 = item2.getItemMeta().getLore().get(2).replace(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Категория: &e"), "");
                    return category1.compareToIgnoreCase(category2);
                }
            });

            int start = page * 45;
            int end = Math.min((page + 1) * 45, accountItems.size());

            for (int i = start; i < end; i++) {
                accountsMenu.addItem(accountItems.get(i));
            }

            totalPages = calculateTotalPages(accountItems);

            if (accountItems.size() > 45) {
                addBackItem(accountsMenu, page);
                addForwardItem(accountsMenu, page);
            }

            player.openInventory(accountsMenu);
            currentPage = page;
        }
        return accountsMenu;
    }

    private static int calculateTotalPages(List<ItemStack> accountItems) {
        return (int) Math.ceil((double) accountItems.size() / 45);
    }

    private static void addBackGUIItem(Inventory menu) {
        ItemStack back = new ItemStack(Material.ARROW);
        ItemMeta meta_back = back.getItemMeta();
        meta_back.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&7Вернуться назад..."));
        back.setItemMeta(meta_back);
        menu.setItem(45, back);
    }

    private static void addBackItem(Inventory menu, int page) {
        if (page > 0) {
            ItemStack back = new ItemStack(Material.ARROW);
            ItemMeta meta_back = back.getItemMeta();
            meta_back.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&f<---"));
            back.setItemMeta(meta_back);
            menu.setItem(52, back);
        }
    }

    private static void addForwardItem(Inventory menu, int page) {
        if (page < totalPages - 1) {
            ItemStack forward = new ItemStack(Material.ARROW);
            ItemMeta meta_forward = forward.getItemMeta();
            meta_forward.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&f--->"));
            forward.setItemMeta(meta_forward);
            menu.setItem(53, forward);
        }
    }

    private static ItemStack createAccountItem(String accountDisplayName, String accountName, String category, BankAccounts.AccountStatus status, String ownerName, String finesL, String creditsL) {
        Material material;

        if (status == BankAccounts.AccountStatus.OPENED) {
            material = Material.PAPER;
        } else {
            material = Material.EMPTY_MAP;
        }
        ItemStack accountItem = new ItemStack(material);
        ItemMeta meta = accountItem.getItemMeta();
        String statusL = (status == BankAccounts.AccountStatus.OPENED) ? ChatColor.GREEN + "Открыт" : ChatColor.RED + "Заблокирован";
        meta.setDisplayName(accountDisplayName);
        List<String> lore = new ArrayList<>();
        lore.add("");
        lore.add(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Наименование: &e" + accountName));
        lore.add(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Категория: &e" + category));
        lore.add("");
        lore.add(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Наличие кредитов: &r" + creditsL));
        lore.add(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Наличие штрафов: &r" + finesL));
        lore.add("");
        lore.add(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Владелец: &e" + ownerName));
        lore.add(ChatColor.translateAlternateColorCodes('&', "&6▎ &7Статус: &r" + statusL));
        lore.add("");
        lore.add(ChatColor.translateAlternateColorCodes('&', "&a➥ &fЛКМ &eчтобы открыть данный счёт"));
        lore.add(ChatColor.translateAlternateColorCodes('&', "&a➥ &fShift + ЛКМ &eчтобы поменять статус"));
        meta.setLore(lore);

        accountItem.setItemMeta(meta);
        return accountItem;
    }
}
я делал так:
Java:
public class AbstractGui {
    Inventory inv;
    Player player;
    int size;
    int index=-1;
    final HashMap<Integer, ItemStack[]> invs = new HashMap<>();

    public AbstractGui(Player player, int size) {
        this.size = size;
        this.inv = Bukkit.createInventory(player,size*9,"§0Инвентарь настройки лута");
        this.player = player;
    }

    public void show() {
        drawIndex(0,0);
        drawArrows();
        player.openInventory(inv);
        invs.put(0,inv.getContents());
    }
    public void saveItemsToConfig() {
        Data.clear();
        int as=0;
        for (ItemStack[] pair : invs.values()) {
            for (ItemStack item : pair) {
                if (item != null) {
                    if (item.getType() == Material.AIR) continue;
                    if (item.getItemMeta() != null && (item.getItemMeta().getDisplayName().equals(arrow().getItemMeta().getDisplayName()) || item.getItemMeta().getDisplayName().equals(divider().getItemMeta().getDisplayName()))) continue;
                    ItemMeta meta = item.getItemMeta();
                    if (meta.getPersistentDataContainer().has(new NamespacedKey("megakey_wokatrees","key"),
                            PersistentDataType.STRING)) {
                        int a = Integer.parseInt(meta.getPersistentDataContainer().get(new NamespacedKey("megakey_wokatrees","key"),
                                        PersistentDataType.STRING));
                        meta.getPersistentDataContainer().remove(new NamespacedKey("megakey_wokatrees","key"));
                        Data.addItem(item,a);
                        as++;
                        continue;
                    }
                    Data.addItem(item, 50); // шанс 50%
                    as++;
                }
            }
        }
        player.sendMessage("§aВсе изменения сохранены.");
        player.sendMessage("§aПредметов в луте: "+as);
    }

    private ItemStack arrow() {
        ItemStack arrow = new ItemStack(Material.ARROW);
        ItemMeta meta = arrow.getItemMeta();
        meta.setDisplayName("§6Поменять страницу");
        arrow.setItemMeta(meta);
        return arrow;
    }
    private ItemStack divider() {
        ItemStack arrow = new ItemStack(Material.BLACK_STAINED_GLASS_PANE);
        ItemMeta meta = arrow.getItemMeta();
        meta.setDisplayName("§7Нажми чтобы сохранить результат.");
        meta.setLore(Arrays.asList("","§7Результат автоматически","§7сохраняется каждое", "§7перелистывание страницы"));
        arrow.setItemMeta(meta);
        return arrow;
    }

    public void drawArrows() {
        inv.setItem((size*9)-1, arrow());
        inv.setItem((size*9)-2, divider());
        inv.setItem((size*9)-3, divider());
        inv.setItem((size*9)-4, divider());
        inv.setItem((size*9)-5, divider());
        inv.setItem((size*9)-6, divider());
        inv.setItem((size*9)-7, divider());
        inv.setItem((size*9)-8, divider());
        inv.setItem(((size-1)*9), arrow());
    }

    public void nextPage() {
        index++;

        drawIndex(index,-1);
        drawArrows();
    }

    public void drawIndex(int i, int z) {
        ItemStack[] page = invs.get(i);

        invs.put(i+z,inv.getContents());
        inv.clear();
        if (page != null) {
            List<ItemStack> ilist = new ArrayList<>(Arrays.asList(page));
            int d = page.length;
            for (int a=0; a<d; a++) {
                inv.setItem(a, ilist.get(a));
            }
        }
    }

    public void previousPage() {
        if (index <= 0) {
            return;
        }
        index--;

        drawIndex(index,1);
        drawArrows();
    }

    public void fillGui() {
        HashMap<String, Data.Pair<ItemStack, Integer>> map = Data.getItems();
        int totalPages = (int) Math.ceil((double) map.size() / ((size-1) * 9)); // Вычисляем общее количество страниц

        List<ItemStack> items = new ArrayList<>();
        for (Map.Entry<String, Data.Pair<ItemStack, Integer>> entry : map.entrySet()) {
            ItemStack item = entry.getValue().getKey();
            int value = entry.getValue().getValue();
            ItemMeta meta = item.getItemMeta();
            if (meta != null) {
                meta.getPersistentDataContainer().set(
                        new NamespacedKey("megakey_wokatrees", "key"),
                        PersistentDataType.STRING, String.valueOf(value));
            }
            item.setItemMeta(meta);
            if (item.getType() == Material.AIR) {
                continue;
            }
            items.add(item);
        }

        for (int a = 0; a < totalPages; a++) {
            int startIndex = a * (size-1) * 9;
            int endIndex = Math.min((a + 1) * (size-1) * 9, items.size());

            List<ItemStack> ilist = new ArrayList<>();
            for (int i = startIndex; i < endIndex; i++) {
                ilist.add(items.get(i));
            }
            int d = ilist.size();
            for (int i=0; i<d; i++) {
                inv.setItem(i, ilist.get(i));
            }
            invs.put(a, inv.getContents());
            inv.clear();
        }
        index++;
    }


}
Java:
public class GuiImpl extends AbstractGui {
    public static HashMap<Player, Consumer<InventoryClickEvent>> consumer = new HashMap<>();
    public static HashMap<Player, Runnable> runnable = new HashMap<>();
    public GuiImpl(Player player, int size) {
        super(player, size);
        fillGui();
        drawArrows();
        show();
        runnable.put(player, this::saveItemsToConfig);
        consumer.put(player, e -> {
            Player p = (Player) e.getWhoClicked();
            if (e.getSlot() == (size*9)-1) {
                nextPage();
                e.setCancelled(true);
                return;
            }
            if (e.getSlot() == (size*9)-2 ||
                    e.getSlot() == (size*9)-3 ||
                    e.getSlot() == (size*9)-4 ||
                    e.getSlot() == (size*9)-5 ||
                    e.getSlot() == (size*9)-6 ||
                    e.getSlot() == (size*9)-7 ||
                    e.getSlot() == (size*9)-8 ) {
                invs.put(index,inv.getContents());
                p.sendMessage("§aРезультат сохранен под индексом "+index);
                e.setCancelled(true);
            }
            if (e.getSlot() == ((size-1)*9)) {
                previousPage();
                e.setCancelled(true);
            }
        });
    }

}
Java:
@EventHandler
    public void onHandle(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        if (e.getView().getTitle().equals("§0Инвентарь настройки лута")) {
            if (GuiImpl.consumer.containsKey(p) && e.getClickedInventory() == e.getView().getTopInventory()) {
                GuiImpl.consumer.get(p).accept(e);
            }
        }
    }

Вам необходимо зарегистрироваться для просмотра изображений-вложений
 
Назад
Сверху Снизу