Advertisement
Exception_Prototype

Untitled

Apr 18th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.08 KB | None | 0 0
  1. package com.prototype.events.revertingcapture.utils.configuration.adapters;
  2.  
  3. import com.google.gson.*;
  4. import com.google.gson.reflect.TypeToken;
  5. import org.bukkit.ChatColor;
  6. import org.bukkit.Color;
  7. import org.bukkit.Material;
  8. import org.bukkit.enchantments.Enchantment;
  9. import org.bukkit.inventory.ItemFlag;
  10. import org.bukkit.inventory.ItemStack;
  11. import org.bukkit.inventory.meta.ItemMeta;
  12. import org.bukkit.inventory.meta.LeatherArmorMeta;
  13. import org.bukkit.inventory.meta.PotionMeta;
  14. import org.bukkit.potion.PotionEffect;
  15.  
  16. import java.lang.reflect.Type;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.Set;
  20.  
  21. public final class ItemStackAdapter implements JsonSerializer<ItemStack>, JsonDeserializer<ItemStack> {
  22.  
  23.  
  24.     public static final Type TYPE_LORE = new TypeToken<List<String>>() {
  25.     }.getType();
  26.  
  27.     public static final Type TYPE_SET_ITEM_FLAGS = new TypeToken<Set<ItemFlag>>() {
  28.     }.getType();
  29.  
  30.     @Override
  31.     public ItemStack deserialize(JsonElement element, Type type, JsonDeserializationContext context) throws JsonParseException {
  32.  
  33.         ItemStack itemStack = new ItemStack(Material.AIR);
  34.  
  35.         JsonObject object = element.getAsJsonObject();
  36.  
  37.         itemStack.setType(Material.matchMaterial(object.get("material").getAsString()));
  38.  
  39.         if (object.has("amount")) {
  40.             itemStack.setAmount(object.get("amount").getAsInt());
  41.         }
  42.  
  43.         if (object.has("durability")) {
  44.             itemStack.setDurability(object.get("durability").getAsShort());
  45.         }
  46.  
  47.         ItemMeta itemMeta = itemStack.getItemMeta();
  48.  
  49.         if (object.has("unbreakable")) {
  50.             itemMeta.setUnbreakable(object.get("unbreakable").getAsBoolean());
  51.         }
  52.  
  53.         if (object.has("name")) {
  54.             itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', object.get("name").getAsString()));
  55.         }
  56.  
  57.         if (object.has("lore")) {
  58.             List<String> lore = context.deserialize(object.get("lore"), TYPE_LORE);
  59.             lore.replaceAll(string -> ChatColor.translateAlternateColorCodes('&', string));
  60.             itemMeta.setLore(lore);
  61.         }
  62.  
  63.         if (object.has("enchantments")) {
  64.  
  65.             JsonArray enchantments = object.get("enchantments").getAsJsonArray();
  66.  
  67.             for (JsonElement enchantmentElement : enchantments) {
  68.                 JsonObject enchantmentObject = (JsonObject) enchantmentElement;
  69.                 Enchantment enchantment = Enchantment.getByName(enchantmentObject.get("enchantment").getAsString());
  70.                 int level = enchantmentObject.get("level").getAsInt();
  71.                 itemMeta.addEnchant(enchantment, level, true);
  72.             }
  73.  
  74.         }
  75.  
  76.         if (object.has("flags")) {
  77.             Set<ItemFlag> flags = context.deserialize(object.get("flags"), TYPE_SET_ITEM_FLAGS);
  78.             itemMeta.addItemFlags(flags.toArray(new ItemFlag[0]));
  79.         }
  80.  
  81.         itemStack.setItemMeta(itemMeta);
  82.  
  83.         switch (itemStack.getType()) {
  84.             case LEATHER_HELMET:
  85.             case LEATHER_CHESTPLATE:
  86.             case LEATHER_LEGGINGS:
  87.             case LEATHER_BOOTS:
  88.  
  89.                 if (object.has("color")) {
  90.                     LeatherArmorMeta leatherArmorMeta = (LeatherArmorMeta) itemStack.getItemMeta();
  91.                     leatherArmorMeta.setColor(context.deserialize(object.get("color"), Color.class));
  92.                     itemStack.setItemMeta(leatherArmorMeta);
  93.                 }
  94.  
  95.                 break;
  96.         }
  97.  
  98.         switch (itemStack.getType()) {
  99.             case POTION:
  100.             case SPLASH_POTION:
  101.             case LINGERING_POTION:
  102.             case ARROW:
  103.             case TIPPED_ARROW:
  104.             case SPECTRAL_ARROW:
  105.  
  106.                 PotionMeta potionMeta = (PotionMeta) itemStack.getItemMeta();
  107.  
  108.                 if (object.has("color")) {
  109.                     potionMeta.setColor(context.deserialize(object.get("color"), Color.class));
  110.                 }
  111.  
  112.                 if (object.has("effects")) {
  113.  
  114.                     JsonArray effects = object.get("effects").getAsJsonArray();
  115.  
  116.                     for (JsonElement effectElement : effects) {
  117.                         potionMeta.addCustomEffect(context.deserialize(effectElement, PotionEffect.class), true);
  118.                     }
  119.  
  120.                 }
  121.  
  122.                 itemStack.setItemMeta(potionMeta);
  123.  
  124.                 break;
  125.         }
  126.  
  127.         return itemStack;
  128.     }
  129.  
  130.     @Override
  131.     public JsonElement serialize(ItemStack itemStack, Type type, JsonSerializationContext context) {
  132.         JsonObject object = new JsonObject();
  133.  
  134.         object.addProperty("material", itemStack.getType().name());
  135.         object.addProperty("amount", itemStack.getAmount());
  136.         object.addProperty("durability", itemStack.getDurability());
  137.  
  138.         ItemMeta itemMeta = itemStack.getItemMeta();
  139.  
  140.         object.addProperty("unbreakable", itemMeta.isUnbreakable());
  141.  
  142.         if (itemMeta.hasDisplayName()) {
  143.             object.addProperty("name", itemMeta.getDisplayName());
  144.         }
  145.  
  146.         if (itemMeta.hasLore()) {
  147.             object.add("lore", context.serialize(itemMeta.getLore(), TYPE_LORE));
  148.         }
  149.  
  150.         if (itemMeta.hasEnchants()) {
  151.  
  152.             JsonArray array = new JsonArray();
  153.  
  154.             for (Map.Entry<Enchantment, Integer> entry : itemMeta.getEnchants().entrySet()) {
  155.                 JsonObject enchantment = new JsonObject();
  156.                 enchantment.addProperty("enchantment", entry.getKey().getName());
  157.                 enchantment.addProperty("level", entry.getValue());
  158.                 array.add(enchantment);
  159.             }
  160.  
  161.             object.add("enchantments", array);
  162.  
  163.         }
  164.  
  165.         if (itemMeta.getItemFlags().size() > 0) {
  166.             object.add("flags", context.serialize(itemMeta.getItemFlags(), TYPE_SET_ITEM_FLAGS));
  167.         }
  168.  
  169.         switch (itemStack.getType()) {
  170.             case LEATHER_HELMET:
  171.             case LEATHER_CHESTPLATE:
  172.             case LEATHER_LEGGINGS:
  173.             case LEATHER_BOOTS:
  174.                 LeatherArmorMeta leatherArmorMeta = (LeatherArmorMeta) itemMeta;
  175.                 object.add("color", context.serialize(leatherArmorMeta.getColor(), Color.class));
  176.                 break;
  177.         }
  178.  
  179.         switch (itemStack.getType()) {
  180.             case POTION:
  181.             case SPLASH_POTION:
  182.             case LINGERING_POTION:
  183.             case ARROW:
  184.             case TIPPED_ARROW:
  185.             case SPECTRAL_ARROW:
  186.  
  187.                 PotionMeta potionMeta = (PotionMeta) itemMeta;
  188.  
  189.                 if (potionMeta.hasColor()) {
  190.                     object.add("color", context.serialize(potionMeta.getColor(), Color.class));
  191.                 }
  192.  
  193.                 if (potionMeta.hasCustomEffects()) {
  194.  
  195.                     JsonArray array = new JsonArray();
  196.  
  197.                     for (PotionEffect effect : potionMeta.getCustomEffects()) {
  198.                         array.add(context.serialize(effect, PotionEffect.class));
  199.                     }
  200.  
  201.                     object.add("effects", array);
  202.  
  203.                 }
  204.  
  205.                 break;
  206.         }
  207.  
  208.         return object;
  209.     }
  210.  
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement