Items enchanten speichern

  • Also ich würde das folgendermaßen machen:


    Schreibe 2 Methoden die eine kann ein ItemStack zu einem JSON String wandeln, die andere macht das Gegenteil aus einem JSON String ein ItemStack.

    Dannach jenachdem welche Datenbank du verwendest, bei MySQL sowie bei MSSQL sollte das kein Problem sein (bei anderen weiß ich es nicht) speicherst du einfach den JSON String in Zusammenhang mit irgendeinem Key das kann eine einfache ID sein oder wenn die Namen unterschiedlich sind eben die.


    Sollte die Datenbank welche auch immer du nutzt nicht in der Lage sein json zu speichern speichere es einfach als normalen String achte nur darauf das dieser genug maximale Länge hat.


    Am Ende hast du eine Tabelle die etwa so aussieht:


    itemId itemJson
    1 { "material": "STONE", "amount": 45}
    2 { "material": "DIRT", "amount": 64,}
    3 { "material": "WOOD_SWORD", "amount": 1, "durability": 56, "enchantments": [{ "SHARPNESS": 1 }, { "KNOCKBACK": 2 } ]}


    Das is jetzt nur ein unvollständiges Beispiel wie das am Ende aussieht :D

    If you are homeless ... just buy a house, duh!

    and if you wanna have a plugin matching your conditions ... just code it yourself!

  • Das habe ich schon.

    Zur Zeit sieht der Code so aus:

    Code
    DBShopItems items = Citybuild.database.find(DBShopItems.class).where().eq("user_id", 5).findUnique();
    Gson gson = new Gson();
    Map<String, Object> map = gson.fromJson(items.getItemstack(), new TypeToken<Map<String, Object>>() {
    }.getType());
    ItemStack finalItemStack = ItemStack.deserialize(map);
    p.getInventory().setItem(0, finalItemStack);

    Allerdings kommen keine Verzauberungen aufs Item


    Datenbankeintrag:

    Code
    {"type":"BOW","meta":{"displayName":"11","lore":["§7Preis: §e19414 T"],"enchantments":{"Enchantment[1, PROTECTION_FIRE]":2},"repairCost":1,"hideFlag":0,"unbreakable":false,"unhandledTags":{}}}
  • Ja weil Bukkit das nicht von alleine macht! Das muss man manuell machen. oder du überschreibst die deserialize Methode und fügst ein das Enchantments hinzufgefügt werden.

    If you are homeless ... just buy a house, duh!

    and if you wanna have a plugin matching your conditions ... just code it yourself!

  • Also wenn du es manuell machst halt der Map hinzufügen, ansonten eine iegene ItemStack Klasse machen und die stadessen verwenden.

    If you are homeless ... just buy a house, duh!

    and if you wanna have a plugin matching your conditions ... just code it yourself!

    • Hilfreich

    Wenn die Leserlichkeit des Datenbankeintrags nur eine untergeordnete Rolle spielt, wäre hier wohl die Serialisierung in binärer Form angebrachter. Dies dürfte zudem noch effizienter sein.

    In MySQL könnte der Datentyp BLOB oder einer seiner Verwandten eingesetzt werden. Siehe MySQL Dokumentation.

    Die meisten anderen Datenbanksysteme dürften ebenfalls binäre Daten unterstützen.

    Eine Möglichkeit die ItemStacks zu serialisieren könnte beispielsweise folgendermaßen aussehen: