/*
* Copyright (C) 2014-2016 EbonJaguar
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package me.gnat008.perworldinventory.data.serializers;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.FireworkEffect;
import org.bukkit.Material;
import org.bukkit.block.banner.Pattern;
import org.bukkit.block.banner.PatternType;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.*;
import java.util.HashMap;
import java.util.Map;
/**
* @deprecated For compatability only. Never ever use these!
*/
@Deprecated
public class DeprecatedMethodUtil {
private DeprecatedMethodUtil() {}
/**
* Get a Map of Enchantments and their levels from an enchantment serialization string
*
* @param serializedEnchants The serialization string to decode
* @return A Map of enchantments and their levels
*/
public static Map<Enchantment, Integer> getEnchantments(String serializedEnchants) {
Map<Enchantment, Integer> enchantments = new HashMap<>();
if (serializedEnchants.isEmpty())
return enchantments;
String[] enchants = serializedEnchants.split(";");
for (int i = 0; i < enchants.length; i++) {
String[] ench = enchants[i].split(":");
if (ench.length < 2)
throw new IllegalArgumentException(serializedEnchants + " - Enchantment " + i + " (" + enchants[i] + "): split must at least have a length of 2");
if (isNum(ench[0]))
throw new IllegalArgumentException(serializedEnchants + " - Enchantment " + i + " (" + enchants[i] + "): id is not an integer");
if (isNum(ench[1]))
throw new IllegalArgumentException(serializedEnchants + " - Enchantment " + i + " (" + enchants[i] + "): level is not an integer");
int id = Integer.parseInt(ench[0]);
int level = Integer.parseInt(ench[1]);
Enchantment e = Enchantment.getById(id);
if (e == null)
throw new IllegalArgumentException(serializedEnchants + " - Enchantment " + i + " (" + enchants[i] + "): no Enchantment with id of " + id);
enchantments.put(e, level);
}
return enchantments;
}
/**
* A method to deserialize a BannerMeta object from a JSONObject. This method assumes that the JSONArrays containing
* the colors and pattern types are the same length.
*
* @param json The JSONObject of the BannerMeta to deserialize
* @return The BannerMeta
*/
public static BannerMeta getBannerMeta(JsonObject json) {
BannerMeta dummy = (BannerMeta) new ItemStack(Material.BANNER).getItemMeta();
if (json.has("base-color"))
dummy.setBaseColor(DyeColor.getByDyeData(Byte.parseByte("" + json.get("base-color"))));
JsonArray colors = json.getAsJsonArray("colors");
JsonArray patternTypes = json.getAsJsonArray("pattern-types");
for (int i = 0; i < colors.size() - 1; i++) {
dummy.addPattern(new Pattern(DyeColor.getByDyeData(Integer.valueOf(colors.get(i).getAsInt()).byteValue()),
PatternType.getByIdentifier(patternTypes.get(i).getAsString())));
}
return dummy;
}
/**
* Get BookMeta from a JSONObject.
*
* @param json The JsonObject of the BannerMeta to deserialize
* @return The BookMeta constructed
*/
public static BookMeta getBookMeta(JsonObject json) {
ItemStack dummyItems = new ItemStack(Material.WRITTEN_BOOK, 1);
BookMeta meta = (BookMeta) dummyItems.getItemMeta();
String title = null, author = null;
JsonArray pages = null;
if (json.has("title"))
title = json.get("title").getAsString();
if (json.has("author"))
author = json.get("author").getAsString();
if (json.has("pages"))
pages = json.getAsJsonArray("pages");
if (title != null)
meta.setTitle(title);
if (author != null)
meta.setAuthor(author);
if (pages != null) {
String[] allPages = new String[pages.size()];
for (int i = 0; i < pages.size() - 1; i++) {
String page = pages.get(i).getAsString();
if (page.isEmpty() || page == null)
page = "";
allPages[i] = page;
}
meta.setPages(allPages);
}
return meta;
}
/**
* Get EncantmentStorageMeta from a JSONObject.
*
* @param json The JSONObject to use
* @return The EnchantmentStorageMeta constructed
*/
public static EnchantmentStorageMeta getEnchantedBookMeta(JsonObject json) {
ItemStack dummyItems = new ItemStack(Material.ENCHANTED_BOOK, 1);
EnchantmentStorageMeta meta = (EnchantmentStorageMeta) dummyItems.getItemMeta();
if (json.has("enchantments")) {
Map<Enchantment, Integer> enchants = getEnchantments(json.get("enchantments").getAsString());
for (Enchantment e : enchants.keySet()) {
meta.addStoredEnchant(e, enchants.get(e), true);
}
}
return meta;
}
/**
* Gets LeatherArmorMeta from the given JSONObject
*
* @param json The JSONObject to decode
* @return LeatherArmorMeta taken from the given JSONObject as a reference
*/
public static LeatherArmorMeta getLeatherArmorMeta(JsonObject json) {
ItemStack dummyItems = new ItemStack(Material.LEATHER_HELMET, 1);
LeatherArmorMeta meta = (LeatherArmorMeta) dummyItems.getItemMeta();
if (json.has("color")) {
meta.setColor(getColor(json.getAsJsonObject("color")));
}
return meta;
}
/**
* Get SkullMeta from a JSONObject.
*
* @param json The meta information of the skull
* @return The SkullMeta
*/
public static SkullMeta getSkullMeta(JsonObject json) {
ItemStack dummyItems = new ItemStack(Material.SKULL_ITEM);
SkullMeta dummyMeta = (SkullMeta) dummyItems.getItemMeta();
if (json.has("owner"))
dummyMeta.setOwner(json.get("owner").getAsString());
return dummyMeta;
}
public static FireworkMeta getFireworkMeta(JsonObject json) {
FireworkMeta dummy = (FireworkMeta) new ItemStack(Material.FIREWORK).getItemMeta();
if (json.has("power"))
dummy.setPower(json.get("power").getAsInt());
else
dummy.setPower(1);
JsonArray effects = json.getAsJsonArray("effects");
for (int i = 0; i < effects.size() - 1; i++) {
JsonObject effectDto = effects.get(i).getAsJsonObject();
FireworkEffect effect = getFireworkEffect(effectDto);
if (effect != null)
dummy.addEffect(effect);
}
return dummy;
}
private static FireworkEffect getFireworkEffect(JsonObject json) {
FireworkEffect.Builder builder = FireworkEffect.builder();
//colors
JsonArray colors = json.getAsJsonArray("colors");
for (int j = 0; j < colors.size() - 1; j++) {
builder.withColor(getColor(colors.get(j).getAsJsonObject()));
}
//fade colors
JsonArray fadeColors = json.getAsJsonArray("fade-colors");
for (int j = 0; j < fadeColors.size() - 1; j++) {
builder.withFade(getColor(colors.get(j).getAsJsonObject()));
}
//hasFlicker
if (json.get("flicker").getAsBoolean())
builder.withFlicker();
//trail
if (json.get("trail").getAsBoolean())
builder.withTrail();
//type
builder.with(FireworkEffect.Type.valueOf(json.get("type").getAsString()));
return builder.build();
}
/**
* Get a Color from a JSONObject. If any one of the red, green, or blue keys are not found,
* they are given a value of 0 by default. Therefore, if the red and green values found were both 0,
* and the blue key is not found, the resulting color is black (0, 0, 0).
*
* @param color The JSONObject to construct a Color from.
* @return The decoded Color
*/
private static Color getColor(JsonObject color) {
int r = 0, g = 0, b = 0;
if (color.has("red"))
r = color.get("red").getAsInt();
if (color.has("green"))
g = color.get("green").getAsInt();
if (color.has("blue"))
b = color.get("blue").getAsInt();
return Color.fromRGB(r, g, b);
}
/**
* Method used to test whether a string is an Integer or not
*
* @param s The string to test
* @return Whether the given string is an Integer
*/
public static boolean isNum(String s) {
try {
Integer.parseInt(s);
return false;
} catch (NumberFormatException e) {
return true;
}
}
/**
* Test
*
* @param material
* @return True if the given material is Material.LEATHER_HELMET, Material.LEATHER_CHESTPLATE,
* Material.LEATHER_LEGGINGS, or Material.LEATHER_BOOTS;
*/
public static boolean isLeatherArmor(Material material) {
return material == Material.LEATHER_HELMET || material == Material.LEATHER_CHESTPLATE ||
material == Material.LEATHER_LEGGINGS || material == Material.LEATHER_BOOTS;
}
}