//#if USE_INVECTOR_INVENTORY using Invector.vItemManager; using System.Collections.Generic; using PixelCrushers; using UnityEngine; namespace Beyond { /// /// Save System saver for Invector character's inventory. /// [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(); return m_itemManager; } } // Borrowed from vSaveLoadInventory.cs: [System.Serializable] 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] class EquipAreaData { /// /// List of /// public List slotsData = new List(); 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 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(); if (bInventory != null) Destroy(bInventory.gameObject); } } } //#endif