ServerPlugin [Bukkitplugin] Abgeändertes Item eindeutig identifizieren

Dieses Thema im Forum "Programmierung" wurde erstellt von vMief, 28. Februar 2015.

  1. vMief
    Offline

    vMief

    Registriert seit:
    31. Januar 2015
    Beiträge:
    15
    Minecraft:
    Der_Schlumpf
    Hallo Leute,

    ich bin aktuell dabei, eine Plugin für Bukkit/Spigot zu schreiben. Dieses Plugin würde im optimalfall ein komplett neues Item erzeugen, da dies aber nicht ohne Clientmods möglich ist, nehme ich ein vorhandenes und ändere dieses ab. Dass heißt, dass Item bekommt einen neuen Namen und einen neuen "Lore"-Text. Allerdings würde ich dem Item noch gerne eine eindeutige, nicht sichtbare Information bei geben, da die anderen beiden Parameter relativ einfach (bis auf den Lore-Text) geändert werden, oder ein eigenes Item mit den gleichen Namen.
    Deswegen hätte ich gerne eine eigene, unsichtbare Eingenschaft diesem Item hinzugefügt. Irgendetwas in Richtung NBT-Tag oder so etwas, womit ich das Item unabhängig vom Namen identifizieren kann.
     
    #1
  2. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Du könntest alle ItemStacks, die das andere Item darstellen in einer Collection speichern, so kannst du immer überprüfen, ob es sich um das spezielle Item handelt. Du musst nur darauf achten, dass die Collection darauf achtet, dass es sich um das gleiche Objekt und nicht um ein selbes handelt.
    Eine andere Möglichkeit sehe ich nicht.
     
    #2
  3. vMief
    Offline

    vMief

    Registriert seit:
    31. Januar 2015
    Beiträge:
    15
    Minecraft:
    Der_Schlumpf
    Würde das auch noch nach einem Restart funktionieren? Man kann ja keine Objekte zwischen speichern, zumindest nicht vernünftig. Außerdem wäre das ja eine ziemlich unschöne Methode, da sich das Item endlos erzeugen lässt und irgendwann würde die Überprüfung einfach zu lange dauern.
     
    #3
  4. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Nach einem Restart ist es weg. Mit der Leistung das würde wahrscheinlich kein allzu großes Problem sein, kommt aber drauf an, wie viele Items es gibt. Und ja, die Methode ist nicht das Gelbe vom Ei. Wo liegt denn das Problem, das mit der Lore zu machen. Die kann man nicht einfach ändern. Außerdem könntest du im Namen Farbcodes verwenden, auch wenn es nur "§f" ist, da man diese im Amboss nicht benutzen kann.
     
    #4
  5. vMief
    Offline

    vMief

    Registriert seit:
    31. Januar 2015
    Beiträge:
    15
    Minecraft:
    Der_Schlumpf
    Das Problem einer Überprüfung mit Name und Lore-Text ist einfach, dass so eine lokalisierung nur schwierig wäre. Wenn der Serverowner dann irgendwann die Sprache ändern sollte, oder den Text in der Sprachdatei, wären alle vorher erzeugten Items nutzlos, da das Plugin sie nicht mehr erkennen würde.
    Gibt es denn keine Möglichkeit, irgendetwas unsichtbares zu dem Item hinzuzufügen?
     
    #5
  6. AnonymusChaotic
    Offline

    AnonymusChaotic

    Registriert seit:
    22. November 2013
    Beiträge:
    762
    Ort:
    Wien, Österreich
    Minecraft:
    AnonymusChaotic
    Ich bin zwar kein Developer, allerdings hat (oder zumindest hatte) das Plugin PaintballWarEdition irgend eine Funktion, die es dem Plugin ermöglicht, normale Schneebälle von Ingame-Schneebällen zu unterscheiden.

    (mit Essentias /invsee Inventar eines anderen Spielers öffnen und Bälle hineinlegen, ev. auch auf den selben Namen umbenannt.)

    Vielleicht findest Du den Code irgendwo und kannst das herauslesen ^^.
     
    #6
  7. pasce1998
    Offline

    pasce1998

    Registriert seit:
    20. April 2014
    Beiträge:
    21
    Ort:
    Hessen
    Minecraft:
    pasce1998
    @AnonymusChaotic Bei Schneebällen ist es etwas anders. Schneebälle sind Entitys und Entitys kann man Metadaten setzen und diese dann beim treffen abfragen.

    @vMief leider befürchte ich das du keine dauerhaft, unsichtbare Informationen auf Items speichern kannst.
    Eine kleine Idee hätte ich aber dazu.
    Du könntest den Items ein Enchantment geben, welches nichts auf diesem Item bringt. Später könntest du dann abfragen, ob das Item dieses Enchantment in der Höhe hat, die du festgelegt hast. Man kann dieses Enchantment zwar sehen, aber es wäre ein Lösungsweg, da Enchantments immer gespeichert bleiben.
     
    #7
  8. Janhektor
    Offline

    Janhektor

    Registriert seit:
    10. Januar 2013
    Beiträge:
    11
    Ich hätte eine etwas aufwändigere Idee: Du gibst dem Item eine Lore und machst bestimmte Zeilen unsichtbar.
    Ich meine, irgendwann sendet der Server dem Client ja Packets. Diese Packets beinhalten bei einem Item auch Informationen zu DisplayName und Lore. Das dafür zuständige Packet musst du abfangen und modifizieren. Dann sieht der Client es anders, als es eigentlich ist.
     
    #8
  9. vMief
    Offline

    vMief

    Registriert seit:
    31. Januar 2015
    Beiträge:
    15
    Minecraft:
    Der_Schlumpf
    Ich denke, dass die Sache mit der Verzauberung einfacher ist :D Und Truhen kann man Wahrscheinlich auch nicht Ingame verzaubern.
     
    #9
  10. AnonymusChaotic
    Offline

    AnonymusChaotic

    Registriert seit:
    22. November 2013
    Beiträge:
    762
    Ort:
    Wien, Österreich
    Minecraft:
    AnonymusChaotic
    Ja, aber
    ja, aber im Inventar sind es ja noch items, Zur Entity werden sie ja erst, wenn sie gerechtsklickt werden
     
    #10
  11. pasce1998
    Offline

    pasce1998

    Registriert seit:
    20. April 2014
    Beiträge:
    21
    Ort:
    Hessen
    Minecraft:
    pasce1998
    Naja dazu kommt halt noch die Abfrage, ob der Spieler grade Paintball spielt, also in einer Liste eingetragen ist, oder halt eben nicht. Wenn der Spieler dann in der Liste, also im Spiel ist, werden dem Schneeball die Metadaten gesetzt, ansonsten eben nicht ;)
     
    #11
  12. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Die Schneebälle können, wie in meinem 1. Post beschrieben, temporär gespeichert werden. Das wird wohl bei Paintball auch so sein. Da braucht man keine Metadaten.
    Da hilft eine Antwort von einem, der "kein Developer", ist auch nicht weiter.
     
    #12
    MrPyro13 gefällt das.
  13. DerDr4g0n
    Offline

    DerDr4g0n

    Registriert seit:
    17. Oktober 2014
    Beiträge:
    15
    Ort:
    Planet Erde.
    Du könntest auch noch versuchen via ProtocolLib NBT Tags zu setzen. Also ein Tag setzen, und Abfragen und deine Bedienungen ausführen.
     
    #13
  14. vMief
    Offline

    vMief

    Registriert seit:
    31. Januar 2015
    Beiträge:
    15
    Minecraft:
    Der_Schlumpf
    Ok, dass sieht schonmal interessant aus. Ich werde mich da mal reinlesen und es austesten. Wenn es damit so läuft, wie ich es gerne hätte, wäre das cool.
    Ohne das Plugin würde es aber wahrscheinlich kompliziert werden, oder?
     
    #14
  15. vMief
    Offline

    vMief

    Registriert seit:
    31. Januar 2015
    Beiträge:
    15
    Minecraft:
    Der_Schlumpf
    Eine kleine Frage am Rande: Wie sieht es denn mit dem "Unbreakable"-Attribut aus? Lässt sich das irgendwie Infame erzeugen? Denn dann wäre mir das irgendwie lieber, denn sollte das Plugin irgendwann inkompatibel werden, hätte ich einfach Pech gehabt.
     
    #15
  16. JTK222
    Online

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Wäre es nicht am einfachsten einfach in die 1. Zeile der Lore zu schreiben: "Plugin name Item"?

    Jedenfalls gibt es ansonsten keine Einfachere möglichkeit dafür.
     
    #16
  17. vMief
    Offline

    vMief

    Registriert seit:
    31. Januar 2015
    Beiträge:
    15
    Minecraft:
    Der_Schlumpf
    Das Problem dabei ist das der Lokalisierung, wie oben schon beschrieben. Das Plugin wird später in mehreren Sprachen verfügbar sein, und wenn der Owner die Sprache ändert, ändert sich auch der Lore-Text oder wenn der Owner den Text selbst anpasst.
     
    #17
  18. JTK222
    Online

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Öhm könnte man dann nicht auch in den If abfragen die Strings aus der Config nutzen?
     
    #18
  19. vMief
    Offline

    vMief

    Registriert seit:
    31. Januar 2015
    Beiträge:
    15
    Minecraft:
    Der_Schlumpf
    Aber wenn du Items auf Englisch und Deutsch und dann noch mit abgeändertem deutschen Text hättest, wäre es praktisch nicht möglich, alle zu identifizieren. Die Wahrscheinlichkeit, dass das Eintritt ist zwar gering, aber als Programmierer sollte man vom Worst Case ausgehen.
     
    #19
  20. DerDr4g0n
    Offline

    DerDr4g0n

    Registriert seit:
    17. Oktober 2014
    Beiträge:
    15
    Ort:
    Planet Erde.
    Um ein Item "unbreakable" zu machen, nutz Spigot: itemMeta.spigot().setUnbreakable(true);
     
    #20