Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.prototype.events.revertingcapture.utils.configuration.adapters;
- import com.google.gson.*;
- import com.google.gson.reflect.TypeToken;
- import org.bukkit.ChatColor;
- import org.bukkit.Color;
- import org.bukkit.Material;
- import org.bukkit.enchantments.Enchantment;
- import org.bukkit.inventory.ItemFlag;
- import org.bukkit.inventory.ItemStack;
- import org.bukkit.inventory.meta.ItemMeta;
- import org.bukkit.inventory.meta.LeatherArmorMeta;
- import org.bukkit.inventory.meta.PotionMeta;
- import org.bukkit.potion.PotionEffect;
- import java.lang.reflect.Type;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- public final class ItemStackAdapter implements JsonSerializer<ItemStack>, JsonDeserializer<ItemStack> {
- public static final Type TYPE_LORE = new TypeToken<List<String>>() {
- }.getType();
- public static final Type TYPE_SET_ITEM_FLAGS = new TypeToken<Set<ItemFlag>>() {
- }.getType();
- @Override
- public ItemStack deserialize(JsonElement element, Type type, JsonDeserializationContext context) throws JsonParseException {
- ItemStack itemStack = new ItemStack(Material.AIR);
- JsonObject object = element.getAsJsonObject();
- itemStack.setType(Material.matchMaterial(object.get("material").getAsString()));
- if (object.has("amount")) {
- itemStack.setAmount(object.get("amount").getAsInt());
- }
- if (object.has("durability")) {
- itemStack.setDurability(object.get("durability").getAsShort());
- }
- ItemMeta itemMeta = itemStack.getItemMeta();
- if (object.has("unbreakable")) {
- itemMeta.setUnbreakable(object.get("unbreakable").getAsBoolean());
- }
- if (object.has("name")) {
- itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', object.get("name").getAsString()));
- }
- if (object.has("lore")) {
- List<String> lore = context.deserialize(object.get("lore"), TYPE_LORE);
- lore.replaceAll(string -> ChatColor.translateAlternateColorCodes('&', string));
- itemMeta.setLore(lore);
- }
- if (object.has("enchantments")) {
- JsonArray enchantments = object.get("enchantments").getAsJsonArray();
- for (JsonElement enchantmentElement : enchantments) {
- JsonObject enchantmentObject = (JsonObject) enchantmentElement;
- Enchantment enchantment = Enchantment.getByName(enchantmentObject.get("enchantment").getAsString());
- int level = enchantmentObject.get("level").getAsInt();
- itemMeta.addEnchant(enchantment, level, true);
- }
- }
- if (object.has("flags")) {
- Set<ItemFlag> flags = context.deserialize(object.get("flags"), TYPE_SET_ITEM_FLAGS);
- itemMeta.addItemFlags(flags.toArray(new ItemFlag[0]));
- }
- itemStack.setItemMeta(itemMeta);
- switch (itemStack.getType()) {
- case LEATHER_HELMET:
- case LEATHER_CHESTPLATE:
- case LEATHER_LEGGINGS:
- case LEATHER_BOOTS:
- if (object.has("color")) {
- LeatherArmorMeta leatherArmorMeta = (LeatherArmorMeta) itemStack.getItemMeta();
- leatherArmorMeta.setColor(context.deserialize(object.get("color"), Color.class));
- itemStack.setItemMeta(leatherArmorMeta);
- }
- break;
- }
- switch (itemStack.getType()) {
- case POTION:
- case SPLASH_POTION:
- case LINGERING_POTION:
- case ARROW:
- case TIPPED_ARROW:
- case SPECTRAL_ARROW:
- PotionMeta potionMeta = (PotionMeta) itemStack.getItemMeta();
- if (object.has("color")) {
- potionMeta.setColor(context.deserialize(object.get("color"), Color.class));
- }
- if (object.has("effects")) {
- JsonArray effects = object.get("effects").getAsJsonArray();
- for (JsonElement effectElement : effects) {
- potionMeta.addCustomEffect(context.deserialize(effectElement, PotionEffect.class), true);
- }
- }
- itemStack.setItemMeta(potionMeta);
- break;
- }
- return itemStack;
- }
- @Override
- public JsonElement serialize(ItemStack itemStack, Type type, JsonSerializationContext context) {
- JsonObject object = new JsonObject();
- object.addProperty("material", itemStack.getType().name());
- object.addProperty("amount", itemStack.getAmount());
- object.addProperty("durability", itemStack.getDurability());
- ItemMeta itemMeta = itemStack.getItemMeta();
- object.addProperty("unbreakable", itemMeta.isUnbreakable());
- if (itemMeta.hasDisplayName()) {
- object.addProperty("name", itemMeta.getDisplayName());
- }
- if (itemMeta.hasLore()) {
- object.add("lore", context.serialize(itemMeta.getLore(), TYPE_LORE));
- }
- if (itemMeta.hasEnchants()) {
- JsonArray array = new JsonArray();
- for (Map.Entry<Enchantment, Integer> entry : itemMeta.getEnchants().entrySet()) {
- JsonObject enchantment = new JsonObject();
- enchantment.addProperty("enchantment", entry.getKey().getName());
- enchantment.addProperty("level", entry.getValue());
- array.add(enchantment);
- }
- object.add("enchantments", array);
- }
- if (itemMeta.getItemFlags().size() > 0) {
- object.add("flags", context.serialize(itemMeta.getItemFlags(), TYPE_SET_ITEM_FLAGS));
- }
- switch (itemStack.getType()) {
- case LEATHER_HELMET:
- case LEATHER_CHESTPLATE:
- case LEATHER_LEGGINGS:
- case LEATHER_BOOTS:
- LeatherArmorMeta leatherArmorMeta = (LeatherArmorMeta) itemMeta;
- object.add("color", context.serialize(leatherArmorMeta.getColor(), Color.class));
- break;
- }
- switch (itemStack.getType()) {
- case POTION:
- case SPLASH_POTION:
- case LINGERING_POTION:
- case ARROW:
- case TIPPED_ARROW:
- case SPECTRAL_ARROW:
- PotionMeta potionMeta = (PotionMeta) itemMeta;
- if (potionMeta.hasColor()) {
- object.add("color", context.serialize(potionMeta.getColor(), Color.class));
- }
- if (potionMeta.hasCustomEffects()) {
- JsonArray array = new JsonArray();
- for (PotionEffect effect : potionMeta.getCustomEffects()) {
- array.add(context.serialize(effect, PotionEffect.class));
- }
- object.add("effects", array);
- }
- break;
- }
- return object;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement