/*
* 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 me.gnat008.perworldinventory.ConsoleLogger;
import me.gnat008.perworldinventory.data.players.PWIPlayer;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import javax.inject.Inject;
public class InventorySerializer {
@Inject
private ItemSerializer itemSerializer;
InventorySerializer() {}
/**
* Serialize a PlayerInventory. This will save the armor contents of the inventory as well
*
* @param player The player to serialize
* @return A JsonObject representing the serialized Inventory.
*/
public JsonObject serializePlayerInventory(PWIPlayer player) {
JsonObject root = new JsonObject();
JsonArray inventory = serializeInventory(player.getInventory());
JsonArray armor = serializeInventory(player.getArmor());
root.add("inventory", inventory);
root.add("armor", armor);
return root;
}
/**
* Serialize an ItemStack array.
*
* @param contents The items in the inventory
* @return A JsonArray representing the serialized ItemStack array
*/
public JsonArray serializeInventory(ItemStack[] contents) {
JsonArray inventory = new JsonArray();
for (int i = 0; i < contents.length; i++) {
JsonObject values = itemSerializer.serializeItem(contents[i], i);
if (values != null)
inventory.add(values);
}
return inventory;
}
/**
* Sets the Inventory using an ItemStack array constructed from a JsonObject.
*
* @param player The InventoryHolder to which the Inventory will be set
* @param inv The reference JsonArray
* @param format Data format being used; 0 is old, 1 is new
*/
public void setInventory(Player player, JsonObject inv, int format) {
PlayerInventory inventory = player.getInventory();
ItemStack[] armor = deserializeInventory(inv.getAsJsonArray("armor"), 4, format);
ItemStack[] inventoryContents = deserializeInventory(inv.getAsJsonArray("inventory"), inventory.getSize(), format);
inventory.clear();
if (armor != null) {
inventory.setArmorContents(armor);
}
if (inventoryContents != null) {
inventory.setContents(inventoryContents);
}
}
/**
* Gets an ItemStack array from a JsonObject.
*
* @param inv The JsonObject to get from
* @param size The expected size of the inventory, can be greater than expected
* @param format Data format being used; 0 is old, 1 is new
* @return An ItemStack array constructed from the given JsonArray
*/
public ItemStack[] deserializeInventory(JsonArray inv, int size, int format) {
// Be tolerant if the expected JsonArray tag is missing
if (inv == null) {
return null;
}
ItemStack[] contents = new ItemStack[size];
for (int i = 0; i < inv.size(); i++) {
// We don't want to risk failing to deserialize a players inventory. Try your best
// to deserialize as much as possible.
try {
JsonObject item = inv.get(i).getAsJsonObject();
int index = item.get("index").getAsInt();
ItemStack is = itemSerializer.deserializeItem(item, format);
contents[index] = is;
}
catch (Exception ex) {
ConsoleLogger.warning("Failed to deserialize inventory:", ex);
}
}
return contents;
}
}