ServerPlugin Itemsystem

Dieses Thema im Forum "Programmierung" wurde erstellt von waoler, 27. Dezember 2015.

  1. waoler
    Offline

    waoler

    Registriert seit:
    31. März 2012
    Beiträge:
    72
    Ort:
    Auf dem Mond
    Minecraft:
    waoler
    Guten Morgen liebe Community,
    heute erstelle ich endlich den Thread für mein aktuelles Projekt. Bei den bisherigen Problemen konnte ich immer noch im Chat nachfragen, doch mittlerweile ist es besser mit einem Thread :) Ich werde also immer wenn ich wieder ein Problem haben, diesen Threa nutzen, deswegen bitte ich diesen nicht vorzeitig zu schließen, danke :*
    Also nun zum Thema: Ich bastel im Moment an einem Plugin für "besondere Items". Diese Items können spezielle Fähigkeiten haben oder auch andere besondere Dinge, die aber noch geheim sind.
    Aktuelle Lage: Ich versuche für jedes Item eine Klasse zu erstellen, welche die ItemStack Klasse extended. Das klappt auch alles soweit und ich kann über diese Klasse ein Objekt (das Item) erstellen. ABER!: Wenn ich im späteren Verlauf des Spiels, z.B. einen Befehl nutze und dort das Item was ich dem Spieler hinzugefügt habe überprüfe ob es der Klasse gehört, bekomme ich ein false zurück (p.getItemInHand() instanceof Item).
    Nun habe ich mittels RemoteDebug herausgefunden, das schon zu dem Zeitpunkt bei welche ich das Item in das Inventar des Spielers packe, er schon nicht mehr weiß das es zur Itemclass gehört (p.getInventory().addItem(new Item());).
    Mein erster Gedanke war, dass es vielleicht mit dem serialisieren bzw. deserialisieren zu tun hat und habe deshalb die beiden Methoden überschrieben und ihnen meine weiteren Eigenschaften des Items mitgeteilt. Leider ohne Erfolg. (Eigentlich logisch weil es ja trotzdem ein Objekt davon sein sollte :/)

    Also ich hoffe es ist so halb verstanden worden, was ich machen möchte und welches Problem ich habe. Ich hoffe einer von euch kann mir da weiterhelfen und evt. einige Antworten geben. Ich verzeifel schon und bin im Moment auch garnicht mehr sicher, ob mein Vorhaben überhaupt so umsetztbar ist mit Bukkit / Spigot.
    Wenn noch fragen sind, immer her damit!

    MfG Jony aka. waoler
     
    #1
  2. adagi
    Offline

    adagi

    Registriert seit:
    3. Oktober 2015
    Beiträge:
    65
    Ort:
    hinter dir
    Minecraft:
    adagi
    @waoler
    Hallo,
    ich bin mir nicht sicher, ob ich dich richtig verstanden habe.. Wenn ich es richtig verstanden habe, ist die einfachste Lösung wahrscheinlich, dass du IN jeder ItemClass nen Listener reinpackst. Da kannst du dann die gewünschten Dinge reinschreiben.
    LG adagi

    P.S. Ich glaube zwar nicht, dass ich es richtig verstanden habe, denn meine Lösung ist so simpel. Aber wer weiß.. Jeder hatte schon Blackouts!
     
    #2
  3. waoler
    Offline

    waoler

    Registriert seit:
    31. März 2012
    Beiträge:
    72
    Ort:
    Auf dem Mond
    Minecraft:
    waoler
    Naja theoretisch würde das gehen, aber ich habe noch andere Dinge die mit den Items passieren sollen. Und diese kann man nicht einfach in der Klasse selber machen.
    Man kann die Items "verbessern" und so deren Attribute und Enchantings erhöhen. Das z.B. ist mit deiner Lösung nicht Möglich. Aber danke für deine Idee, gerne mehr davon!

    MfG
     
    #3
  4. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Öhm soweit ich weiß geht das am einfachsten mithilfe von NBT anders wirst du es nicht hinbekommen das Item von normalen Items zu unterscheiden. (Höchstens durch die Lore oder den Namen ist aber wahrscheinlich keine Elegante Lösung)

    So wie du es vorhast wäre es meines Wissens nur durch Umschreiben der Server Software bzw. mit einer Mod möglich.
     
    #4
  5. adagi
    Offline

    adagi

    Registriert seit:
    3. Oktober 2015
    Beiträge:
    65
    Ort:
    hinter dir
    Minecraft:
    adagi
    @JTK222 : Wieso nicht? Ich will schließlich wissen, was mein Item kann und das ist am bestem in einem kurzen & knackigen Text als Lore und in einem aussagekräftigen Namen verpackt.
    @JTK222 : Wie bereits erwähnt, halte ich das für unnötig!

    @waoler : Ok! Sorry, hab ich wohl falsch verstanden! :D
     
    #5
  6. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Schön und Gut und was wenn 2 Items genau gleich sind? Jedenfalls von der Beschreibung?
    Außerdem würde es mich meistens Stören eine Ewig lange beschreibung zu haben klar einige Stats sind Pflicht,
    aber sagen wir mal folgendes:
    Frost schwert: Verlangsamt Gegner
    Klebriges Schwert: Verlangsamt Gegner
    Bam 1. Problem gefunden. Gibt noch einige mehr die ich aber nicht aufzählen möchte.


    Habe doch nur gesagt dass er die Server Software umschreiben müsste so wie er es aktuell geplant hat :O
    Ich persönlich würde es nicht nur unnötig finden sondern auch nervig weil man es bei jedem Update anpassen müsste.

    Edit: Solltest du dass mit dem NBT nicht wollen: https://bukkit.org/threads/storing-hidden-data-in-itemstacks-using-colors-persistent-no-nms.319970/
    Dort wird gezeigt wie man die Lore auch unsichtbar machen kann würde dann aber versuchen so viel wie möglich in eine Zeile zu stecken ^^
     
    #6
  7. adagi
    Offline

    adagi

    Registriert seit:
    3. Oktober 2015
    Beiträge:
    65
    Ort:
    hinter dir
    Minecraft:
    adagi
    @JTK222 : Wieso: Dir Lore ist ok.. aber: man kann ja Name & Lore prüfen!
    Und wenn es mehrere Stufen der Schwerter geben soll, ändert man den Namen einfach z.B. so: Frostschwert I -> Frostschwert II -> usw.
    Ich sehe hierbei KEIN PROBLEM!
     
    #7
  8. adagi
    Offline

    adagi

    Registriert seit:
    3. Oktober 2015
    Beiträge:
    65
    Ort:
    hinter dir
    Minecraft:
    adagi
    Code (Javascript):
    1. String frostschwert = "§6Frostschwert";
    2. int lvl = 2;
    3. @EventHandler
    4. public void onInteract(PlayerInteractEvent event) {
    5.    Player player = event.getPlayer();
    6.    ItemStack item = player.getItemInHand();
    7.  
    8.    if (item.getItemMeta().getDisplayName().equalsIgnoreCase(frostschwert + ChatColor.AQUA + lvl)) {
    9.       // auf diese Art auch noch Lore abfragen.. wo liegt das Problem?
    10.    }
    11. }
    Hallo,
    ich hoffe, dass der Code hilfreich ist.
    LG adagi

    P.S. er enthält evt. Fehler, da er nicht in einer IDE geschrieben wurde!
     
    #8
  9. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Mann kann items am Ambos umbennen?
    Die gleiche Diskusion gab es hier im Forum bereits einmal das mit dem NBT und unsichtbaren Lore waren die besten Lösungen.
     
    #9
  10. waoler
    Offline

    waoler

    Registriert seit:
    31. März 2012
    Beiträge:
    72
    Ort:
    Auf dem Mond
    Minecraft:
    waoler
    Danke für eure Hilfe! Das hilft mir wirklich weiter.
    Also es ist so. Die Items kann man verbessern.
    Stufe 0: Frostschwert
    Stufe 1: Frostschwert +1
    Stufe 2: Frostschwert +2
    usw...

    Ich habe das ganze System dahinter auch schon fertig, wo ich es über die Lore und den Namen regel. Die erste Zeile der Lore beinhaltet dann einen speziellen text, das man weiß das dieses Item Verbesserbar ist.
    Theoretisch funktioniert mein ganzes System schon. Aber ich wollte es eben ein bisschen eleganter mit den Klassen regeln.
    Im moment ist es so, das ich, wie ihr auch schon sagtet, den Itemname und die Beschreibung vergleiche.
    Das ist aber eine ganz schön unübersichtliche Klasse. Da ich den Namen auch noch splitten muss, wenn ein +0, +1, +2.... vorkommt. Klar er funktioniert alles, aber schöner wäre es mit einer If(... instanceof ).

    Wenn ihr auch nicht glaubt das dies Möglich ist, werde ich einfach weiter so arbeiten wie bisher. Gerne könnt ihr euch das ganze Live ansehen. Kommt dazu einfach zu mir auf meinen TS :)

    MfG
     
    #10
    adagi gefällt das.
  11. adagi
    Offline

    adagi

    Registriert seit:
    3. Oktober 2015
    Beiträge:
    65
    Ort:
    hinter dir
    Minecraft:
    adagi
    Hallo,
    ich bin grad nicht zuhause am PC und hab hier keine IDE. Ich experimentiere dann später (zuhause) an nem Code herum, um dir zu helfen :D !
    LG adagi
     
    #11
  12. waoler
    Offline

    waoler

    Registriert seit:
    31. März 2012
    Beiträge:
    72
    Ort:
    Auf dem Mond
    Minecraft:
    waoler

    Theoretisch ist das so richtig, aber ich möchte ja das bei deine if, z.B. auch ein true geliefert wird, wenn es sich überhaupt um ein Item dieses Typen handelt. Deswegen vorher splitten, wenn ein "+" als Indikator vorhanden ist. Also am besten wieder eine Methode erstellen.
    Und genau das habe ich gemacht. Version 1 sieht folgendermaßen aus:
    Code (Text):
    1.  
    2.   public boolean equalsItem(ItemStack i, ItemStack item) {
    3.      //System.out.println(ChatColor.stripColor(i.getItemMeta().getLore().get(0)));
    4.      if(   i != null && i.hasItemMeta() && i.getItemMeta().hasLore() &&
    5.      
    6.      i.getType() == item.getType() &&
    7.      ChatColor.stripColor(i.getItemMeta().getLore().get(0)).equals(
    8.      ChatColor.stripColor(item.getItemMeta().getLore().get(0))))
    9.      {
    10.        if(   ChatColor.stripColor(i.getItemMeta().getLore().get(0)).equals(
    11.            ChatColor.stripColor(item.getItemMeta().getLore().get(0)))) {
    12.          //System.out.println(ChatColor.stripColor(i.getItemMeta().getDisplayName()));
    13.          if(ChatColor.stripColor(i.getItemMeta().getDisplayName()).contains("+")) {
    14.            String[] preLevel = i.getItemMeta().getDisplayName().split("\\+");
    15.            //System.out.println("1: '" + item.getItemMeta().getDisplayName() + "' 2: '" + ChatColor.stripColor(preLevel[0]).trim() + "'");
    16.            if(ChatColor.stripColor(item.getItemMeta().getDisplayName()).equals(ChatColor.stripColor(preLevel[0]).trim())) {
    17.              return true;
    18.            }else{
    19.              return false;
    20.            }
    21.          }else if(ChatColor.stripColor(i.getItemMeta().getDisplayName()).equals(ChatColor.stripColor(item.getItemMeta().getDisplayName()))){
    22.            return true;
    23.          }
    24.        }
    25.      }
    26.      return false;
    27. }
    Diese Methode vergleicht zwei Items, das eine ist immer das originale aus der Itemklasse und das andere z.B. das in der Hand des Spielers.

    Zu beachten ist noch das man immer alle angaben ohne Farben überprüfen muss, da ich jeder Stufe eine andere Farbe gebe. Und manchmal auch die Itemnamen eine andere Farbe haben :)
    Gerne könnt ihr mir Verbesserungsvorschläge geben, würde mich freuen wenn ihr etwas verbessern könnt.

    MfG​
     
    #12
    adagi gefällt das.
  13. Eisphoenix
    Offline

    Eisphoenix

    Registriert seit:
    9. Oktober 2014
    Beiträge:
    82
    Ort:
    Garmisch-Partenkirchen
    Minecraft:
    Eisphoenix
    Wäre es nicht einfacher und effizienter, NBT-Tags zu verwenden und dann abzufragen, ob diese vorhanden sind und welchen Wert sie haben?
     
    #13
  14. adagi
    Offline

    adagi

    Registriert seit:
    3. Oktober 2015
    Beiträge:
    65
    Ort:
    hinter dir
    Minecraft:
    adagi
    Beides ist möglich.. :D mit NBT-Tags wäre evt. besser.
     
    #14
  15. waoler
    Offline

    waoler

    Registriert seit:
    31. März 2012
    Beiträge:
    72
    Ort:
    Auf dem Mond
    Minecraft:
    waoler
    Ich habe noch nie damit gearbeitet, muss ich mir mal anschauen :)
    Danke für die Idee!

    Könnte mir einer von euch ein kurzes Beispiel zeigen, wie ich dem Item ein NBT Tag hinzufüge und es auch abfrage ? :)
     
    #15
  16. GPSforLEGENDS
    Offline

    GPSforLEGENDS

    Registriert seit:
    21. März 2014
    Beiträge:
    295
    Ort:
    Bürostuhl
    Minecraft:
    GPSforLEGENDS
    Kannst du mir bitte den Gedankengang erklären so eine Frage hier zu posten?
    Es geht 1000mal schneller eine Suchmaschine zu benutzen um dafür die Antwort zu bekommen. Ist es Faulheit? PN würde mir vollkommen reichen.

    Seiten die ich in wenigen Sekunden gefunden habe:
    http://minecraft-de.gamepedia.com/NBT-Format
    https://board.nitrado.net/community-area/programmierung/hilfe/96774/nbt-tags-editieren/
    https://hypixel.net/threads/bukkit-spigot-adding-and-checking-for-nbt-tags-on-items.383877/
    Die Methoden Namen der nms Klassen wechseln von Version zu Version, kann also sein das du die Methode zum hinzufügen von den Tags erst suchen musst (z.B mit dem mcp)
    Oder du nutzt eine libary
    http://minecraft.gamepedia.com/Development_resources
     
    #16
  17. adagi
    Offline

    adagi

    Registriert seit:
    3. Oktober 2015
    Beiträge:
    65
    Ort:
    hinter dir
    Minecraft:
    adagi
    Hallo,
    @waoler : Kannst du bitte deinen Code von Oben als Java-Code markieren?
    LG adagi
     
    #17
  18. waoler
    Offline

    waoler

    Registriert seit:
    31. März 2012
    Beiträge:
    72
    Ort:
    Auf dem Mond
    Minecraft:
    waoler
    Gerne, ich habe den ersten Teil geschrieben und abgesendet. Dann habe ich kurz überlegt und mir viel ein, das ich das doch schonmal probiert habe und ich aber nicht zu einem richtigen Ergebnis gekommen bin. Außerdem musste ich nach meinem Post relativ schnell weg und hatte gedacht das evt. jemand mal kurz diesen einzeiler hätte schreiben können.
    Leider, so wie ich es jetzt sehe, ist es kein Einzeiler dies zu machen.

    Das habe ich versucht, leider fehlt mir die Kenntniss das zu machen :/

    MfG Jony
     
    #18
  19. waoler
    Offline

    waoler

    Registriert seit:
    31. März 2012
    Beiträge:
    72
    Ort:
    Auf dem Mond
    Minecraft:
    waoler
    Nächste Kurze Frage:
    Wenn ich die Beschreibung dem Item hinzufüge, möchte ich das er automatisch eine neue Zeite nutzt, wenn der Input zu lang ist.
    Im Moment habe ich das so gelößt, das er einfach immer nach einer bestimmten Anzahl an Zeichen trenne, das geht zwar aber es besteht ein kleiner Schönheitsfehler. Er trennt die Beschreibung mitten in einem Wort. Gerne würde ich es so haben, dass es eine Mindeszeichenlänge gibt und dann ab erreichen dieser, am nächsten Leerzeichen getrennt wird.
    Aktueller Regex
    Code (Text):
    1.  
    2.     String[] ar = n.split("(?<=\\G.........................)");
    3.  
    Ein Regex Beispiel wäre wohl die erste Idee die ich hatte, bin aber auch gegenüber anderen Vorschlägen offen :)

    MfG Jony
     
    #19
  20. Eisphoenix
    Offline

    Eisphoenix

    Registriert seit:
    9. Oktober 2014
    Beiträge:
    82
    Ort:
    Garmisch-Partenkirchen
    Minecraft:
    Eisphoenix
    Mit Regex kenne ich mich nichts aus, aber mit einer for schleife
    die einfach nur continue und sobald i > min einfach testen ob es ein Leerzeichen ist. Würde ein Code reinstellen wenn ich nicht am Handy wäre :D
     
    #20