Auswerten des Items bei dem Event PlayerDestroyTerrainEvent

  • Hallo liebe Gemeinde,


    ich möchte in der obigen Funktion auswerten ,welches Item der Spieler mit der PickAxe abgebaut hat,
    ich erhalte bei dem obigen Event als Übergabe die TerrainID (event.getTerrainID()) ,
    Diese ist wie ich schon mehrfach getestet habe je nach dem auf was die Pickaxe grad abgebaut hat
    0, 5, -101 usw.


    nun möchte ich das jeweilige Item dazu ermitteln... mit Item.getItemdefinition(short TypeID) gehts nicht
    da ja der Datentyp von TerrainID integer, selbst wenn ich den datentyp in der Funtion Item.getItemDefinition()
    umboxe ergo Item.getItemDefinition((short)event.getTerrainID) erhalte ich null zurück.


    Wer kann mir dabei etwas helfen die Sachlage zu verstehen?


    vielen lieben Dank schon mal.


    Blacky1004 / Jens ?(

    Programmierer machen nie Fehler! Sie bauen nur neue Features ein....

  • Mit "getTerrainID()" erhälst du im Grunde die "Block ID", also die ID des Materials (Stein, Erde, Kohle etc). Das ist noch kein explizites Item. Generell gibt es nur einen einzigen Itemtyp, der mit der TerrainID was anfangen kann, nämlich das "Ore" Item (über die Textur wird dann festgelegt, ob es sich um ein Erz, um Stein, um Erde etc handelt).
    Wenn du nun also ein Item Erz Objekt erhalten möchtest, benötigst du erstmal die ItemID des "Ore" Items. Das könntest du über Item.getItemDefinition("ore") machen (alternativ bereiten wir noch eine Liste mit IDs vor). Der Einfachheithalber kann ich dir die ItemID auch nennen, das ist nämlich die ID 100


    Um nun ein Item zu spawnen kommt es darauf an, ob du ein Item in der Welt spawnen möchtest, oder ins Inventar des Spielers. Das Spielerinventar bietet die Funktion insertNewItem(), ansonsten für ein Weltitem, bietet das World object die Funktion spawnItem()

  • guten Morgen Red_51,


    vielen Dank für deine Antwort. Der eigentliche Grund wofür ich dies brauche ist, das ich gerade darüber bin ein "Handels und Geldsystem" - Plugin zu erstellen.
    Hier soll/kann ermöglicht werden, das Erzlager erstellt werden können wo sich der/die Spieler benötigte Erze abbauen und je nachdem wie viel er abgebaut hat,
    wird ihm ein zuvor in der Datenbank/YAML,XMLDatei abgespeicherter Betrag von seinem Ingame-Geld abgezogen.
    Sicherlich könnte hierbei die ID reichen, jedoch wird es für den Betreiber schwierig werden entsprechende Preislisten zu erstellen, da man sich die Masse an Items und deren
    ID schlecht merken kann. Zudem habe ich gemerkt, das ich zwar die ID erhalte, jedoch nur eine ID ich hab mal einen Screenshot gemacht, damit das besser verdeutlicht werden kann.
    Im Chatfenster sieht man die ID hier -102, im rechten Bereich steht, das ich 2x Kupfer und einmal Stein abgebaut habe.
    Hierbei wäre es für mich wichtig zu wissen, woher ich die Anzahl der abgebauten Erze beziehen kann.


    Auch sind Auktionshäuser, Shops und Lizenzen vorgesehen, so kann ein Spieler (wenn spieltechnisch machbar) sich z.B. eine "Fluglizenz" kaufen mit der er eine Zeit,
    die ebenfalls festgelegt werden kann, den Flugmodus erhält. Das gleiche trifft auch für den Creativemodus zu.
    entsprechende 3D-Modelle habe ich in Blender schon erstellt. und auch schon teilweise ins Spiel integriert, hier z.b. ein Bankautomat ;)
    Auch sollen Handelsposten für verschiedene Erze/Holz usw. geben, wo der Spieler die Sachen farmen kann und diese bei dem jeweiligen handelposten verkaufen kann.
    Soweit mein bisheriger Plan.


    Da ja nun die langerwartende Java-Api draussen ist, und ich sie einfach nur SUPER finde, denke ich das ich das alles über kurz oder lang umgesetzt bekomme.


    viele liebe Grüße aus dem sonnigen Sachsen


    Blacky1004/Jens

  • Das hört sich auf jeden Fall vielversprechend an :thumbup:


    Sicherlich könnte hierbei die ID reichen, jedoch wird es für den Betreiber schwierig werden entsprechende Preislisten zu erstellen, da man sich die Masse an Items und deren
    ID schlecht merken kann

    Also um von einer ID das dazugehörige Item zu bekommen (oder umgekehrt), muss man den Umweg über die Definitionsdatei der Items gehen. Die Klasse Item hat zwei statische Methoden getItemDefinition(short) und getItemDefinition(String). Zurück erhält man ein Item.Definition Objekt, welches dir alle nötigen Infos zum entsprechenden Item gibt (zB den Namen des Items):

    Java
    short itemID = 23; //Unsere ItemID
    Item.Definition def = Item.getItemDefinition(itemID);
    //Sicherheitshalber prüfen, ob nicht null
    if(def != null){
    //Liefert den Namen des items zurück, in dem Fall "pickaxe"
    String itemname = def.getItemName();
    }


    Bedenke im Falle des Terrainevents, dass du immer ein "ore" Item zurückerhälst, mit der entsprechenden "variation" (in dem Fall zB -102).


    PS: In der ersten Version der PluginAPI gab diese Fkt fälschlicherweise noch regelmäßig null zurück, lade die API ggf. nochmal erneut herunter falls dem so ist ^^


    Zudem habe ich gemerkt, das ich zwar die ID erhalte, jedoch nur eine ID ich hab mal einen Screenshot gemacht, damit das besser verdeutlicht werden kann.

    Ja, das ist wahr. Tatsächlich ist es über das TerrainEvent nicht möglich, einen Zugriff auf alle Items zu erhalten, die dabei herausspringen. In dem Fall wäre das Event eher ungeeignet. Besser wäre hier ein PlayerInventoryAddEvent (oder so ähnlich), welches leider noch nicht in der API vorhanden ist. Es wird vermutlich mit dem nächsten Update eingebaut (wobei ich das noch nicht genau sagen kann), dieses würde dann für jedes Item getriggert werden (also in deinem Fall wäre das einmal für Kupfer [mit dem Hinweis, dass die Stacksize 2 beträgt] und einmal für Stein). Auch wäre dort vmtl. ein Feld vorhanden, was die Herkunft des Items angibt (aufgehoben, gepflückt, abgebaut etc).

  • @red51


    Hallo Red51,


    vielen Dank für die ausführliche Erklärung! Da ich ja noch andere Funktionen in das Plugin einarbeiten möchte, werde ich das Thema mit dem Erzlager erstmal nach hinten verlagern und mich der Sache
    annehmen, wenn das von Dir besprochene Event in der Api vorhanden ist.
    Beachtlich und sehr vorteilhaft an der Java-API finde ich, das der Spieler diese Plugins nicht runterladen muss und so der Client nicht mit unzähligen Plugins von anderen Servern überlagert wird.


    Auch möchte ich diesen Thread gleich dazu nutzen um mich für den TOP Support zu bedanken, dieser ist nicht bei jedem Gamerhersteller selbstverständlich! :thumbsup:
    Ebenfalls denke ich, das alleine schon zum jetzigen Stand von Rising World und da bin ich überzeugt, nicht nur ich die Meinung vertrete, sich Hersteller wie Mojang und Co.. warm anziehen sollten.
    Sandboxgames deren Terrains auf (infinte) Cube/MarchinCube/Voxelterrain aufsetzen gibt es einige nur sind da leider die Möglichkeiten in der der Spieler selbst Einfluß auf das Spielgeschehen als auch
    auf den Weltaufbau hat sehr beschränkt!


    In diesem Sinne wünsche ich allen und @red51 noch einen schönen restlichen Sonntag auch wenn das Wetter nicht so rosig ist.


    Cu Blacky1004

    Programmierer machen nie Fehler! Sie bauen nur neue Features ein....

  • Ein kleines Anliegen habe ich noch...


    folgender Quellcode:

    Java
    ...
    Player p = event.getPlayer();
    Inventory pInventory = p.getInventory();
    Item[] items = pInventory.getAllItems();
    if(items != null && items.length > 0){
    for(int i=0; i <items.length; i++){
    Item.Definition itemDefinition = Item.getItemDefinition(items[i].getTypeID());
    p.sendTextMessage(itemDefinition.getItemName()+" "+itemDefinition.getItemType()+" ("+itemDefinition.getStrength()+")");
    }
    }

    erzeugt bei mir folgenden Fehler im Logfile:


    Der Logeintrag "at de.wts.listener.PlayerListener.onPlayerInteract(PlayerListener.java:148)" entspricht dieser Zeile in meinem Quellcode "Item.Definition itemDefinition = Item.getItemDefinition(items[i].getTypeID());"



    die Plugin-Api habe ich gestern frisch runtergeladen. Vieleicht kannst Du mir ja da weiterhelfen 8)
    Als letzte Frage : Ist es so, das ich mit der Methode getInventory aus der Klasse Player nur die 5 Items aus meiner Actionbar erhalte?


    vielen Dank schonmal


    Blacky1004

    Programmierer machen nie Fehler! Sie bauen nur neue Features ein....

  • Caused by: java.lang.ClassNotFoundException: commons.definitions.Items

    Hmpf, das ist tatsächlich ein Fehler, bzw. liegt an der Obfuscation des Spiels. Das wird in Kürze behoben, vll morgen schon als Nightly in Steam verfügbar, ich sage dann jedenfalls Bescheid :)


    Als letzte Frage : Ist es so, das ich mit der Methode getInventory aus der Klasse Player nur die 5 Items aus meiner Actionbar erhalte?

    Also getInventory() liefert ja das jeweilige Spielerinventar zurück, darin hast du im Grunde Zugriff auf alle Items, die der Spieler besitzt. Das Inventar ist quasi in 4 Kategorien unterteilt, mit den getItem() oder getItems() Funktionen erhälst du das jeweilige Item bzw. die Items des jeweiligen SlotType (Quickslots [Hotbar], Armor, Equipment oder Inventory [Hauptinventar]). Mit getAllItems() wird ein neues Array erstellt, welches sämtliche Items des Inventars enthält. Man muss generell bedenken, dass die zurückgelieferten Arrays immer eine feste Länge haben. Wenn in irgendeinem der Inventarslots kein Item vorhanden ist, ist der entsprechende Slot im Array null

Participate now!

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