using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.SceneManagement;
using System.IO;
using System.Linq;
// only for eqipptable items
public class SceneEquippableItemManager : MonoBehaviour
{
private const string GameObjectLocalization = "Assets/Items/";
private const string AssetLocalization = "Assets/Items/";
private const string DYNAMIC_ELEMENT = "/DynamicElements/";
private const string STATIC_ELEMENT = "/StaticElements/";
// content skrzyni (docelowo skrzynia + jej content)
///
/// Handle manually setuped object properties
/// eg. npc, minions, chest content
///
[SerializeField]
public List StaticElements;
///
/// Handle dynamic object properties
/// eg. dropped items
///
// PrefarbAsset
[SerializeField]
public List DynamicElements;
public bool isNewGame = true;
public bool isContinued = false;
public string MapName;
public string ElementFolderName = "EquippableItem";
public string ItemsListName = "EquippableItemList";
public static SceneEquippableItemManager Instance;
public void Awake()
{
if(Instance == null)
{
this.MapName = SceneManager.GetActiveScene().name;
if(isNewGame) // in new game dynamicItemsList is defaulty empty
{
BuildItems(StaticElements);
}else if(isContinued)
{
LoadEquippableItems();
BuildItems(DynamicElements);
}
Instance = this;
}else if (Instance != this)
{
Destroy(gameObject);
}
}
public void Start()
{
// BuildDynamicItems();
//SaveEquippableItems();
LoadEquippableItems();
BuildItems(StaticElements);
BuildItems(DynamicElements);
}
// public void AddDynamicItem(GameObject object) {
// //EquippableItem item = object.GetComponent().Item;
// //EquippableItemPrefarbAsset equippableItemPrefarbAsset = new EquippableItemPrefarbAsset(item.name, object.name, object.transform.position, item);
// //this.dynamicItems.Add(equippableItemPrefarbAsset);
// }
public int AddDynamicItem(GameObject dynamicObject)
{
EquippableItem item = dynamicObject.GetComponent().item;
EquippableItemPrefarbAsset equippableItemPrefarbAsset = new EquippableItemPrefarbAsset(item.name, dynamicObject.name, dynamicObject.transform.position, item);
this.DynamicElements.Add(equippableItemPrefarbAsset);
return this.DynamicElements.Count - 1;
}
public void RemoveDynamicItem(string name)
{
// 1. Fetch all matched items
List equippableItemPrefarbAssetList = this.DynamicElements.Where(eqItemAss => eqItemAss.name == name).ToList();
// 2. Remove them
this.DynamicElements.RemoveAll(eqItemAss => eqItemAss.name == name);
}
public void RemoveDynamicEquippableItem(EquippableItemPrefarbAsset equippableItemPrefarbAsset)
{
}
public void BuildItems(List equippableItemPrefarbAssetList)
{
foreach(EquippableItemPrefarbAsset equippableItemPrefarbAsset in equippableItemPrefarbAssetList)
{
GameObject newEquippableItemObject = (GameObject)AssetDatabase.LoadAssetAtPath(GameObjectLocalization + equippableItemPrefarbAsset.prefarbAssetName + ".prefab", typeof(GameObject));
if(!newEquippableItemObject)
{
Debug.Log("Can't find prefarb by name " + equippableItemPrefarbAsset.prefarbAssetName);
break;
}
GameObject globalGUI = GameObject.FindGameObjectsWithTag("GUI")[0];
if(globalGUI)
{
// 1. Create gameObject by handled prefarb
// 2. SetUp
// 2.1 Set position
GameObject equippableItem = Instantiate(newEquippableItemObject, equippableItemPrefarbAsset.position, Quaternion.identity, globalGUI.transform);
// 2.2 Set name
equippableItem.name = equippableItemPrefarbAsset.name;
equippableItem.transform.SetParent(globalGUI.transform);
// 2.3 Set pransform
//equippableItem.transform.localScale = new Vector3(0.4f, 0.4f, 1);
// Debug.Log(equippableItemPrefarbAsset.position);
//equippableItem.transform.localPosition = equippableItemPrefarbAsset.position;
// 3. SetUp object properties
// 3.1 find object
string[] assetNames = AssetDatabase.FindAssets("t:EquippableItem", new[] { AssetLocalization });
foreach (string SOName in assetNames)
{
var SOpath = AssetDatabase.GUIDToAssetPath(SOName);
if(SOpath.Contains(equippableItemPrefarbAsset.prefarbAssetName + ".asset"))
{
// 3.2 set EquippableItem object
equippableItem.GetComponent().item = AssetDatabase.LoadAssetAtPath(SOpath);
break;
}
}
} else {
Debug.Log("Can't find global GUI object!!!");
break;
}
}
}
/// Save both list of EquippableItems
public void SaveEquippableItems()
{
// 1. staticElements
this.SaveStaticEquippableItemsList();
// 2. dynamicItems
this.SaveDynamicEquippableItemsList();
/// Load One element example
// foreach(EquippableItemPrefarbAsset equippableItemPrefarbAsset in equippableItemPrefarbAssetList)
// {
// SaveEquippableItemSystem.SaveEquitableItem(equippableItemPrefarbAsset, this.MapName + "/" + this.ElementFolderName); // change to SaveEquippableItemSystem for EquippableItemPrefarbAsset
// }
}
#region Static list of EquippableItem Save
private void SaveStaticEquippableItemsList()
{
// Case I - if we remember all list
// 1) if after removed item form DynamicList is empty - remove all file
// 2) if after removed item form DynamciList there are another one - save updated list again
if(this.StaticElements.Count > 0) {
SaveEquippableItemSystem.SaveEquitableItemList(this.StaticElements, this.MapName + STATIC_ELEMENT, this.ItemsListName); // change to SaveEquippableItemSystem for EquippableItemPrefarbAsset
} else {
string _path = SaveSystem.GetSavePath(this.MapName + STATIC_ELEMENT) + "/" + this.ItemsListName + ".fun";
try
{
Debug.Log("File to remove: " + _path);
if(File.Exists(_path))
{
File.Delete(_path);
}
}
catch (IOException ioExp)
{
Debug.LogError(ioExp.Message);
}
}
// Case II - if we rememenber object per file
// 1) remove specyfic file
//
// Unfortunatelly we don't use this way of saving items yet :D
}
#endregion
#region Dynamic list of EquippableItem Save
private void SaveDynamicEquippableItemsList()
{
// Case I - if we remember all list
// 1) if after removed item form DynamicList is empty - remove all file
// 2) if after removed item form DynamciList there are another one - save updated list again
if(this.DynamicElements.Count > 0) {
SaveEquippableItemSystem.SaveEquitableItemList(this.DynamicElements, this.MapName + DYNAMIC_ELEMENT, this.ItemsListName); // change to SaveEquippableItemSystem for EquippableItemPrefarbAsset
} else {
string _path = SaveSystem.GetSavePath(this.MapName + DYNAMIC_ELEMENT) + "/" + this.ItemsListName + ".fun";
try
{
Debug.Log("File to remove: " + _path);
if(File.Exists(_path))
{
File.Delete(_path);
}
}
catch (IOException ioExp)
{
Debug.LogError(ioExp.Message);
}
}
// Case II - if we rememenber object per file
// 1) remove specyfic file
//
// Unfortunatelly we don't use this way of saving items yet :D
}
#endregion
public void LoadEquippableItems()
{
// if continue -> search files with content in save path
// if new game -> build objects from default configuration
this.LoadDynamicEquippableItemsList();
///
/// DID WE REALLY NEED TO LOAD (or even remembered) THIS LIST????
///
//this.LoadStaticEquippableItemsList();
}
#region Dynamic list of EquippableItem Loader
public void LoadDynamicEquippableItem()
{
string path = SaveSystem.GetSavePath(this.MapName + DYNAMIC_ELEMENT + this.ElementFolderName);
if (!Directory.Exists(path)) // if not exists thats mean there was nothing saved yet - nothing to load
return;
FileInfo[] fileInfo = new DirectoryInfo(path).GetFiles();
foreach(FileInfo file in fileInfo)
{
Debug.Log(file.FullName);
EquippableItemPrefarbAssetData equippableItemPrefarbAssetData = SaveEquippableItemSystem.LoadEquitableItem(file.Name, this.MapName + DYNAMIC_ELEMENT + this.ElementFolderName);
DynamicElements.Add(equippableItemPrefarbAssetData.MapDataToEquippableItemPrefarbAsset());
}
}
public void LoadDynamicEquippableItemsList()
{
string path = SaveSystem.GetSavePath(this.MapName + DYNAMIC_ELEMENT);
if (!Directory.Exists(path)) // if not exists thats mean there was nothing saved yet - nothing to load
return;
FileInfo[] fileInfo = new DirectoryInfo(path).GetFiles();
foreach(FileInfo file in fileInfo)
{
if(file.Name != this.ItemsListName + ".fun")
continue;
List equippableItemPrefarbAssetDataList = SaveEquippableItemSystem.LoadEquitableItemList(this.MapName + DYNAMIC_ELEMENT, this.ItemsListName);
foreach(EquippableItemPrefarbAssetData equippableItemPrefarbAssetData in equippableItemPrefarbAssetDataList)
DynamicElements.Add(equippableItemPrefarbAssetData.MapDataToEquippableItemPrefarbAsset());
}
}
#endregion
#region Static list of EquippableItem Loader
public void LoadStaticEquippableItem()
{
string path = SaveSystem.GetSavePath(this.MapName + STATIC_ELEMENT + this.ElementFolderName);
if (!Directory.Exists(path)) // if not exists thats mean there was nothing saved yet - nothing to load
return;
FileInfo[] fileInfo = new DirectoryInfo(path).GetFiles();
foreach(FileInfo file in fileInfo)
{
Debug.Log(file.FullName);
EquippableItemPrefarbAssetData equippableItemPrefarbAssetData = SaveEquippableItemSystem.LoadEquitableItem(file.Name, this.MapName + STATIC_ELEMENT + this.ElementFolderName);
StaticElements.Add(equippableItemPrefarbAssetData.MapDataToEquippableItemPrefarbAsset());
}
}
public void LoadStaticEquippableItemsList()
{
string path = SaveSystem.GetSavePath(this.MapName + STATIC_ELEMENT);
if (!Directory.Exists(path)) // if not exists thats mean there was nothing saved yet - nothing to load
return;
FileInfo[] fileInfo = new DirectoryInfo(path).GetFiles();
foreach(FileInfo file in fileInfo)
{
Debug.Log(file.FullName);
List equippableItemPrefarbAssetDataList = SaveEquippableItemSystem.LoadEquitableItemList(this.MapName + STATIC_ELEMENT, this.ItemsListName);
foreach(EquippableItemPrefarbAssetData equippableItemPrefarbAssetData in equippableItemPrefarbAssetDataList)
StaticElements.Add(equippableItemPrefarbAssetData.MapDataToEquippableItemPrefarbAsset());
}
}
#endregion
}