Hallo zusammen,
ich hoffe, es passt hier rein. Nachdem ich mehrere Stunden mich mit der Serialisierung von ItemStacks rumgeschlagen habe (Die Blöden Dinger möchten einfach nicht in die Datenbank rein), habe ich schlussendlich doch eine erstaunlich einfache Methode gefunden.
Hintergrund: Ich möchte einige (private aber auch öffentliche) Plugins optimieren, zum Beispiel wäre doch ein ChestShop mit MySQL-Datenbanken ganz nett.
Idee: Ich benutze die Yaml-Methode, um ein ItemStack als YamlConfiguration abzuspeichern. Danach forme ich die YamlConfiguration in ein String um. Es ist zwar noch nicht perfekt, aber funktioniert bereits (Item in Datenbank reinschreiben, Item aus Datenbank lesen und in Inventar geben).
Vielleicht hilft das hier jemand anderen weiter. Der große Vorteil ist, dass man nicht über Abhängigkeiten speziell der Minecraft-Version gehen muss und die Items "lesbar" in der Datenbank stehen. Mutige Leute könnten daher sogar ihre Items in der Datenbank verändern und editieren.
Meine Tests haben zudem ergeben, dass die Serialisierung mit der hier vorgeschlagenen Yaml-Methode kürzer als die von ChestShop (-> Base64-codiert) ist.
In der MySQL-Datenbank war die entsprechende Spalte als "Text" deklariert.
Insert:
Auslesen:
Und was soll ich sagen - sogar ganze Inventare lassen sich so in Datenbanken schreiben
Das ganze muss man aber mit Vorsicht benutzen. Immerhin könnten bei einem vollen Inventar (z.B. mit beschriebenen Büchern) die Text-Länge nicht ausreichend sein.
Achso - in der Datenbank sieht es dann am Ende so aus:
Oben ein paar Itemeinträge, unten noch 2 Inventare von mir.
Vielleicht hilft es wem. Und vielleicht hat wer Verbesserungsvorschläge
Grüße Joo
ich hoffe, es passt hier rein. Nachdem ich mehrere Stunden mich mit der Serialisierung von ItemStacks rumgeschlagen habe (Die Blöden Dinger möchten einfach nicht in die Datenbank rein), habe ich schlussendlich doch eine erstaunlich einfache Methode gefunden.
Hintergrund: Ich möchte einige (private aber auch öffentliche) Plugins optimieren, zum Beispiel wäre doch ein ChestShop mit MySQL-Datenbanken ganz nett.
Idee: Ich benutze die Yaml-Methode, um ein ItemStack als YamlConfiguration abzuspeichern. Danach forme ich die YamlConfiguration in ein String um. Es ist zwar noch nicht perfekt, aber funktioniert bereits (Item in Datenbank reinschreiben, Item aus Datenbank lesen und in Inventar geben).
Vielleicht hilft das hier jemand anderen weiter. Der große Vorteil ist, dass man nicht über Abhängigkeiten speziell der Minecraft-Version gehen muss und die Items "lesbar" in der Datenbank stehen. Mutige Leute könnten daher sogar ihre Items in der Datenbank verändern und editieren.
Meine Tests haben zudem ergeben, dass die Serialisierung mit der hier vorgeschlagenen Yaml-Methode kürzer als die von ChestShop (-> Base64-codiert) ist.
In der MySQL-Datenbank war die entsprechende Spalte als "Text" deklariert.
Insert:
Code:
ItemStack is = player.getInventory().getItemInMainHand();
YamlConfiguration config = new YamlConfiguration();
config.set("item", is);
String serialized = config.saveToString();
conn.insertString(serialized, e -> {
// hier einfach in die Datenbank einsetzen. Aufgrund vorhandener Async-API ist das hier asynchron
if(e != null) e.printStackTrace();
});
Code:
conn.getFirstString((string, exception) -> {
// asynchrone Abfrage
if(exception != null) {
exception.printStackTrace();
return;
}
YamlConfiguration config2 = new YamlConfiguration();
try {
config2.loadFromString(string);
} catch (InvalidConfigurationException e) {
e.printStackTrace();
return;
}
Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
// player.getInventory().addItem() dürfte nicht threadsafe sein!
ItemStack is2 = config2.getItemStack("item");
player.getInventory().addItem(is2);
});
});
Und was soll ich sagen - sogar ganze Inventare lassen sich so in Datenbanken schreiben
Code:
PlayerInventory inventory = player.getInventory();
YamlConfiguration config = new YamlConfiguration();
config.set("inventory", inventory);
String ser = config.saveToString();
conn.insertString(ser, e -> {
if(e != null) e.printStackTrace();
});
Das ganze muss man aber mit Vorsicht benutzen. Immerhin könnten bei einem vollen Inventar (z.B. mit beschriebenen Büchern) die Text-Länge nicht ausreichend sein.
Achso - in der Datenbank sieht es dann am Ende so aus:
Oben ein paar Itemeinträge, unten noch 2 Inventare von mir.
Vielleicht hilft es wem. Und vielleicht hat wer Verbesserungsvorschläge
Grüße Joo