Регистрация предмета при запуске

BlackBaroness

Модератор
Разработчик
Сообщения
1 841
Решения
81
Веб-сайт
t.me
Сап спигот, в методе onLoad() вызываю метод registerItems(), его код:
Java:
scrollSquadClear = new ItemStack(Material.PAPER);
        ItemMeta meta2 = scrollSquadClear.getItemMeta();
        meta2.addEnchant(Enchantment.OXYGEN, 1, true);
        meta2.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        meta2.setDisplayName(ChatColor.YELLOW + "Свиток Отряда" + ChatColor.DARK_RED + " [Чистый]");
        List<String> lore2 = new ArrayList<>();
        lore2.add(ChatColor.GREEN + "В этом свитке заключена сила, способная соединить команду воедино.");
        lore2.add(ChatColor.RED + "Данный свиток ещё не активирован и не исчезает при смерти.");
        meta2.setLore(lore2);
        scrollSquadClear.setItemMeta(meta2);

//scroll... имеет свойства private static

После возвращаю предмет через геттер в нужный мне класс. Но при попытке вызвать метод с этим предметом консоль пишет, что итем пустой.
Что не так?

То же самое делаю с инвентарями, всё работает
 
Решение
у меня класс админпанели для выдачи предметов есть и админшоп с этой же целью, они вместе лежат. а вот класс отряда большой и там много интерактива, поэтому неудобно его перекладывать куда-то
Окей, создай все предметы в onEnable(), сунь их в кэш аля мапу <Integer, ItemStack>, где инт нужный слот, создай класс аля FooGUI, в котором при создании объекта будет создаваться инвентарь и сетаться предметы в него, в него же и имплеменируй лиснр и делай что твоей душе угодно.
Достать предметы из главного класса конечно можешь конструктором.
BuseSo, не помогло

Java:
[19:53:41] [Server thread/ERROR]: Could not pass event InventoryClickEvent to Baroness v1.0-SNAPSHOT
org.bukkit.event.EventException: null
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:69) ~[EventExecutor$2.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[RegisteredListener.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:503) [SimplePluginManager.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:488) [SimplePluginManager.class:git-CatServer-1.12.2-3440193]
        at net.minecraft.network.NetHandlerPlayServer.func_147351_a(NetHandlerPlayServer.java:2113) [pa.class:?]
        at net.minecraft.network.play.client.CPacketClickWindow.func_148833_a(CPacketClickWindow.java:38) [lf.class:?]
        at net.minecraft.network.play.client.CPacketClickWindow.func_148833_a(CPacketClickWindow.java:12) [lf.class:?]
        at net.minecraft.network.PacketThreadUtil$1.run(SourceFile:13) [hv$1.class:?]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_251]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_251]
        at net.minecraft.util.Util.func_181617_a(Util.java:50) [h.class:?]
        at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:845) [MinecraftServer.class:?]
        at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:472) [nz.class:?]
        at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:782) [MinecraftServer.class:?]
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:636) [MinecraftServer.class:?]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_251]
Caused by: java.lang.IllegalArgumentException: Item cannot be null
        at org.apache.commons.lang3.Validate.noNullElements(Validate.java:513) ~[minecraft_server.1.12.2.jar:?]
        at org.bukkit.craftbukkit.v1_12_R1.inventory.CraftInventory.addItem(CraftInventory.java:283) ~[CraftInventory.class:git-CatServer-1.12.2-3440193]
        at com.baroness.handler.customMenus(handler.java:119) ~[?:?]
        at catserver.server.executor.asm.generated.GeneratedEventExecutor5.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:67) ~[EventExecutor$2.class:git-CatServer-1.12.2-3440193]
        ... 15 more
 
А ты все предметы переназначаешь?
Лучше всегда скидывать полный код класса, а не обрывками, чтобы было понятней.
Java:
package com.baroness;

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

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

public class ItemCenter {

    private static ItemStack returnStone;
    private static ItemStack scrollNearness;
    private static ItemStack secret;
    private static ItemStack scrollSquadClear;
    private static ItemStack scrollSquadActive;
    private static ItemStack scrollSquad4;
    private static ItemStack scrollSquad3;
    private static ItemStack scrollSquad2;
    private static ItemStack scrollSquad1;

