Correctly serialize and deserialize ItemMeta (Previously not working) #414

This commit is contained in:
libraryaddict 2019-12-21 14:45:10 +13:00
parent b2193ad021
commit f130d55170
2 changed files with 43 additions and 2 deletions

View File

@ -3,7 +3,9 @@ package me.libraryaddict.disguise.utilities.json;
import com.comphenix.protocol.wrappers.WrappedGameProfile; import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.google.gson.*; import com.google.gson.*;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.HashMap; import java.util.HashMap;
@ -17,12 +19,36 @@ public class SerializerItemStack implements JsonSerializer<ItemStack>, JsonDeser
@Override @Override
public JsonElement serialize(ItemStack src, Type typeOfSrc, JsonSerializationContext context) { public JsonElement serialize(ItemStack src, Type typeOfSrc, JsonSerializationContext context) {
return context.serialize(src.serialize()); Map<String, Object> partialSerialize = src.serialize();
if (partialSerialize.containsKey("meta")) {
partialSerialize.put("meta", src.getItemMeta().serialize());
}
return context.serialize(partialSerialize);
} }
@Override @Override
public ItemStack deserialize(JsonElement json, Type typeOfT, public ItemStack deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException { JsonDeserializationContext context) throws JsonParseException {
return ItemStack.deserialize(context.deserialize(json, HashMap.class)); HashMap map = context.deserialize(json, HashMap.class);
if (map.containsKey("meta")) {
Map meta = (Map) map.get("meta");
if (meta.containsKey("meta-type")) {
for (Object key : meta.keySet()) {
if (meta.get(key) instanceof Number) {
meta.put(key, ((Number) meta.get(key)).intValue());
}
}
ItemMeta itemMeta = ReflectionManager.getDeserializedItemMeta(meta);
map.put("meta", itemMeta);
}
}
return ItemStack.deserialize(map);
} }
} }

View File

@ -18,6 +18,7 @@ import org.bukkit.craftbukkit.libs.org.apache.commons.io.IOUtils;
import org.bukkit.entity.*; import org.bukkit.entity.*;
import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
@ -1158,4 +1159,18 @@ public class ReflectionManager {
return null; return null;
} }
public static ItemMeta getDeserializedItemMeta(Map<String, Object> meta) {
try {
Method method = getCraftMethod(getCraftClass("inventory.CraftMetaItem$SerializableMeta"), "deserialize",
Map.class);
return (ItemMeta) method.invoke(null, meta);
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
} }