148 lines
5.0 KiB
C#
148 lines
5.0 KiB
C#
//#if USE_INVECTOR_INVENTORY
|
|
using Invector.vItemManager;
|
|
using System.Collections.Generic;
|
|
using PixelCrushers;
|
|
using UnityEngine;
|
|
|
|
namespace Beyond
|
|
{
|
|
|
|
/// <summary>
|
|
/// Save System saver for Invector character's inventory.
|
|
/// </summary>
|
|
[AddComponentMenu("Pixel Crushers/Save System/Savers/Invector/Invector Inventory Saver")]
|
|
public class InvectorInventorySaver : Saver
|
|
{
|
|
|
|
private bItemManager m_itemManager;
|
|
private bItemManager itemManager
|
|
{
|
|
get
|
|
{
|
|
if (m_itemManager == null) m_itemManager = GetComponent<bItemManager>();
|
|
return m_itemManager;
|
|
}
|
|
}
|
|
|
|
// Borrowed from vSaveLoadInventory.cs:
|
|
[System.Serializable]
|
|
class InventoryData
|
|
{
|
|
/// <summary>
|
|
/// List of <see cref="ItemReference"/>
|
|
/// </summary>
|
|
public List<ItemReference> itemReferences = new List<ItemReference>();
|
|
|
|
/// <summary>
|
|
/// List of <seealso cref="EquipAreaData"/>
|
|
/// </summary>
|
|
public List<EquipAreaData> equipAreas = new List<EquipAreaData>();
|
|
|
|
/// <summary>
|
|
/// Get <seealso cref="vItem"/> from <seealso cref="ItemReference"/>
|
|
/// </summary>
|
|
/// <param name="itemListData"></param>
|
|
/// <returns></returns>
|
|
public List<bItem> GetItems(bItemListData itemListData)
|
|
{
|
|
List<bItem> items = new List<bItem>();
|
|
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]
|
|
class EquipAreaData
|
|
{
|
|
/// <summary>
|
|
/// List of <seealso cref="SlotData"/>
|
|
/// </summary>
|
|
public List<SlotData> slotsData = new List<SlotData>();
|
|
|
|
public int indexOfSelectedSlot = 0;
|
|
}
|
|
|
|
[System.Serializable]
|
|
class SlotData
|
|
{
|
|
public bool hasItem = false;
|
|
public int indexOfItem = 0;
|
|
}
|
|
|
|
[System.Serializable]
|
|
class ItemReference
|
|
{
|
|
[SerializeField] public int amount;
|
|
[SerializeField] public int id;
|
|
[SerializeField] public List<bItemAttribute> attributes;
|
|
|
|
public ItemReference(bItem item)
|
|
{
|
|
amount = item.amount;
|
|
id = item.id;
|
|
attributes = item.attributes;
|
|
}
|
|
}
|
|
|
|
public override string RecordData()
|
|
{
|
|
if (itemManager == null) return string.Empty;
|
|
return bSaveLoadInventory.InventoryToJsonText(itemManager);
|
|
}
|
|
|
|
public override void ApplyData(string s)
|
|
{
|
|
if (string.IsNullOrEmpty(s) || itemManager == null) return;
|
|
InventoryData data = new InventoryData();
|
|
JsonUtility.FromJsonOverwrite(s, 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();
|
|
}
|
|
|
|
public override void OnBeforeSceneChange()
|
|
{
|
|
base.OnBeforeSceneChange();
|
|
// We need to start with a clear inventory in the next scene, so destroy this one:
|
|
var bInventory = FindObjectOfType<bInventory>();
|
|
if (bInventory != null) Destroy(bInventory.gameObject);
|
|
}
|
|
|
|
}
|
|
}
|
|
//#endif
|