1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Почему создаётся копия предмета в меню

Тема в разделе "Разработка плагинов для новичков", создана пользователем QuodLitee, 11 фев 2024.

  1. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    делаю плагин который будет выдавать головы с метой через меню.
    Баг происходит, когда игрок открывает меню с наличием в инвентаре head1(), то этот head1() копируется в меню и помещается в первый свободной слот.
    Код:
    public static void openMenu(Player player) {
            inventory = Bukkit.createInventory(player, Main.cfg.getInt("gui.slots"), ColorUtil.color(Main.cfg.getString("title")));
            setItem1();
            player.openInventory(inventory);
        }
    Код:
    public static void setItem1() {
            ItemStack stack = new ItemStack(Material.getMaterial(Main.cfg.getString("gui.item.1.material")));
            if (Main.cfg.get("gui.item.1.id") != null)
                StackUtil.setSkullOwner(stack, Main.cfg.getString("gui.item.1.id"));
            ItemMeta meta = stack.getItemMeta();
            meta.setDisplayName(ColorUtil.color(Main.cfg.getString("gui.item.1.name")));
            List<String> lore = new ArrayList<>();
            for (String s : Main.cfg.getStringList("gui.item.1.lore"))
                lore.add(ColorUtil.color(s));
            meta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 5, true);
            meta.addEnchant(Enchantment.PROTECTION_FIRE, 5, true);
            meta.addEnchant(Enchantment.PROTECTION_PROJECTILE, 5, true);
            meta.addEnchant(Enchantment.OXYGEN, 5, true);
            meta.addEnchant(Enchantment.WATER_WORKER, 2, true);
            meta.addAttributeModifier(Attribute.GENERIC_ATTACK_SPEED,
                    new AttributeModifier(UUID.randomUUID(), "generic.attack_speed", 0.25, AttributeModifier.Operation.MULTIPLY_SCALAR_1, EquipmentSlot.HEAD));
            meta.addAttributeModifier(Attribute.GENERIC_ATTACK_DAMAGE,
                    new AttributeModifier(UUID.randomUUID(), "generic.attack_damage", 1, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HEAD));
            meta.addAttributeModifier(Attribute.GENERIC_ARMOR_TOUGHNESS,
                    new AttributeModifier(UUID.randomUUID(), "generic.armor_toughness", 2.5, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HEAD));
            meta.addAttributeModifier(Attribute.GENERIC_ARMOR,
                    new AttributeModifier(UUID.randomUUID(), "generic.armor", 3, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HEAD));
            if (Main.cfg.getBoolean("enable-hide")) {
                meta.hasItemFlag(ItemFlag.HIDE_ATTRIBUTES);
                meta.hasItemFlag(ItemFlag.HIDE_ENCHANTS);
            }
            meta.setLore(lore);
            stack.setItemMeta(meta);
            inventory.setItem(Main.cfg.getInt("gui.item.1.slot"), stack);
        }
    Код:
    public static ItemStack head1() {
            ItemStack item1 = new ItemStack(Objects.requireNonNull(Material.getMaterial(ColorUtil.color(Main.heads.getString("Head1.material")))), 1);
            if (Main.heads.get("Head1.id") != null)
                StackUtil.setSkullOwner(item1, Objects.requireNonNull(Main.heads.getString(("Head1.id"))));
            ItemMeta meta = item1.getItemMeta();
            List<String> lore = new ArrayList<>();
            meta.setDisplayName(ColorUtil.color(Main.heads.getString("Head1.name")));
            for (String s : Main.heads.getStringList("Head1.lore"))
                lore.add(ColorUtil.color(s));
            meta.setLore(lore);
            meta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 5, true);
            meta.addEnchant(Enchantment.PROTECTION_FIRE, 5, true);
            meta.addEnchant(Enchantment.PROTECTION_PROJECTILE, 5, true);
            meta.addEnchant(Enchantment.OXYGEN, 5, true);
            meta.addEnchant(Enchantment.WATER_WORKER, 2, true);
            meta.addAttributeModifier(Attribute.GENERIC_ATTACK_SPEED,
                    new AttributeModifier(UUID.randomUUID(), "generic.attack_speed", 0.25, AttributeModifier.Operation.MULTIPLY_SCALAR_1, EquipmentSlot.HEAD));
            meta.addAttributeModifier(Attribute.GENERIC_ATTACK_DAMAGE,
                    new AttributeModifier(UUID.randomUUID(), "generic.attack_damage", 1, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HEAD));
            meta.addAttributeModifier(Attribute.GENERIC_ARMOR_TOUGHNESS,
                    new AttributeModifier(UUID.randomUUID(), "generic.armor_toughness", 2.5, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HEAD));
            meta.addAttributeModifier(Attribute.GENERIC_ARMOR,
                    new AttributeModifier(UUID.randomUUID(), "generic.armor", 3, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HEAD));
            item1.setItemMeta(meta);
            return item1;
        }
     
  2. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Копирование айтемстаков в меню это особенность баккита. А вот почему вставляется на первый свободный слот придётся дебажить.
     
  3. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    Что значит особенность баккита? То есть клонирование айтемстака из инвентаря в меню это особенность?
     
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Сам себе этот вопрос задай.. Bukkit.createInventory(player,
     
  5. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    А где в коде копия создаётся?

    Не указывай player в качестве холдера инвентаря.
    Помимо этого, я рекомендую инвентарь передавать в метод в качестве параметра, а не тащить его из поля, тем более статического
     
  6. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    Баг с копированием исчез, но появился другой, теперь все головы в ивентаре в количестве двух штук
     
  7. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    upload_2024-2-12_19-48-31.png
    Точнее все 6 итемов не важно голова это или другой блок стакаются в 2 штуки
     
  8. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ну вон предмет снизу не подублировался.

    Показывай полный код класса. Я, например, не вижу, где head1() вызывается
     
  9. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    Код:
    public class Gui implements Listener {
    
        public static void openMenu(Player player) {
            Inventory gui = Bukkit.createInventory(null, 9 * Main.cfg.getInt("gui.rows"), ColorUtil.color(Main.cfg.getString("title")));
            setItem1(gui);
            setItem2(gui);
            setItem3(gui);
            setItem4(gui);
            setItem5(gui);
            setItem6(gui);
            setItem7(gui);
            player.openInventory(gui);
        }
        public static void setItem1(Inventory gui) {
            ItemStack stack = new ItemStack(Material.getMaterial(Main.cfg.getString("gui.item.1.material")), 1);
            if (Main.cfg.get("gui.item.1.id") != null)
                StackUtil.setSkullOwner(stack, Main.cfg.getString("gui.item.1.id"));
            ItemMeta meta = stack.getItemMeta();
            meta.setDisplayName(ColorUtil.color(Main.cfg.getString("gui.item.1.name")));
            List<String> lore = new ArrayList<>();
            for (String s : Main.cfg.getStringList("gui.item.1.lore"))
                lore.add(ColorUtil.color(s));
            meta.setLore(lore);
            stack.setItemMeta(meta);
            gui.setItem(Main.cfg.getInt("gui.item.1.slot"), stack);
        }
    
        public static void setItem2(Inventory gui) {
            ItemStack stack = new ItemStack(Material.getMaterial(Main.cfg.getString("gui.item.2.material")), 1);
            if (Main.cfg.get("gui.item.2.id") != null)
                StackUtil.setSkullOwner(stack, Main.cfg.getString("gui.item.2.id"));
            ItemMeta meta = stack.getItemMeta();
            meta.setDisplayName(ColorUtil.color(Main.cfg.getString("gui.item.2.name")));
            List<String> lore = new ArrayList<>();
            for (String s : Main.cfg.getStringList("gui.item.2.lore"))
                lore.add(ColorUtil.color(s));
            meta.setLore(lore);
            stack.setItemMeta(meta);
            gui.setItem(Main.cfg.getInt("gui.item.2.slot"), stack);
        }
    
        public static void setItem3(Inventory gui) {
            ItemStack stack = new ItemStack(Material.getMaterial(Main.cfg.getString("gui.item.3.material")), 1);
            if (Main.cfg.get("gui.item.3.id") != null)
                StackUtil.setSkullOwner(stack, Main.cfg.getString("gui.item.3.id"));
            ItemMeta meta = stack.getItemMeta();
            meta.setDisplayName(ColorUtil.color(Main.cfg.getString("gui.item.3.name")));
            List<String> lore = new ArrayList<>();
            for (String s : Main.cfg.getStringList("gui.item.3.lore"))
                lore.add(ColorUtil.color(s));
            meta.setLore(lore);
            stack.setItemMeta(meta);
            gui.setItem(Main.cfg.getInt("gui.item.3.slot"), stack);
        }
    
        public static void setItem4(Inventory gui) {
            ItemStack stack = new ItemStack(Material.getMaterial(Main.cfg.getString("gui.item.4.material")), 1);
            if (Main.cfg.get("gui.item.4.id") != null)
                StackUtil.setSkullOwner(stack, Main.cfg.getString("gui.item.4.id"));
            ItemMeta meta = stack.getItemMeta();
            meta.setDisplayName(ColorUtil.color(Main.cfg.getString("gui.item.4.name")));
            List<String> lore = new ArrayList<>();
            for (String s : Main.cfg.getStringList("gui.item.4.lore"))
                lore.add(ColorUtil.color(s));
            meta.setLore(lore);
            stack.setItemMeta(meta);
            gui.setItem(Main.cfg.getInt("gui.item.4.slot"), stack);
        }
    
        public static void setItem5(Inventory gui) {
            ItemStack stack = new ItemStack(Material.getMaterial(Main.cfg.getString("gui.item.5.material")), 1);
            if (Main.cfg.get("gui.item.5.id") != null)
                StackUtil.setSkullOwner(stack, Main.cfg.getString("gui.item.5.id"));
            ItemMeta meta = stack.getItemMeta();
            meta.setDisplayName(ColorUtil.color(Main.cfg.getString("gui.item.5.name")));
            List<String> lore = new ArrayList<>();
            for (String s : Main.cfg.getStringList("gui.item.5.lore"))
                lore.add(ColorUtil.color(s));
            meta.setLore(lore);
            stack.setItemMeta(meta);
            gui.setItem(Main.cfg.getInt("gui.item.5.slot"), stack);
        }
    
        public static void setItem6(Inventory gui) {
            ItemStack stack = new ItemStack(Material.getMaterial(Main.cfg.getString("gui.item.6.material")), 1);
            if (Main.cfg.get("gui.item.6.id") != null)
                StackUtil.setSkullOwner(stack, Main.cfg.getString("gui.item.6.id"));
            ItemMeta meta = stack.getItemMeta();
            meta.setDisplayName(ColorUtil.color(Main.cfg.getString("gui.item.6.name")));
            List<String> lore = new ArrayList<>();
            for (String s : Main.cfg.getStringList("gui.item.6.lore"))
                lore.add(ColorUtil.color(s));
            meta.setLore(lore);
            stack.setItemMeta(meta);
            gui.setItem(Main.cfg.getInt("gui.item.6.slot"), stack);
        }
    
        public static void setItem7(Inventory gui) {
            ItemStack stack = new ItemStack(Material.getMaterial(Main.cfg.getString("gui.item.7.material")), 1);
            if (Main.cfg.get("gui.item.7.id") != null)
                StackUtil.setSkullOwner(stack, Main.cfg.getString("gui.item.7.id"));
            ItemMeta meta = stack.getItemMeta();
            meta.setDisplayName(ColorUtil.color(Main.cfg.getString("gui.item.7.name")));
            List<String> lore = new ArrayList<>();
            for (String s : Main.cfg.getStringList("gui.item.7.lore"))
                lore.add(ColorUtil.color(s));
            meta.setLore(lore);
            stack.setItemMeta(meta);
            gui.setItem(Main.cfg.getInt("gui.item.7.slot"), stack);
        }
    
        @EventHandler
        public void onClick(InventoryClickEvent event) {
            Player player = (Player) event.getWhoClicked();
            ItemStack item = event.getCurrentItem();
            int slot = event.getSlot();
            if (event.getView().getTitle().equalsIgnoreCase(ColorUtil.color(Main.cfg.getString("title")))) {
                if (item != null && item.getItemMeta() != null) {
                    if (slot == Main.cfg.getInt("gui.item.1.slot")) {
                        if (Main.ppAPI.look(player.getUniqueId()) >= Main.cfg.getInt("gui.item.1.cost")) {
                            Main.ppAPI.take(player.getUniqueId(), Main.cfg.getInt("gui.item.1.cost"));
                            for (String s : Main.cfg.getStringList("gui.item.1.purchase"))
                                player.sendMessage(s);
                            player.closeInventory();
                            player.getInventory().addItem(ItemSUtils.head1());
                        } else {
                            for (String s : Main.cfg.getStringList("noMoney"))
                                player.sendMessage(s);
                            player.closeInventory();
                        }
                    }
                    if (slot == Main.cfg.getInt("gui.item.2.slot")) {
                        if (Main.ppAPI.look(player.getUniqueId()) >= Main.cfg.getInt("gui.item.2.cost")) {
                            Main.ppAPI.take(player.getUniqueId(), Main.cfg.getInt("gui.item.2.cost"));
                            for (String s : Main.cfg.getStringList("gui.item.2.purchase"))
                                player.sendMessage(s);
                            player.closeInventory();
                            player.getInventory().addItem(ItemSUtils.head2());
                        } else {
                            for (String s : Main.cfg.getStringList("noMoney"))
                                player.sendMessage(s);
                            player.closeInventory();
                        }
    
                    }
                    if (slot == Main.cfg.getInt("gui.item.3.slot")) {
                        if (Main.ppAPI.look(player.getUniqueId()) >= Main.cfg.getInt("gui.item.3.cost")) {
                            Main.ppAPI.take(player.getUniqueId(), Main.cfg.getInt("gui.item.3.cost"));
                            for (String s : Main.cfg.getStringList("gui.item.3.purchase"))
                                player.sendMessage(s);
                            player.closeInventory();
                            player.getInventory().addItem(ItemSUtils.head3());
                        } else {
                            for (String s : Main.cfg.getStringList("noMoney"))
                                player.sendMessage(s);
                            player.closeInventory();
                        }
                    }
                    if (slot == Main.cfg.getInt("gui.item.4.slot")) {
                        if (Main.ppAPI.look(player.getUniqueId()) >= Main.cfg.getInt("gui.item.4.cost")) {
                            Main.ppAPI.take(player.getUniqueId(), Main.cfg.getInt("gui.item.4.cost"));
                            for (String s : Main.cfg.getStringList("gui.item.4.purchase"))
                                player.sendMessage(s);
                            player.closeInventory();
                            player.getInventory().addItem(ItemSUtils.head4());
                        } else {
                            for (String s : Main.cfg.getStringList("noMoney"))
                                player.sendMessage(s);
                            player.closeInventory();
                        }
                    }
                    if (slot == Main.cfg.getInt("gui.item.5.slot")) {
                        if (Main.ppAPI.look(player.getUniqueId()) >= Main.cfg.getInt("gui.item.5.cost")) {
                            Main.ppAPI.take(player.getUniqueId(), Main.cfg.getInt("gui.item.5.cost"));
                            for (String s : Main.cfg.getStringList("gui.item.5.purchase"))
                                player.sendMessage(s);
                            player.closeInventory();
                            player.getInventory().addItem(ItemSUtils.head5());
                        } else {
                            for (String s : Main.cfg.getStringList("noMoney"))
                                player.sendMessage(s);
                            player.closeInventory();
                        }
                    }
                    if (slot == Main.cfg.getInt("gui.item.6.slot")) {
                        player.closeInventory();
                        if (Main.ppAPI.look(player.getUniqueId()) >= Main.cfg.getInt("gui.item.6.cost")) {
                            Main.ppAPI.take(player.getUniqueId(), Main.cfg.getInt("gui.item.6.cost"));
                            for (String s : Main.cfg.getStringList("gui.item.6.purchase"))
                                player.sendMessage(s);
                            player.closeInventory();
                            player.getInventory().addItem(ItemSUtils.head6());
                        } else {
                            for (String s : Main.cfg.getStringList("noMoney"))
                                player.sendMessage(s);
                            player.closeInventory();
                        }
                    }
                    if (slot == Main.cfg.getInt("gui.item.7.slot")) {
                        player.closeInventory();
    
                    }
                    event.setCancelled(true);
                }
            }
        }
    }
     
  10. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Не вижу пока конкретную причину. Приведи код в порядок, глядишь и ясно станет. Или, может, другие что-то разглядят
     
  11. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    я понял что конкретно происходит с количеством итемов. Почему-то все начиная от slot1 до slot6 умнажают своё количество на 2x, т.е когда я ставлю amount 5, то в меню их становится 10
     
  12. mirrerror

    mirrerror Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    покажи этот класс
     
  13. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    в нём только методы head1(), head2() и т.д, но они вряд ли могут быть причиной бага.
     
  14. Автор темы
    QuodLitee

    QuodLitee Активный участник Пользователь

    Баллы:
    66
    я по кусочкам проверял метод setItem1() и понял, что предмет умножается в количестве из-за чаров, а почему баг происходит именно из-за чаров?

    Код:
    public static void setItem1(Inventory gui) {
            ItemStack stack = new ItemStack(Material.getMaterial(Main.cfg.getString("gui.item.1.material")), 1);
            if (Main.cfg.get("gui.item.1.id") != null)
                StackUtil.setSkullOwner(stack, Main.cfg.getString("gui.item.1.id"));
            ItemMeta meta = stack.getItemMeta();
            meta.setDisplayName(ColorUtil.color(Main.cfg.getString("gui.item.1.name")));
            List<String> lore = new ArrayList<>();
            for (String s : Main.cfg.getStringList("gui.item.1.lore"))
                lore.add(ColorUtil.color(s));
            meta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 5, true);
            meta.addEnchant(Enchantment.PROTECTION_FIRE, 5, true);
            meta.addEnchant(Enchantment.PROTECTION_PROJECTILE, 5, true);
            meta.addEnchant(Enchantment.OXYGEN, 5, true);
            meta.addEnchant(Enchantment.WATER_WORKER, 2, true);
            meta.addAttributeModifier(Attribute.GENERIC_ATTACK_SPEED,
                    new AttributeModifier(UUID.randomUUID(), "generic.attack_speed", 0.25, AttributeModifier.Operation.MULTIPLY_SCALAR_1, EquipmentSlot.HEAD));
            meta.addAttributeModifier(Attribute.GENERIC_ATTACK_DAMAGE,
                    new AttributeModifier(UUID.randomUUID(), "generic.attack_damage", 1, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HEAD));
            meta.addAttributeModifier(Attribute.GENERIC_ARMOR_TOUGHNESS,
                    new AttributeModifier(UUID.randomUUID(), "generic.armor_toughness", 2.5, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HEAD));
            meta.addAttributeModifier(Attribute.GENERIC_ARMOR,
                    new AttributeModifier(UUID.randomUUID(), "generic.armor", 3, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HEAD));
            if (Main.cfg.getBoolean("enable-hide")) {
                meta.hasItemFlag(ItemFlag.HIDE_ATTRIBUTES);
                meta.hasItemFlag(ItemFlag.HIDE_ENCHANTS);
            }
            meta.setLore(lore);
            stack.setItemMeta(meta);
            gui.setItem(Main.cfg.getInt("gui.item.1.slot"), stack);
        }
     

Поделиться этой страницей