Chest insertNewItem (NPE) & eine bitte für removeItem

  • Hi @red51,


    Ich habe ein "NULL"-Problem mit diesem Methode:


    PLUGIN EXCEPTION (AktiveSign, 1.1.19, PatrickBronke) ---->
    java.lang.NullPointerException
    at e.a.a(SourceFile:358)
    at e.a.a(SourceFile:330)
    at pluginapi.objects.ChestAPI.insertNewItem(SourceFile:63)
    at de.pbplugins.asListener.onPlayerObjectInteraction(asListener.java:1227)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at pluginapi.PluginEventHandler.triggerEvent(SourceFile:206)
    at G.c.a(SourceFile:2943)
    at G.c.messageReceived(SourceFile:189)
    at de.jiw.network.server.core.ServerTcpChannel.onMessageReceived(ServerTcpChannel.java:97)
    at de.jiw.network.server.core.AbstractServerChannel.dispatchTCP(AbstractServerChannel.java:62)
    at de.jiw.network.server.session.TcpSessionHandler.channelRead0(TcpSessionHandler.java:79)
    at de.jiw.network.server.session.TcpSessionHandler.channelRead0(TcpSessionHandler.java:15)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:38)
    at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:353)
    at io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:66)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
    at java.lang.Thread.run(Unknown Source)



    Es will mich kein Item in das Inventar setzen lassen.


    Dann noch:


    Könntest du bitte in die ChestAPI eine Methode hinzufügen: chest.removeItem(Item item, int amounth)
    Beschreibung: Damit kann man ein bestimmtes Item aus der Truhe löschen (Egal welcher Slot). Auch die Menge wird berücksichtigt Ich kann leider so kein bestimmtes Item aus einer Truhe nehmen viva Plugin.
    Es zeigt immer an, dass es nichts gefunden hätte, obwohl die ID des Items 100% stimmt und in der Truhe auch was war.


    Wenn nichts gefunden wird, kommt "null" oder was anders halt zurück, wo man dann in einer "if" abfangen kann.


    Das Gleiche wäre auch Super, wenn das bei Player auch funktionieren würde: player.getInventory().removeItem(Item item, Inventory.SlotTyp slottype, int amounth)

  • Sorry für die späte Antwort! Es handelt sich leider tatsächlich um einen Bug in der API, dieser wird im nächsten Update behoben ;)


    Könntest du bitte in die ChestAPI eine Methode hinzufügen: chest.removeItem(Item item, int amounth)

    Eine ähnliche Methode, welche keine "Item" Instanz, sondern die TypID des Items entgegennimmt, kann ich gerne hinzupacken. Allerdings wird sich diese Methode so verhalten, dass das nächstgelegene Item mit dieser TypID entfernt wird. Die Suche nach einer bestimmten Item Instanz innerhalb der Kiste kann leider nicht ganz zuverlässig implementiert werden: Angenommen, du holst dir eine Item Instanz aus dem Spielerinventar, und der Spieler legt dieses Item anschließend in die Kiste. Grundsätzlich wird dann diese Item Instanz einfach in die Kiste übertragen, das trifft aber nicht in allen Fällen zu (zB wenn das Item auf den Stack eines anderen Items hinzugefügt wird, wird einfach nur der Stack-Count des vorhandenen Items hochgezählt und die Instanz des Inventar-Items gelöscht). Falls es also darum geht, wird es etwas schwierig. Wenn es aber tatsächlich nur darum geht, ein Item eines bestimmten Typs aus der Kiste zu entfernen (zB es sind 10 Spitzhacken in einer Kiste vorhanden, und es geht nur darum, eine der Spitzhacken zu entfernen, egal welche), ist das kein Problem^^

  • ich möchte eigendlich nur ein Item aus der Truhe entfernen.


    Nun habe ich dazu noch ein paar Fragen.


    Fall 1:
    Angenommen ich habe 2 Stacks:
    1. 20x Stein
    2. 64x Stein


    Was würde passieren, wenn ich mit der API 30x Stein entnehmen würde? Nimmt er zuerst den 1. Und den Rest vom 2. Oder nur vom 2.?


    Fall 2:


    Ich habe wider 2 Stacks:
    1. 10x Block Texture: 101
    2. 64x Block Texture: 102


    Wie kann ich jetzt 20x vom 2. Block löschen?
    Oder wird bei der TypeID die Variation nicht beachtet?


    Ich versuche ein Schild zu Programmieren, wo man Sachen miteinander Tauschen kann, auch wenn der Andere Offline ist ( also über Truhe).


    Das Item dem Spieler weg zu Nehmen kann ich auch so überbrücken, dass er das Gesuchte Item in der Hand halten muss. :)

  • Was würde passieren, wenn ich mit der API 30x Stein entnehmen würde? Nimmt er zuerst den 1. Und den Rest vom 2. Oder nur vom 2.?

    Die bisherigen Methoden greifen ja nur auf einen bestimmten Slot zu, d.h. wenn hier der Slot mit den 20 Steinen angegeben ist, würden insgesamt nur diese 20 Steine entfernt werden. Bei der kommenden Methoden hingegen würden aus dem ersten Slot 20 Steine entfernt werden, und aus dem zweiten Slot 10 Steine.


    Oder wird bei der TypeID die Variation nicht beachtet?

    Sorry für die Unklarheit, natürlich wird die Funktion sowohl TypeID als auch Variation benötigen ;)


    Das Item dem Spieler weg zu Nehmen kann ich auch so überbrücken, dass er das Gesuchte Item in der Hand halten muss.

    Das ist durchaus sinnvoll und in den meisten Fällen auch vom Spiel so gelöst^^

Participate now!

Don’t have an account yet? Create a new account now and be part of our community!