    public static void registerItems() {
        Material m = Material.matchMaterial("SAPPHIREITEMS_RETURNSTONE");
        returnStone = new ItemStack(m, 1);

        ItemStack item = new ItemStack(Material.PAPER);
        ItemMeta meta = item.getItemMeta();
        meta.addEnchant(Enchantment.OXYGEN, 1, true);
        meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        meta.setDisplayName(ChatColor.YELLOW + "Свиток Близости");
        List<String> lore = new ArrayList<>();
        lore.add(ChatColor.GREEN + "В этом свитке заключена магия телепортации.");
        lore.add(ChatColor.GREEN + "Учтите, перезарядка подобных действий: " + ChatColor.YELLOW + "15 минут" + ChatColor.GREEN + ".");
        meta.setLore(lore);
        item.setItemMeta(meta);
        scrollNearness = item;

        ItemStack item1 = new ItemStack(Material.DIAMOND_SWORD);
        ItemMeta meta1 = item1.getItemMeta();
        meta1.addEnchant(Enchantment.DAMAGE_ALL, 5, true);
        meta1.setDisplayName(ChatColor.YELLOW + "вглядеться");
        List<String> lore1 = new ArrayList<>();
        lore1.add(ChatColor.GREEN + "вероятно");
        meta.setLore(lore1);
        item1.setItemMeta(meta1);
        secret = item1;

        ItemStack item2 = new ItemStack(Material.PAPER);
        ItemMeta meta2 = item2.getItemMeta();
        meta2.addEnchant(Enchantment.OXYGEN, 1, true);
        meta2.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        meta2.setDisplayName(ChatColor.YELLOW + "Свиток Отряда" + ChatColor.DARK_RED + " [Чистый]");
        List<String> lore2 = new ArrayList<>();
        lore2.add(ChatColor.GREEN + "В этом свитке заключена сила, способная соединить команду воедино.");
        lore2.add(ChatColor.RED + "Данный свиток ещё не активирован и не исчезает при смерти.");
        meta2.setLore(lore2);
        item2.setItemMeta(meta2);
        scrollSquadClear = item2;

        ItemStack item3 = new ItemStack(Material.PAPER);
        ItemMeta meta3 = item3.getItemMeta();
        meta3.addEnchant(Enchantment.OXYGEN, 1, true);
        meta3.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        meta3.setDisplayName(ChatColor.YELLOW + "Свиток Отряда" + ChatColor.DARK_RED + " [Активен]");
        List<String> lore3 = new ArrayList<>();
        lore3.add(ChatColor.GREEN + "Свиток усиливает ваш отряд прямо сейчас!");
        lore3.add(ChatColor.RED + "При смерти лидера отряда свиток безвозвратно исчезает!");
        meta3.setLore(lore3);
        item3.setItemMeta(meta3);
        scrollSquadActive = item3;

        ItemStack item4 = new ItemStack(Material.PAPER);
        ItemMeta meta4 = item4.getItemMeta();
        meta4.addEnchant(Enchantment.OXYGEN, 1, true);
        meta4.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        meta4.setDisplayName(ChatColor.YELLOW + "Свиток Отряда" + ChatColor.DARK_RED + " [4\4]");
        List<String> lore4 = new ArrayList<>();
        lore4.add(ChatColor.GREEN + "В этом свитке заключена сила, способная соединить команду воедино.");
        lore4.add(ChatColor.GREEN + "Оставшееся количество использований: " + ChatColor.YELLOW + "4" + ChatColor.GREEN + ".");
        lore4.add(ChatColor.RED + "При смерти лидера отряда свиток безвозвратно исчезает!");
        meta4.setLore(lore4);
        item4.setItemMeta(meta4);
        scrollSquad4 = item4;

        ItemStack item5 = new ItemStack(Material.PAPER);
        ItemMeta meta5 = item5.getItemMeta();
        meta5.addEnchant(Enchantment.OXYGEN, 1, true);
        meta5.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        meta5.setDisplayName(ChatColor.YELLOW + "Свиток Отряда" + ChatColor.DARK_RED + " [3\4]");
        List<String> lore5 = new ArrayList<>();
        lore5.add(ChatColor.GREEN + "В этом свитке заключена сила, способная соединить команду воедино.");
        lore5.add(ChatColor.GREEN + "Оставшееся количество использований: " + ChatColor.YELLOW + "3" + ChatColor.GREEN + ".");
        lore5.add(ChatColor.RED + "При смерти лидера отряда свиток безвозвратно исчезает!");
        meta5.setLore(lore5);
        item5.setItemMeta(meta5);
        scrollSquad3 = item5;

        ItemStack item6 = new ItemStack(Material.PAPER);
        ItemMeta meta6 = item6.getItemMeta();
        meta6.addEnchant(Enchantment.OXYGEN, 1, true);
        meta6.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        meta6.setDisplayName(ChatColor.YELLOW + "Свиток Отряда" + ChatColor.DARK_RED + " [2\4]");
        List<String> lore6 = new ArrayList<>();
        lore6.add(ChatColor.GREEN + "В этом свитке заключена сила, способная соединить команду воедино.");
        lore6.add(ChatColor.GREEN + "Оставшееся количество использований: " + ChatColor.YELLOW + "2" + ChatColor.GREEN + ".");
        lore6.add(ChatColor.RED + "При смерти лидера отряда свиток безвозвратно исчезает!");
        meta6.setLore(lore6);
        item6.setItemMeta(meta6);
        scrollSquad2 = item6;

        ItemStack item7 = new ItemStack(Material.PAPER);
        ItemMeta meta7 = item7.getItemMeta();
        meta7.addEnchant(Enchantment.OXYGEN, 1, true);
        meta7.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        meta7.setDisplayName(ChatColor.YELLOW + "Свиток Отряда" + ChatColor.DARK_RED + " [1\4]");
        List<String> lore7 = new ArrayList<>();
        lore7.add(ChatColor.GREEN + "В этом свитке заключена сила, способная соединить команду воедино.");
        lore7.add(ChatColor.GREEN + "Оставшееся количество использований: " + ChatColor.YELLOW + "3" + ChatColor.GREEN + ".");
        lore7.add(ChatColor.RED + "При смерти лидера отряда свиток безвозвратно исчезает!");
        meta7.setLore(lore7);
        item7.setItemMeta(meta7);
        scrollSquad1 = item7;
    }

