Discord

  • Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Spigot InventoryClickEvent für Amboss

SchmidiMC

Redstoneengineer
Mitglied seit
1 April 2014
Beiträge
33
Minecraft
SchmidiMC
Hello
so I am trying to do something with the InventoryClickEvent for an anvil which I open through a command. I am facing the issue that I am getting an IndexOutOfBoundsException? Code is below I hope someone could help me. (Spigot 1.88 / 1.89)

Command to open the anvil inventory:

Hey,
ich versuche gerade das InventoryClickEvent auf einen Amboss anzuwenden den ich in dem Sinne selbst über einen Befehl erstelle und anzeige. Das Problem ist jedoch das ich eine IndexOutOfBoundsException erhalte. Die Spigot Version ist die 1.88 / 1.89

Befehl um den Amboss anzuzeigen:
@Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    
        if(sender instanceof Player) {
        
            Player p = (Player)sender;
            if(p.hasPermission(commandPermission)) {
            Inventory anvilView = Bukkit.createInventory(p, InventoryType.ANVIL);
            p.openInventory(anvilView);
            }
        }
    
        return false;
    }
InventoryClickEvent:
@EventHandler
    public void onClick(InventoryClickEvent e) {
        if(e.getInventory().getType() == InventoryType.ANVIL) {
            if(e.getCurrentItem().getAmount() != 1) {
                e.setCancelled(true);
            }
        }
    }
Exception:
[19:45:43 FATAL]: Error executing task
java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 15, Size: 0
        at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_231]
        at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_231]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:45) [spigot188.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [spigot188.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot188.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot188.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot188.jar:git-Spigot-db6de12-18fbb24]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_231]
Caused by: java.lang.IndexOutOfBoundsException: Index: 15, Size: 0
        at java.util.ArrayList.rangeCheck(Unknown Source) ~[?:1.8.0_231]
        at java.util.ArrayList.get(Unknown Source) ~[?:1.8.0_231]
        at net.minecraft.server.v1_8_R3.Container.getSlot(Container.java:109) ~[spigot188.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:1463) ~[spigot188.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInWindowClick.a(SourceFile:31) ~[spigot188.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInWindowClick.a(SourceFile:9) ~[spigot188.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) ~[spigot188.jar:git-Spigot-db6de12-18fbb24]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_231]
        at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_231]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) ~[spigot188.jar:git-Spigot-db6de12-18fbb24]
        ... 5 more
 

BloodSKreaper

Miner
Osterei Experte
Mitglied seit
12 Oktober 2014
Beiträge
194
Minecraft
BloodSKreaper
Guten Abend,

wann genau erhälst du denn diese Fehlermeldung? Was passiert zu dem Zeitpunkt?


Freundliche Grüße
BloodSKreaper
 

SchmidiMC

Redstoneengineer
Mitglied seit
1 April 2014
Beiträge
33
Minecraft
SchmidiMC
Die Exception kommt wenn ich auf irgendeinen Slot klicke.
 

LapisMC

Schafhirte
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
120
Alter
21
Minecraft
LapisMC
Der Event-Listener ist nicht das Problem, sondern die fehlende Funktionalität eines über Bukkit.createInventory() erstellten Amboss-Inventars. Diese Methode ist nur für normale Inventare nutzbar, durch die schlampige Implementierung der Bukkit-API kommt für Inventartypen wie Amboss, Zaubertisch usw. kein funktionierendes Inventar heraus.

Daher muss man für eine solche GUI selbst die entsprechende TileEntity instanziieren und für den Nutzer öffnen. Das geht für den standardmäßigen Spigot-1.8.8-Server folgendermaßen:
Code:
//player ist das betreffende Player-Objekt
EntityPlayer internal = ((CraftPlayer)player).getHandle();
Location l = player.getLocation();

//TileEntities referenzieren immer einen Block, in diesem Fall einen Amboss.
//Hierfür reicht an dieser Stelle aber eine beliebige Position in Spielernähe.
BlockPosition pos = new BlockPosition(l.getBlockX(), l.getBlockY(), l.getBlockZ());

//Erzeugen + Öffnen
BlockAnvil.TileEntityContainerAnvil anvil = new BlockAnvil.TileEntityContainerAnvil(internal.world, pos);
internal.openTileEntity(anvil);

//Muss gesetzt werden, da an der oben angegebenen Position ja kein echter Amboss steht
internal.activeContainer.checkReachable = false;
Das funktioniert in den anderen Versionen ähnlich. Die Klassen EntityPlayer, BlockPosition und BlockAnvil gehören allerdings zum Mojang-Code und dessen Package (net.minecraft.server.v1_x_RY; für die 1.8.8 ist es v1_8_R3) ist in jeder Version anders. Gleiches gilt für die Klasse CraftPlayer in org.bukkit.craftbukkit.v1_x_RY.entity.
Falls dein Plugin also mehrere Versionen unterstützen soll, muss dieser Code natürlich entsprechend angepasst werden.
 

SchmidiMC

Redstoneengineer
Mitglied seit
1 April 2014
Beiträge
33
Minecraft
SchmidiMC
Der Event-Listener ist nicht das Problem, sondern die fehlende Funktionalität eines über Bukkit.createInventory() erstellten Amboss-Inventars. Diese Methode ist nur für normale Inventare nutzbar, durch die schlampige Implementierung der Bukkit-API kommt für Inventartypen wie Amboss, Zaubertisch usw. kein funktionierendes Inventar heraus.

Daher muss man für eine solche GUI selbst die entsprechende TileEntity instanziieren und für den Nutzer öffnen. Das geht für den standardmäßigen Spigot-1.8.8-Server folgendermaßen:
Code:
//player ist das betreffende Player-Objekt
EntityPlayer internal = ((CraftPlayer)player).getHandle();
Location l = player.getLocation();

//TileEntities referenzieren immer einen Block, in diesem Fall einen Amboss.
//Hierfür reicht an dieser Stelle aber eine beliebige Position in Spielernähe.
BlockPosition pos = new BlockPosition(l.getBlockX(), l.getBlockY(), l.getBlockZ());

//Erzeugen + Öffnen
BlockAnvil.TileEntityContainerAnvil anvil = new BlockAnvil.TileEntityContainerAnvil(internal.world, pos);
internal.openTileEntity(anvil);

//Muss gesetzt werden, da an der oben angegebenen Position ja kein echter Amboss steht
internal.activeContainer.checkReachable = false;
Das funktioniert in den anderen Versionen ähnlich. Die Klassen EntityPlayer, BlockPosition und BlockAnvil gehören allerdings zum Mojang-Code und dessen Package (net.minecraft.server.v1_x_RY; für die 1.8.8 ist es v1_8_R3) ist in jeder Version anders. Gleiches gilt für die Klasse CraftPlayer in org.bukkit.craftbukkit.v1_x_RY.entity.
Falls dein Plugin also mehrere Versionen unterstützen soll, muss dieser Code natürlich entsprechend angepasst werden.
Okay danke dir werde es gleich mal ausprobieren, aufjedenfall funktioniert komischerweise mein Code in der Version 1.14 seltsam wie die das gemacht haben ^^
 
Oben