Enchantment in Schleife erstellen

Dieses Thema im Forum "Programmierung" wurde erstellt von Sabbertran, 22. Juni 2013.

  1. Sabbertran
    Offline

    Sabbertran

    Registriert seit:
    24. April 2012
    Beiträge:
    75
    Minecraft:
    Sabbertran
    Moin,
    ich arbeite im Moment an einem Plugin, dass einem Spieler ein Item mit angegebenen Verzauberungen in die Hand geben soll.
    Das ganze funktioniert auch schon, nur wollte ich den Code durch eine For-Schleife verschönern und verkürzen.
    Der ItemStack wird erstellt und die Enchantments werden drauf gemacht, nur wenn der Spieler das Item erhalten soll funktioniert das nicht.

    Mein Code:
    Code (Text):
    1.                     Player invpl = Bukkit.getServer().getPlayer(args[0]);
    2.                     ItemStack Item = new ItemStack(Integer.parseInt(args[1]));
    3.                    
    4.                     for(int i = 0; i< args.length; i++)
    5.                     {
    6.                         for(int j = 0; j < (args.length/2)-1;)
    7.                         {
    8.                             Enchantment ench = Enchantment.getById(Integer.parseInt(args[2] + j));                            
    9.                             Item.addUnsafeEnchantment(ench, Integer.parseInt(args[3] + j));
    10.                             invpl.getInventory().addItem(Item);
    11.                             j = j+2;
    12.                         }
    13.                     }
    Der Fehler:

    Code (Text):
    1. 2013-06-22 21:13:48 [INFO] Sabbertran issued server command: /ie Sabbertran 1 16 50
    2. 2013-06-22 21:13:48 [SEVERE] null
    3. org.bukkit.command.CommandException: Unhandled exception executing command 'ie' in plugin InvEnchant v1.0
    4.     at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46)
    5.     at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:189)
    6.     at org.bukkit.craftbukkit.v1_5_R3.CraftServer.dispatchCommand(CraftServer.java:523)
    7.     at net.minecraft.server.v1_5_R3.PlayerConnection.handleCommand(PlayerConnection.java:965)
    8.     at net.minecraft.server.v1_5_R3.PlayerConnection.chat(PlayerConnection.java:883)
    9.     at net.minecraft.server.v1_5_R3.PlayerConnection.a(PlayerConnection.java:840)
    10.     at net.minecraft.server.v1_5_R3.Packet3Chat.handle(Packet3Chat.java:44)
    11.     at net.minecraft.server.v1_5_R3.NetworkManager.b(NetworkManager.java:292)
    12.     at net.minecraft.server.v1_5_R3.PlayerConnection.d(PlayerConnection.java:109)
    13.     at net.minecraft.server.v1_5_R3.ServerConnection.b(SourceFile:35)
    14.     at net.minecraft.server.v1_5_R3.DedicatedServerConnection.b(SourceFile:30)
    15.     at net.minecraft.server.v1_5_R3.MinecraftServer.r(MinecraftServer.java:581)
    16.     at net.minecraft.server.v1_5_R3.DedicatedServer.r(DedicatedServer.java:226)
    17.     at net.minecraft.server.v1_5_R3.MinecraftServer.q(MinecraftServer.java:477)
    18.     at net.minecraft.server.v1_5_R3.MinecraftServer.run(MinecraftServer.java:410)
    19.     at net.minecraft.server.v1_5_R3.ThreadServerApplication.run(SourceFile:573)
    20. Caused by: java.lang.NullPointerException
    21.     at org.bukkit.craftbukkit.v1_5_R3.inventory.CraftMetaItem.applyEnchantments(CraftMetaItem.java:323)
    22.     at org.bukkit.craftbukkit.v1_5_R3.inventory.CraftMetaItem.applyToItem(CraftMetaItem.java:293)
    23.     at org.bukkit.craftbukkit.v1_5_R3.inventory.CraftItemStack.setItemMeta(CraftItemStack.java:356)
    24.     at org.bukkit.craftbukkit.v1_5_R3.inventory.CraftItemStack.setItemMeta(CraftItemStack.java:338)
    25.     at org.bukkit.craftbukkit.v1_5_R3.inventory.CraftItemStack.<init>(CraftItemStack.java:97)
    26.     at org.bukkit.craftbukkit.v1_5_R3.inventory.CraftItemStack.<init>(CraftItemStack.java:90)
    27.     at org.bukkit.craftbukkit.v1_5_R3.inventory.CraftItemStack.asCraftCopy(CraftItemStack.java:69)
    28.     at org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory.firstPartial(CraftInventory.java:254)
    29.     at org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory.addItem(CraftInventory.java:281)
    30.     at me.sabbertran.invenchant.InvEnchant.onCommand(InvEnchant.java:51)
    31.     at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
    32.     ... 15 more
    Ich hoffe, dass mir jemand behilflich sein kann.

    Gruß Sabbertran ;)
     
    #1
  2. TimBone
    Online

    TimBone

    Caused by: java.lang.NullPointerException
     
    #2
  3. Sabbertran
    Offline

    Sabbertran

    Registriert seit:
    24. April 2012
    Beiträge:
    75
    Minecraft:
    Sabbertran
    Das habe ich auch schon gesehen, nur weiß ich nicht, worauf sich das bezieht.

    Ich führe den befehl so aus: /ie Sabbertran 1 16 5
     
    #3
  4. games6471
    Online

    games6471

    Ach Exceptions sind doch so schon gemacht. Du bekommst sogar schon die Zeile und die Quelle (falls nicht obfuskatet) angezeigt.

    me.sabbertran.invenchant.InvEnchant.onCommand(InvEnchant.java:51)
     
    #4
  5. Sabbertran
    Offline

    Sabbertran

    Registriert seit:
    24. April 2012
    Beiträge:
    75
    Minecraft:
    Sabbertran
    Auch das habe ich schon gesehen. In der Zeile steht das folgende:
    Code (Text):
    1. invpl.getInventory().addItem(Item);
    Ich verstehe allerdings nicht, was daran falsch ist bzw. warum es nicht funktioniert, zumal es außerhalb der Schleife so funktioniert hat
     
    #5
  6. games6471
    Online

    games6471

    Schon beim ersten Durchlauf schlägt das Teil fehl, da kein Enchantment mit der ID 160 existiert. Somit wäre Enchantment schon null.
    Code (Text):
    1. Integer.parseInt(args[2] + j);
    Hier werden zwei String aneinander gefügt und es werden keine mathematischen Berechnungen durchgeführt, da die VM immer noch args[2] als String kennt. So wäre es richtig:
    Code (Text):
    1. final Enchantment ench = Enchantment.getById(Integer.parseInt(args[2][COLOR="#FF0000"])[/COLOR] + j);
    Nun wird der Wert auch ausgerechnet.

    Wenn man sich die zweite Schleife mal genauer anschaut, macht diese auch nicht wirklich sinn.

    Noch eine Frage: Wozu die erste Schleife? Soll man etwa pro Argument ein Item bekommen (Sogar immer das gleiche)?


    Außerdem solltest du noch die Konventionen einhalten.
     
    #6
  7. Sabbertran
    Offline

    Sabbertran

    Registriert seit:
    24. April 2012
    Beiträge:
    75
    Minecraft:
    Sabbertran
    Ok, danke für die Hilfe.
    ich hatte den Fehler grade gefunden.
    Und zwar habe ich das Enchantment mit der ID args[x] + j erstellt und nicht aus args[x+j] ausgelesen.
    Deswegen hat er die Enchantment ID nicht erkannt und das Enchantment war null.
    Zur 1. Schleife hatte ich mir etwas gedacht, weiß es nur jetzt auch nicht mehr. Funktioniert auch ohne, und ich weiß nicht, was mich da geritten hat :D
    Zu den Konventionen: Ich will es grade nur einmal proof of concept haben und bin nur am probieren

    Danke für die Hilfen :)

    Gruß Sabbertran
     
    #7