- Баллы
- 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
]
Подскажите, я хоть что-то близкое делаю к тому что хочу?
И вообще каким путём реализовать то что мне нужно?
Какие другие варианты могут быть если этот ошибочный?