243 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			243 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
								 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								using RPGCreationKit;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace RPGCreationKit.PersistentReferences
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    [System.Serializable]
							 | 
						||
| 
								 | 
							
								    public class PersistentReferencesDictionary : SerializableDictionary<string, PersistentReference> { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    [System.Serializable]
							 | 
						||
| 
								 | 
							
								    public class CellsDoorsDictionary : SerializableDictionary<string, string> { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// <summary>
							 | 
						||
| 
								 | 
							
								    /// Manages each and every persistent reference in the world, making all of them accessible anytime.
							 | 
						||
| 
								 | 
							
								    /// </summary>
							 | 
						||
| 
								 | 
							
								    public class PersistentReferenceManager : MonoBehaviour
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        public static PersistentReferenceManager instance;
							 | 
						||
| 
								 | 
							
								        private void Awake()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (instance == null)
							 | 
						||
| 
								 | 
							
								                instance = this;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [SerializeField] Transform tAI;
							 | 
						||
| 
								 | 
							
								        [SerializeField] Transform tLootingPoint;
							 | 
						||
| 
								 | 
							
								        [SerializeField] Transform tDoor;
							 | 
						||
| 
								 | 
							
								        [SerializeField] Transform tOther;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [SerializeField] Transform tUnregistered;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public PersistentReferencesDictionary refs;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public CellsDoorsDictionary cellsDoorsDictionary;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// Register a PersistentReference to the Dictionary and trasfers its GameObject to the _PersistentReferences_ scene.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <param name="_ref">The reference to register.</param>
							 | 
						||
| 
								 | 
							
								        /// <returns>True if successfully registered.</returns>
							 | 
						||
| 
								 | 
							
								        public bool RegisterPersistentReference(PersistentReference _ref)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            // Conditions of error
							 | 
						||
| 
								 | 
							
								            if (_ref == null)
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(string.IsNullOrEmpty(_ref.refID))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Debug.LogWarning("Tried to register a reference of type: " + _ref.type.ToString() + " from the GameObject " + _ref.gameObject.name + ". But no RefID was provided.");
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else // Reference is set, proceed to register
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                // Checks if the reference is already registered
							 | 
						||
| 
								 | 
							
								                if(refs.ContainsKey(_ref.refID))
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    Debug.LogWarning("Tried to register the RefID: " + _ref.refID + " but it was already registered. Aborting...");
							 | 
						||
| 
								 | 
							
								                    return false;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                // Adds it to the dictionary
							 | 
						||
| 
								 | 
							
								                refs.Add(_ref.refID, _ref);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                // Moves to its scene
							 | 
						||
| 
								 | 
							
								                //SceneManager.MoveGameObjectToScene(_ref.gameObject, this.gameObject.scene);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                // Sets the correct parent
							 | 
						||
| 
								 | 
							
								                switch(_ref.type)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    case PersistentReferenceType.AI:
							 | 
						||
| 
								 | 
							
								                        _ref.gameObject.transform.SetParent(tAI);
							 | 
						||
| 
								 | 
							
								                        break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    case PersistentReferenceType.Door:
							 | 
						||
| 
								 | 
							
								                        _ref.gameObject.transform.SetParent(tDoor);
							 | 
						||
| 
								 | 
							
								                        break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    case PersistentReferenceType.LootingPoint:
							 | 
						||
| 
								 | 
							
								                        _ref.gameObject.transform.SetParent(tLootingPoint);
							 | 
						||
| 
								 | 
							
								                        break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    case PersistentReferenceType.Other:
							 | 
						||
| 
								 | 
							
								                        _ref.gameObject.transform.SetParent(tOther);
							 | 
						||
| 
								 | 
							
								                        break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    default:
							 | 
						||
| 
								 | 
							
								                        _ref.gameObject.transform.SetParent(tOther);
							 | 
						||
| 
								 | 
							
								                        break;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                DisablePersistentReference(_ref.refID);
							 | 
						||
| 
								 | 
							
								                return true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// Unregisters a PersistentReference from the Dictionary and trasfers its GameObject under the Unregistered GameObjects.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <param name="_ref">The reference to unregister.</param>
							 | 
						||
| 
								 | 
							
								        /// <returns>True if successfully unregistered.</returns>
							 | 
						||
| 
								 | 
							
								        public bool UnregisterPersistentReference(PersistentReference _ref, bool destroyGameObject = false)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            // Conditions of error
							 | 
						||
| 
								 | 
							
								            if (_ref == null)
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (string.IsNullOrEmpty(_ref.refID))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Debug.LogWarning("Tried to unregister a persistent reference of type: " + _ref.type.ToString() + " from the GameObject " + _ref.gameObject.name + ". But no RefID was provided.");
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Try to get the reference to see if this PersistentReference was registered.
							 | 
						||
| 
								 | 
							
								            PersistentReference pTest = GetPersistentReference(_ref.refID);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (pTest == null)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Debug.LogWarning("Tried to unregister the persistent reference with ID " + _ref.refID + " but it wasn't registered in first place.");
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            refs.Remove(_ref.refID);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (!destroyGameObject)
							 | 
						||
| 
								 | 
							
								                _ref.gameObject.transform.SetParent(tUnregistered);
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								                DestroyImmediate(_ref.gameObject);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Debug.Log("Persistent Reference with ID: " + _ref.refID + " was successfully unregistered. (Destroyed: " + destroyGameObject + ")");
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// Gets a PersistentReference from the Dictionary.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <param name="_refID"></param>
							 | 
						||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						||
| 
								 | 
							
								        public PersistentReference GetPersistentReference(string _refID)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            PersistentReference reference;
							 | 
						||
| 
								 | 
							
								            refs.TryGetValue(_refID, out reference);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (reference != null)
							 | 
						||
| 
								 | 
							
								                return reference;
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Debug.Log("Tried to Get the Persistent Reference with ID: " + _refID + ", but it isn't registered.");
							 | 
						||
| 
								 | 
							
								                return null;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// Activates the GameObject of a Persistent Reference, providing its refID.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <param name="_refID"></param>
							 | 
						||
| 
								 | 
							
								        public void ActivatePersistentReference(string _refID)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            PersistentReference reference = GetPersistentReference(_refID);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (reference != null)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                reference.gameObject.SetActive(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                // If the AI was using offline mode
							 | 
						||
| 
								 | 
							
								                if (reference.type == PersistentReferenceType.AI)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    AI.AIPerception ai = reference.GetComponent<AI.AIPerception>();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if (ai != null && ai.usesOfflineMode)
							 | 
						||
| 
								 | 
							
								                        ai.onlineComponents.OnGoingOnline();
							 | 
						||
| 
								 | 
							
								                    else
							 | 
						||
| 
								 | 
							
								                        reference.gameObject.SetActive(true);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else
							 | 
						||
| 
								 | 
							
								                    reference.gameObject.SetActive(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                reference.isLoaded = true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// Activates the GameObject of a Persistent Reference and returns its GameObject, providing its refID.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <param name="_refID"></param>
							 | 
						||
| 
								 | 
							
								        public GameObject ActivatePersistentReferenceAndGetGameObject(string _refID)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            PersistentReference reference = GetPersistentReference(_refID);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (reference != null)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                reference.gameObject.SetActive(true);
							 | 
						||
| 
								 | 
							
								                return reference.gameObject;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Debug.Log("Tried to Activate the Persistent Reference with ID: " + _refID + ", but it isn't registered.");
							 | 
						||
| 
								 | 
							
								                return null;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// Disables the GameObject of a Persistent Reference, providing its refID.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        public void DisablePersistentReference(string _refID)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            PersistentReference reference = GetPersistentReference(_refID);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (reference != null)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                // If the AI was using offline mode
							 | 
						||
| 
								 | 
							
								                if (reference.type == PersistentReferenceType.AI && reference.isLoaded)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    AI.AIPerception ai = reference.GetComponent<AI.AIPerception>();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if (ai != null && ai.usesOfflineMode)
							 | 
						||
| 
								 | 
							
								                        ai.onlineComponents.OnGoingOffline();
							 | 
						||
| 
								 | 
							
								                    else
							 | 
						||
| 
								 | 
							
								                        reference.gameObject.SetActive(false);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else
							 | 
						||
| 
								 | 
							
								                    reference.gameObject.SetActive(false);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                reference.isLoaded = false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// Gets the Type of a Persistent Reference, providing its refID
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <param name="_refID"></param>
							 | 
						||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						||
| 
								 | 
							
								        public PersistentReferenceType GetPRefType(string _refID)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            PersistentReference pRef = GetPersistentReference(_refID);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (pRef != null)
							 | 
						||
| 
								 | 
							
								                return pRef.type;
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								                return default;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |