Files
beyond/Assets/Scripts/Save/InvectorInventorySaver.cs
2024-11-20 15:21:28 +01:00

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