    public static ItemStack getReturnStone() { return returnStone; }
    public static ItemStack getScrollNearness() { return scrollNearness; }
    public static ItemStack getSecret() { return secret; }
    public static ItemStack getScrollSquadClear() { return scrollSquadClear; }
    public static ItemStack getScrollSquadActive() { return scrollSquadActive; }
    public static ItemStack getScrollSquad4() { return scrollSquad4; }
    public static ItemStack getScrollSquad3() { return scrollSquad3; }
    public static ItemStack getScrollSquad2() { return scrollSquad2; }
    public static ItemStack getScrollSquad1() { return scrollSquad1; }
}

полный класс
Объединено

А ты все предметы переназначаешь?
Лучше всегда скидывать полный код класса, а не обрывками, чтобы было понятней.
так что не так? я в тупике
 
Последнее редактирование:
Делай в onEnable(), onLoad() нужен только если тебе нужно делать что-то, что будет происходить именно при загрузке плагина, а не включении.
Я хотел очень сильно поругаться за реализацию класса ItemCenter (а она ужасная), но одобряю, что ты подумал, и регистрируешь предметы во время включения.
 
Делай в onEnable(), onLoad() нужен только если тебе нужно делать что-то, что будет происходить именно при загрузке плагина, а не включении.
Я хотел очень сильно поругаться за реализацию класса ItemCenter (а она ужасная), но одобряю, что ты подумал, и регистрируешь предметы во время включения.
Регистрация инвентарей в onEnable не работает вообще, геттер пустышку возвращает. Изначально каждый предмет регистрировался очень много раз, сейчас я весь плагин под геттеры переделал. Как сделать более правильно - не знаю
Объединено

[OFFTOPIC]если можешь дать пример правильной регистрации, буду рад научиться) [/OFFTOPIC]
 
Последнее редактирование:
Попробуй через таймер
пробовал, 0 толку. сейчас сработало следующее:

Java:
public static ItemStack getScrollNearness() {
        if (scrollNearness == null) {
            ItemStack item = new ItemStack(Material.PAPER);
            ItemMeta meta = item.getItemMeta();
            meta.addEnchant(Enchantment.OXYGEN, 1, true);
            meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
            meta.setDisplayName(ChatColor.YELLOW + "Свиток Близости");
            List<String> lore = new ArrayList<>();
            lore.add(ChatColor.GREEN + "В этом свитке заключена магия телепортации.");
            lore.add(ChatColor.GREEN + "Учтите, перезарядка подобных действий: " + ChatColor.YELLOW + "15 минут" + ChatColor.GREEN + ".");
            meta.setLore(lore);
            item.setItemMeta(meta);
            scrollNearness = item;
        }
        return scrollNearness;
    }
 
Регистрация инвентарей в onEnable не работает вообще, геттер пустышку возвращает. Изначально каждый предмет регистрировался очень много раз, сейчас я весь плагин под геттеры переделал. Как сделать более правильно - не знаю
Тебе же он нужен только в слушателе, можешь создать инвентарь при инициализации твоего класса слушателя, там же создавай предметы и добавляй в инвентарь.
 
Тебе же он нужен только в слушателе, можешь создать инвентарь при инициализации твоего класса слушателя, там же создавай предметы и добавляй в инвентарь.
у меня несколько слушателей
 
у меня класс админпанели для выдачи предметов есть и админшоп с этой же целью, они вместе лежат. а вот класс отряда большой и там много интерактива, поэтому неудобно его перекладывать куда-то
Объединено

А так, я могу получить доступ к предмету из любого класса и менять его в один клик
 
у меня класс админпанели для выдачи предметов есть и админшоп с этой же целью, они вместе лежат. а вот класс отряда большой и там много интерактива, поэтому неудобно его перекладывать куда-то
Окей, создай все предметы в onEnable(), сунь их в кэш аля мапу <Integer, ItemStack>, где инт нужный слот, создай класс аля FooGUI, в котором при создании объекта будет создаваться инвентарь и сетаться предметы в него, в него же и имплеменируй лиснр и делай что твоей душе угодно.
Достать предметы из главного класса конечно можешь конструктором.
 
А чем плоха моя реализация?
Не гибкая, отсутствие логики и не соблюдение принципов ООП.
Впрочем, ты половину кода и не кинул, но выводы выше я сделал основываясь на том, что ты кинул.
Есть нормальная всем известная реализация, свои костыли придумывать для этого не надо.
Объединено

Тем не менее, я очень рад, что ты догадался, что можно создавать предмет один раз, а не постоянно при открытии.
 
Назад
Сверху Снизу