diff --git a/pom.xml b/pom.xml
index 023639fa..077f7e85 100644
--- a/pom.xml
+++ b/pom.xml
@@ -150,6 +150,11 @@
bstats-bukkit
1.1
+
+ com.googlecode.json-simple
+ json-simple
+ 1.1.1
+
3.0-SNAPSHOT
diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java
index 3c65ffc9..be6b5f32 100644
--- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java
+++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java
@@ -143,4 +143,9 @@ public abstract class BukkitVersionHelper {
* Test if broken unloadChunk
*/
public boolean isUnloadChunkBroken() { return false; }
+ /**
+ * Get skin URL for player
+ * @param player
+ */
+ public String getSkinURL(Player player) { return null; }
}
diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java
index 54d98c3b..363002c6 100644
--- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java
+++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java
@@ -3,6 +3,7 @@ package org.dynmap.bukkit;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.nio.charset.Charset;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
@@ -15,6 +16,14 @@ import org.bukkit.Server;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.dynmap.Log;
+import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder;
+
+import com.google.common.base.Charsets;
+import com.google.common.collect.ForwardingMultimap;
+import com.google.common.collect.Iterables;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonParseException;
/**
* Helper for isolation of bukkit version specific issues
@@ -95,6 +104,15 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper {
protected Method server_getonlineplayers;
/** Player */
protected Method player_gethealth;
+ // CraftPlayer
+ private Class> obc_craftplayer;
+ private Method obcplayer_getprofile;
+ // GameProfile
+ private Class> cma_gameprofile;
+ private Method cmaprofile_getproperties;
+ // Property
+ private Class> cma_property;
+ private Method cmaproperty_getvalue;
BukkitVersionHelperGeneric() {
failed = false;
@@ -120,7 +138,17 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper {
server_getonlineplayers = getMethod(Server.class, new String[] { "getOnlinePlayers" }, new Class[0]);
/** Player */
player_gethealth = getMethod(Player.class, new String[] { "getHealth" }, new Class[0]);
-
+
+ // CraftPlayer
+ obc_craftplayer = getOBCClass("org.bukkit.craftbukkit.entity.CraftPlayer");
+ obcplayer_getprofile = getMethod(obc_craftplayer, new String[] { "getProfile" }, new Class[0]);
+ // GameProfile
+ cma_gameprofile = getOBCClass("com.mojang.authlib.GameProfile");
+ cmaprofile_getproperties = getMethod(cma_gameprofile, new String[] { "getProperties" }, new Class[0]);
+ // Property
+ cma_property = getOBCClass("com.mojang.authlib.properties.Property");
+ cmaproperty_getvalue = getMethod(cma_property, new String[] { "getValue" }, new Class[0]);
+
/* Get NMS classes and fields */
if(!failed)
loadNMS();
@@ -482,5 +510,52 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper {
return ((Double) health).intValue();
}
}
+
+ private static final Gson gson = new GsonBuilder().create();
+
+ public class TexturesPayload {
+ public long timestamp;
+ public String profileId;
+ public String profileName;
+ public boolean isPublic;
+ public Map textures;
+
+ }
+ public class ProfileTexture {
+ public String url;
+ }
+
+ /**
+ * Get skin URL for player
+ * @param player
+ */
+ public String getSkinURL(Player player) {
+ String url = null;
+ Object profile = callMethod(player, obcplayer_getprofile, nullargs, null);
+ if (profile != null) {
+ Object propmap = callMethod(profile, cmaprofile_getproperties, nullargs, null);
+ if ((propmap != null) && (propmap instanceof ForwardingMultimap)) {
+ ForwardingMultimap fmm = (ForwardingMultimap) propmap;
+ Collection