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

Помогите Удалить всплывающее окно

Тема в разделе "Разработка плагинов для новичков", создана пользователем Korvinius, 2 май 2023.

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

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

    Баллы:
    88
    Приветствую, мне нужно удалить всплывающее окно с информацией о предмете, которое появляется, если навести курсор на любой предмет в инвентаре игрока.

    То-есть, не для всех предметов, а для некоторых, например с особыми нбт тегами.
    Я в этой области, как и в частности в работе с пакетами полный ноль, но попытался чего-то сотворить. В общем, я гуглил, спрашивал, пробовал, гугли, спрашивал и что-то слепил.

    Но, к сожалению это моё творение не хочет работать, вот код:

    PHP:
    package net.wealth_mc.mystery.listener;

    import org.bukkit.event.Listener;
    import org.*********ventory.ItemStack;
    import org.bukkit.plugin.java.JavaPlugin;

    import com.comphenix.protocol.PacketType;
    import com.comphenix.protocol.ProtocolLibrary;
    import com.comphenix.protocol.ProtocolManager;
    import com.comphenix.protocol.events.PacketAdapter;
    import com.comphenix.protocol.events.PacketEvent;
    import com.comphenix.protocol.wrappers.nbt.NbtCompound;
    import com.comphenix.protocol.wrappers.nbt.NbtFactory;

    import net.wealth_mc.mystery.specific.market.Icons;

    public class 
    ListenerHideItemInfo implements Listener {

        public 
    ListenerHideItemInfo(JavaPlugin plugin) {
            
    ProtocolManager protocolManager ProtocolLibrary.getProtocolManager();
            
    protocolManager.addPacketListener(new PacketAdapter(pluginPacketType.Play.Server.WINDOW_ITEMSPacketType.Play.Server.SET_SLOT) {
                @
    Override
                
    public void onPacketSending(PacketEvent event) {
                    if (
    event.getPacketType() == PacketType.Play.Server.WINDOW_ITEMS) {
                        
    ItemStack[] itemArray event.getPacket().getItemArrayModifier().read(0);
                        for (
    int i 0itemArray.lengthi++) {
                            
    itemArray[i] = modifyItemInfo(itemArray[i]);
                        }
                        
    event.getPacket().getItemArrayModifier().write(0itemArray);
                    } else {
                        
    ItemStack item event.getPacket().getItemModifier().read(0);
                        
    event.getPacket().getItemModifier().write(0modifyItemInfo(item));
                    }
                }
            });
        }

        private 
    ItemStack modifyItemInfo(ItemStack item) {
            if (
    item == null) {
                return 
    item;
            }

            
    NbtCompound nbtTag NbtFactory.asCompound(NbtFactory.fromItemTag(item));
            if (
    nbtTag.containsKey(Icons.SPECIAL_NBT_TAG) && nbtTag.getByte(Icons.SPECIAL_NBT_TAG) == 1) {
                if (
    nbtTag.containsKey("display")) {
                    
    nbtTag.remove("display");
                    
    NbtFactory.setItemTag(itemnbtTag);
                }
            }
            return 
    item;
        }

    }
    И в результате, я получаю такую ошибку:

    Код:
    [21:58:18 WARN]: [ProtocolLib] Loaded class net.wealth_mc.mystery.listener.ListenerHideItemInfo$1 from Mystery v0.9.1. which is not a depend, softdepend or loadbefore of this plugin.                                                       
    [21:58:18 ERROR]: [Mystery] Unhandled exception occured in onPacketSending(PacketEvent) for Mystery                                                                                                                                         
    com.comphenix.protocol.reflect.FieldAccessException: No field with type [Lnet.minecraft.world.item.ItemStack; exists in class PacketPlayOutWindowItems.                                                                                     
            at com.comphenix.protocol.reflect.StructureModifier.readInternal(StructureModifier.java:218) ~[ProtocolLib.jar:?]                                                                                                                   
            at com.comphenix.protocol.reflect.StructureModifier.read(StructureModifier.java:197) ~[ProtocolLib.jar:?]                                                                                                                           
            at net.wealth_mc.mystery.listener.ListenerHideItemInfo$1.onPacketSending(ListenerHideItemInfo.java:25) ~[Mystery-0.9.1-SNAPSHOT.jar:?]                                                                                               
            at com.comphenix.protocol.injector.SortedPacketListenerList.invokeSendingListener(SortedPacketListenerList.java:195) ~[ProtocolLib.jar:?]                                                                                           
            at com.comphenix.protocol.injector.SortedPacketListenerList.invokePacketSending(SortedPacketListenerList.java:149) ~[ProtocolLib.jar:?]
            at com.comphenix.protocol.injector.PacketFilterManager.handlePacket(PacketFilterManager.java:535) ~[ProtocolLib.jar:?]
            at com.comphenix.protocol.injector.PacketFilterManager.invokePacketSending(PacketFilterManager.java:516) ~[ProtocolLib.jar:?]
            at com.comphenix.protocol.injector.netty.ProtocolInjector.packetQueued(ProtocolInjector.java:346) ~[ProtocolLib.jar:?]
            at com.comphenix.protocol.injector.netty.ProtocolInjector.onPacketSending(ProtocolInjector.java:308) ~[ProtocolLib.jar:?]
            at com.comphenix.protocol.injector.netty.ChannelInjector.processSending(ChannelInjector.java:436) ~[ProtocolLib.jar:?]
            at com.comphenix.protocol.injector.netty.ChannelInjector.access$800(ChannelInjector.java:72) ~[ProtocolLib.jar:?]
            at com.comphenix.protocol.injector.netty.ChannelInjector$3.handleScheduled(ChannelInjector.java:376) ~[ProtocolLib.jar:?]
            at com.comphenix.protocol.injector.netty.ChannelInjector$3.onMessageScheduled(ChannelInjector.java:346) ~[ProtocolLib.jar:?]
            at com.comphenix.protocol.injector.netty.ChannelProxy$2.schedulingRunnable(ChannelProxy.java:127) ~[ProtocolLib.jar:?]
            at com.comphenix.protocol.injector.netty.EventLoopProxy.execute(EventLoopProxy.java:95) ~[ProtocolLib.jar:?]
            at net.minecraft.network.Connection.writePacket(Connection.java:423) ~[app:?]
            at net.minecraft.network.Connection.send(Connection.java:370) ~[app:?]
            at net.minecraft.server.network.ServerGamePacketListenerImpl.send(ServerGamePacketListenerImpl.java:1997) ~[app:?]
            at net.minecraft.server.network.ServerGamePacketListenerImpl.send(ServerGamePacketListenerImpl.java:1983) ~[app:?]
            at net.minecraft.server.level.ServerPlayer$1.sendInitialData(ServerPlayer.java:278) ~[app:?]
            at net.minecraft.world.inventory.AbstractContainerMenu.sendAllDataToRemote(AbstractContainerMenu.java:194) ~[app:?]
            at net.minecraft.world.inventory.AbstractContainerMenu.setSynchronizer(AbstractContainerMenu.java:174) ~[app:?]
            at net.minecraft.server.level.ServerPlayer.initMenu(ServerPlayer.java:593) ~[app:?]
            at net.minecraft.server.level.ServerPlayer.initInventoryMenu(ServerPlayer.java:597) ~[app:?]
            at net.minecraft.server.players.PlayerList.onPlayerJoinFinish(PlayerList.java:477) ~[patched_1.17.1.jar:git-Paper-411]
            at net.minecraft.server.players.PlayerList.postChunkLoadJoin(PlayerList.java:421) ~[patched_1.17.1.jar:git-Paper-411]
            at net.minecraft.server.players.PlayerList.lambda$placeNewPlayer$1(PlayerList.java:302) ~[patched_1.17.1.jar:git-Paper-411]
            at net.minecraft.server.network.ServerGamePacketListenerImpl.tick(ServerGamePacketListenerImpl.java:307) ~[app:?]
            at net.minecraft.network.Connection.tick(Connection.java:555) ~[app:?]
            at net.minecraft.server.network.ServerConnectionListener.tick(ServerConnectionListener.java:201) ~[app:?]
            at net.minecraft.server.MinecraftServer.tickChildren(MinecraftServer.java:1656) ~[patched_1.17.1.jar:git-Paper-411]
            at net.minecraft.server.dedicated.DedicatedServer.tickChildren(DedicatedServer.java:490) ~[patched_1.17.1.jar:git-Paper-411]
            at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1483) ~[patched_1.17.1.jar:git-Paper-411]
            at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1282) ~[patched_1.17.1.jar:git-Paper-411]
            at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:319) ~[patched_1.17.1.jar:git-Paper-411]
            at java.lang.Thread.run(Thread.java:833) ~[?:?]
    [21:58:18 ERROR]: Parameters:
      net.minecraft.network.protocol.game.PacketPlayOutWindowItems@27141d11[
        a=0
        b=1
        c=[1 air, 1 air, 1 air, 1 air, 1 air, 1 air, 1 air, 1 air, 1 air, 1 gold_ingot, 1 air, 1 air, 1 air, 1 gold_nugget, 1 air, 1 air, 50 iron_nugget, 64 gold_nugget, 1 air, 1 gold_nugget, 1 air, 1 air, 1 air, 1 enchanted_book, 1 gold_nugg
    et, 2 gray_stained_glass_pane, 1 orange_shulker_box, 64 gold_nugget, 2 bone, 1 netherite_sword, 1 air, 1 air, 1 air, 1 air, 1 enchanted_book, 1 air, 1 air, 1 air, 1 air, 1 red_stained_glass_pane, 1 air, 50 iron_ingot, 49 brick, 40 gold_nu
    gget, 14 gold_ingot, 1 air]
        d=1 air
      ]
    
    Подскажите, я хоть что-то близкое делаю к тому что хочу?
    И вообще каким путём реализовать то что мне нужно?
    Какие другие варианты могут быть если этот ошибочный?
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    А зачем пакетами-то? Установить просто пустое название и лор нулевой длины, и всё
     
  3. Автор темы
    Korvinius

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

    Баллы:
    88
    не, всёравно появляется всплывающее окно в котором написано, ну например "Стеклянная панель" или что-то на подобии, даже если просто пробел поставить, то появляется маленькое окошко, а я хочу, чтобы на некоторых предметах при наведении вообще ничего не всплывало
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Вместо пробела можно пустой компонент использовать. Но все равно небольшая всплывашка будет. Её можно скрыть исключительно текстурами/шейдерами
     
  5. Автор темы
    Korvinius

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

    Баллы:
    88
    хочу сделать чтобы вообще ничего не всплывало...
     
  6. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Русским по белому написано же.
     
  7. Автор темы
    Korvinius

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

    Баллы:
    88
    Ну да, я скрою для себя, шикарно, а как остальные игроки? Меня интересует можно ли это сделать програмно, чтобы вообще не всплывало окошко у предметов с особым НБТ тегом например, вот чтобы просто не всплывало, можно так сделать каким-то путём или нет? В правильной стороне ли я ковырялся? Если не в правильной, но такое можно сделать, то хоть подскажите куда смотреть, хоть пальцем в нужную сторону ткните
     
  8. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Существует установка серверного ресурс-пака игроку. Делается даже на ванильном сервере.
    Только кор-шейдером в ресурс-паке.
     
  9. Автор темы
    Korvinius

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

    Баллы:
    88
    Жаль, что програмного пути нет
     
  10. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    И не будет, потому что работать с инвентарями как с gui - великовозрастный костыль.
     
  11. Автор темы
    Korvinius

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

    Баллы:
    88
    а разве в майне есть другие варианты реализации gui? кстати, а можно под gui переделать книгу рецептов?
     
  12. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Я вроде на русском языке пишу, нет?
    Если вопрос "Можно ли это сделать пакетами?", то ответ "Нет, нельзя. Ты копаешь не в ту сторону".

    Ну так шейдеры тоже программируются. Но да, это будет уже не баккит-плагин и вообще не Java, а GLSL (OpenGL Shading Language). Подробнее можно тут почитать: https://minecraft.fandom.com/wiki/Shaders#Java_Edition
    Но контролировать видимость отдельных конкретных предметов всё-таки можно из баккита. Придется на клиенте что-то рендерить динамически: определённое название предмета, частицы, боссбар, скорборд или что-либо ещё, что будет дектить шейдер. Вот пример использования такого шейдера с объяснением:
    Если нужно - вот дискорд с кучей материалов по текстурам и шейдерам: https://discord.gg/yeCV7vbSPM

    Нет, других вариантов нет. Майнкрафт так и работает, и с этим ничего не сделать. Разве что есть готовые плагины и текстурпаки и для создания красивых менюшек.

    Ну если устраивает интерфейс, то используй PlayerRecipeBookClickEvent
     
    Последнее редактирование: 4 май 2023
  13. Автор темы
    Korvinius

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

    Баллы:
    88
    Спасибо огромное за советы!
     

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