[Minecraft/Spigot/Java] Wie kann ich aus einem GameProfile Skins abspeichern?
Hallo,
ich würde gerne wissen wie ich aus dem GameProfile die für den Skin nötigen Daten bekomme, um diese abzuspeichern.
Es soll zu einem Cachingsystem dienen, damit auch beispielsweise die Köpfe von Spielern angezeigt werden können, die nicht online sind, ohne zu viele Anfragen an die Mojang Server zu stellen.
Folgenden Code nutze ich um das GameProfile von einem Spieler zu erhalten und diesem seinen eigene Kopf über die Informationen des GameProfiles zu geben. Dabei wende ich ein Object aus dem Reflection Bereich an (Field).
public static ItemStack getFriendTool(Player p){
SkullMeta freundeMeta = (SkullMeta) Bukkit.getItemFactory().getItemMeta(Material.SKULL_ITEM);
GameProfile gp = ((CraftPlayer) p).getProfile();
try {
Field field = skullMetaClass.getDeclaredField("profile");
field.setAccessible(true);
try {
field.set(freundeMeta, gp);
} catch (IllegalArgumentException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
field.setAccessible(!field.isAccessible());
} catch (NoSuchFieldException | SecurityException e) {
e.printStackTrace();
}
freundeMeta.setDisplayName("§eFreunde");
ArrayList<String> freundeLore = new ArrayList<String>();
freundeLore.add("Mit einem Rechtsklick öffnest Du die Freunde Übersicht,");
freundeMeta.setLore(freundeLore);
ItemStack freundeTool = new ItemStack(Material.SKULL_ITEM,1, (byte)3);
freundeTool.setItemMeta(freundeMeta);
return freundeTool;
}
Dieser Code funktioniert bereits nur wäre es eben gut, wenn ich die nötigen Informationen aus dem GameProfile abspeichern könnte und diese wiederverwenden könnte.
Meiner Überlegung nach, müsste ich diese aus einem Property Object bekommen, leider hat aber eine Recherche nichts gebracht.
Vielen Dank für jegliche Hilfe.
2 Antworten
Der Skin ist im Base64 Format gespeichert und als JSON gepackt :D
Ein teil aus meinem NickSystem:
String props = new String(
Base64.decodeBase64(profile.getProperties().values().iterator().next().getValue()));
JSONObject json = (JSONObject) new JSONParser().parse(props);
if (json.get("textures").toString().equals("{}")) {
profile = GameProfileBuilder.getProfile(profile.getId(), profile.getName(),
"http://textures.minecraft.net/texture/cb3cccd95365c5d85644a536e69b4be58ebfbf16f43cf561786b74da2b8eeb");
}
json.get("textures").toString() //Die Skin-URL als JSON
Die Skin-URL ist "{}" wenn das GameProfile keinen Skin hat. In diesem Fall erstelle ich in meinem Code ein neues GameProfile, mit einem Steve Skin.
Du müsstes theoretisch mal die Skin-URL als JSON in der Konsole ausgeben lassen und kannst dann schauen, wie du an die URL selber kommst.
Wenn ich mich nicht täusche, dann dürfte es so klappen:
json = (JSONObject) new JSONParser().parse(json.get("textures"));
json.get("url").toString(); //Die URL (Hoffentlich xD)
LG Sprax2013
Vielen Dank für Deinen Ansatz, schaut bisher sehr logisch aus. Ich bin noch im Urlaub, werde es aber nachdem Urlaub testen. Hoffentlich wird's klappen
Öhm das was du da schreibst sagt mir nicht wirklich viel, da ich mich mit java selbst kaum auskenne
Aber die allgemeine skin datei findest du hier de.namemc.com