Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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(plugin, PacketType.Play.Server.WINDOW_ITEMS, PacketType.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 = 0; i < itemArray.length; i++) {
                        itemArray[i] = modifyItemInfo(itemArray[i]);
                    }
                    event.getPacket().getItemArrayModifier().write(0, itemArray);
                } else {
                    ItemStack item = event.getPacket().getItemModifier().read(0);
                    event.getPacket().getItemModifier().write(0, modifyItemInfo(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(item, nbtTag);
            }
        }
        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
  ]

Подскажите, я хоть что-то близкое делаю к тому что хочу?
И вообще каким путём реализовать то что мне нужно?
Какие другие варианты могут быть если этот ошибочный?
 
А зачем пакетами-то? Установить просто пустое название и лор нулевой длины, и всё
 
А зачем пакетами-то? Установить просто пустое название и лор нулевой длины, и всё
не, всёравно появляется всплывающее окно в котором написано, ну например "Стеклянная панель" или что-то на подобии, даже если просто пробел поставить, то появляется маленькое окошко, а я хочу, чтобы на некоторых предметах при наведении вообще ничего не всплывало
 
не, всёравно появляется всплывающее окно в котором написано, ну например "Стеклянная панель" или что-то на подобии, даже если просто пробел поставить, то появляется маленькое окошко, а я хочу, чтобы на некоторых предметах при наведении вообще ничего не всплывало
Вместо пробела можно пустой компонент использовать. Но все равно небольшая всплывашка будет. Её можно скрыть исключительно текстурами/шейдерами
 
Вместо пробела можно пустой компонент использовать. Но все равно небольшая всплывашка будет. Её можно скрыть исключительно текстурами/шейдерами
хочу сделать чтобы вообще ничего не всплывало...
 
Русским по белому написано же.
Ну да, я скрою для себя, шикарно, а как остальные игроки? Меня интересует можно ли это сделать програмно, чтобы вообще не всплывало окошко у предметов с особым НБТ тегом например, вот чтобы просто не всплывало, можно так сделать каким-то путём или нет? В правильной стороне ли я ковырялся? Если не в правильной, но такое можно сделать, то хоть подскажите куда смотреть, хоть пальцем в нужную сторону ткните
 
Ну да, я скрою для себя, шикарно, а как остальные игроки?
Существует установка серверного ресурс-пака игроку. Делается даже на ванильном сервере.
Меня интересует можно ли это сделать програмно, чтобы вообще не всплывало окошко у предметов с особым НБТ тегом например, вот чтобы просто не всплывало, можно так сделать каким-то путём или нет? В правильной стороне ли я ковырялся? Если не в правильной, но такое можно сделать, то хоть подскажите куда смотреть, хоть пальцем в нужную сторону ткните
Только кор-шейдером в ресурс-паке.
 
И не будет, потому что работать с инвентарями как с gui - великовозрастный костыль.
 
И не будет, потому что работать с инвентарями как с gui - великовозрастный костыль.
а разве в майне есть другие варианты реализации gui? кстати, а можно под gui переделать книгу рецептов?
 
В правильной стороне ли я ковырялся? Если не в правильной, но такое можно сделать, то хоть подскажите куда смотреть, хоть пальцем в нужную сторону ткните

Я вроде на русском языке пишу, нет?
Вместо пробела можно пустой компонент использовать. Но все равно небольшая всплывашка будет. Её можно скрыть исключительно текстурами/шейдерами
Если вопрос "Можно ли это сделать пакетами?", то ответ "Нет, нельзя. Ты копаешь не в ту сторону".

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

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

можно под gui переделать книгу рецептов?
Ну если устраивает интерфейс, то используй PlayerRecipeBookClickEvent
 
Последнее редактирование:

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

Назад
Верх