using Invector.vCharacterController;
using Invector.vItemManager;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
namespace Beyond
{
public static class bSaveLoadInventory
{
public static string InventoryDataFile = Application.dataPath + Path.DirectorySeparatorChar + "InventoryData.json";
///
/// Create a Json text from Inventory EquipAreas and ItemManager Items
///
/// Target ItemManaget
/// Json file text
public static string InventoryToJsonText(bItemManager itemManager)
{
if (!itemManager.inventory) return string.Empty;
InventoryData data = new InventoryData();
bEquipArea[] equipAreas = itemManager.inventory.equipAreas;
for (int i = 0; i < equipAreas.Length; i++)
{
EquipAreaData equipAreaData = new EquipAreaData();
equipAreaData.indexOfSelectedSlot = equipAreas[i].indexOfEquippedItem;
for (int e = 0; e < equipAreas[i].equipSlots.Count; e++)
{
SlotData equipAreaSlotData = new SlotData();
equipAreaSlotData.hasItem = equipAreas[i].equipSlots[e].item != null;
if (equipAreaSlotData.hasItem)
{
equipAreaSlotData.indexOfItem = itemManager.items.IndexOf(equipAreas[i].equipSlots[e].item);
}
equipAreaData.slotsData.Add(equipAreaSlotData);
}
data.equipAreas.Add(equipAreaData);
}
for (int i = 0; i < itemManager.items.Count; i++)
{
data.itemReferences.Add(new ItemReference(itemManager.items[i]));
}
return JsonUtility.ToJson(data, true);
}
///
/// Load json file from
///
/// Json file text
public static string LoadInventoryJasonText()
{
if (File.Exists(InventoryDataFile)) return File.ReadAllText(InventoryDataFile);
return string.Empty;
}
///
/// Save inventory items and occupied equipSlots
///
///
public static void SaveInventory(this bItemManager itemManager)
{
string json = InventoryToJsonText(itemManager);
if (!string.IsNullOrEmpty(json))
{
File.WriteAllText(InventoryDataFile, json);
itemManager.onSaveItems.Invoke();
}
}
///
/// Load inventory items and occupied equipSlots
///
///
public static void LoadInventory(this bItemManager itemManager)
{
string json = LoadInventoryJasonText();
if (!string.IsNullOrEmpty(json))
{
InventoryData data = new InventoryData();
JsonUtility.FromJsonOverwrite(json, data);
itemManager.items = data.GetItems(itemManager.itemListData);
bEquipArea[] equipAreas = itemManager.inventory.equipAreas;
for (int i = 0; i < equipAreas.Length; i++)
{
if (i < data.equipAreas.Count)
{
bEquipArea area = equipAreas[i];
EquipAreaData areaData = data.equipAreas[i];
area.indexOfEquippedItem = areaData.indexOfSelectedSlot;
for (int e = 0; e < equipAreas[i].equipSlots.Count; e++)
{
if (e < areaData.slotsData.Count)
{
SlotData slotData = areaData.slotsData[e];
bEquipSlot slot = equipAreas[i].equipSlots[e];
itemManager.temporarilyIgnoreItemAnimation = true;
if (slotData.hasItem)
{
area.AddItemToEquipSlot(e, itemManager.items[slotData.indexOfItem]);
}
else area.RemoveItemOfEquipSlot(e);
}
}
}
}
}
itemManager.inventory.UpdateInventory();
itemManager.temporarilyIgnoreItemAnimation = false;
itemManager.onLoadItems.Invoke();
}
[System.Serializable]
private class InventoryData
{
///
/// List of
///
public List itemReferences = new List();
///
/// List of
///
public List equipAreas = new List();
///
/// Get from
///
///
///
public List GetItems(bItemListData itemListData)
{
List items = new List();
for (int i = 0; i < itemReferences.Count; i++)
{
bItem item = itemListData.items.Find(a => a.id.Equals(itemReferences[i].id));
item = GameObject.Instantiate(item);
item.amount = itemReferences[i].amount;
item.attributes = itemReferences[i].attributes;
item.name = item.name.Replace("(Clone)", string.Empty);
items.Add(item);
}
return items;
}
}
[System.Serializable]
private class EquipAreaData
{
///
/// List of
///
public List slotsData = new List();
public int indexOfSelectedSlot;
}
[System.Serializable]
private class SlotData
{
public bool hasItem;
public int indexOfItem;
}
[System.Serializable]
private class ItemReference
{
[SerializeField] public int amount;
[SerializeField] public int id;
[SerializeField] public List attributes;
public ItemReference(bItem item)
{
amount = item.amount;
id = item.id;
attributes = item.attributes;
}
}
}
}