forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			323 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			323 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using FishNet.Managing.Logging;
 | 
						|
using FishNet.Serializing.Helping;
 | 
						|
using System.Collections.Generic;
 | 
						|
using UnityEngine;
 | 
						|
using UnityEngine.SceneManagement;
 | 
						|
 | 
						|
namespace FishNet.Managing.Scened
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Extensions for SceneLookupData.
 | 
						|
    /// </summary>
 | 
						|
    internal static class SceneLookupDataExtensions
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// Returns Names from SceneLookupData.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="datas"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static string[] GetNames(this SceneLookupData[] datas)
 | 
						|
        {
 | 
						|
            string[] names = new string[datas.Length];
 | 
						|
            for (int i = 0; i < datas.Length; i++)
 | 
						|
                names[i] = datas[i].Name;
 | 
						|
 | 
						|
            return names;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Data container for looking up, loading, or unloading a scene.
 | 
						|
    /// </summary>
 | 
						|
    public class SceneLookupData
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// Handle of the scene. If value is 0, then handle is not used.
 | 
						|
        /// </summary>
 | 
						|
        public int Handle;
 | 
						|
        /// <summary>
 | 
						|
        /// Name of the scene.
 | 
						|
        /// </summary>
 | 
						|
        public string Name = string.Empty;
 | 
						|
        /// <summary>
 | 
						|
        /// Returns the scene name without a directory path should one exist.
 | 
						|
        /// </summary>
 | 
						|
        public string NameOnly => System.IO.Path.GetFileNameWithoutExtension(Name);
 | 
						|
        /// <summary>
 | 
						|
        /// Returns if this data is valid for use.
 | 
						|
        /// Being valid does not mean that the scene exist, rather that there is enough data to try and lookup a scene.
 | 
						|
        /// </summary>
 | 
						|
        public bool IsValid => (Name != string.Empty || Handle != 0);
 | 
						|
 | 
						|
        #region Const
 | 
						|
        /// <summary>
 | 
						|
        /// String to display when scene data is invalid.
 | 
						|
        /// </summary>
 | 
						|
        private const string INVALID_SCENE = "One or more scene information entries contain invalid data and have been skipped.";
 | 
						|
        #endregion
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 
 | 
						|
        /// </summary>
 | 
						|
        public SceneLookupData() { }
 | 
						|
        /// <summary>
 | 
						|
        /// 
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="scene">Scene to generate from.</param>
 | 
						|
        public SceneLookupData(Scene scene)
 | 
						|
        {
 | 
						|
            Handle = scene.handle;
 | 
						|
            Name = scene.name;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// 
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="name">Scene name to generate from.</param>
 | 
						|
        public SceneLookupData(string name)
 | 
						|
        {
 | 
						|
            Name = name;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// 
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="handle">Scene handle to generate from.</param>
 | 
						|
        public SceneLookupData(int handle)
 | 
						|
        {
 | 
						|
            Handle = handle;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// 
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="handle">Scene handle to generate from.</param>
 | 
						|
        /// <param name="name">Name to generate from if handle is 0.</param>
 | 
						|
        public SceneLookupData(int handle, string name)
 | 
						|
        {
 | 
						|
            Handle = handle;
 | 
						|
            Name = name;
 | 
						|
        }
 | 
						|
 | 
						|
        #region Comparers.
 | 
						|
        public static bool operator ==(SceneLookupData sldA, SceneLookupData sldB)
 | 
						|
        {
 | 
						|
            //One is null while the other is not.
 | 
						|
            if ((sldA is null) != (sldB is null))
 | 
						|
                return false;
 | 
						|
 | 
						|
            /*If here both are either null or have value. */
 | 
						|
            if (!(sldA is null))
 | 
						|
                return sldA.Equals(sldB);
 | 
						|
            else if (!(sldB is null))
 | 
						|
                return sldB.Equals(sldA);
 | 
						|
 | 
						|
            //Fall through indicates both are null.
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
 | 
						|
        public static bool operator !=(SceneLookupData sldA, SceneLookupData sldB)
 | 
						|
        {
 | 
						|
            //One is null while the other is not.
 | 
						|
            if ((sldA is null) != (sldB is null))
 | 
						|
                return true;
 | 
						|
 | 
						|
            /*If here both are either null or have value. */
 | 
						|
            if (!(sldA is null))
 | 
						|
                return !sldA.Equals(sldB);
 | 
						|
            else if (!(sldB is null))
 | 
						|
                return !sldB.Equals(sldA);
 | 
						|
 | 
						|
            //Fall through indicates both are null.
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
 | 
						|
        public bool Equals(SceneLookupData sld)
 | 
						|
        {
 | 
						|
            //Comparing instanced against null.
 | 
						|
            if (sld is null)
 | 
						|
                return false;
 | 
						|
 | 
						|
            //True if both handles are empty.
 | 
						|
            bool bothHandlesEmpty = (
 | 
						|
                (this.Handle == 0) &&
 | 
						|
                (sld.Handle == 0)
 | 
						|
                );
 | 
						|
 | 
						|
            //If both have handles and they match.
 | 
						|
            if (!bothHandlesEmpty && sld.Handle == this.Handle)
 | 
						|
                return true;
 | 
						|
            //If neither have handles and name matches.
 | 
						|
            else if (bothHandlesEmpty && sld.Name == this.Name)
 | 
						|
                return true;
 | 
						|
 | 
						|
            //Fall through.
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        public override int GetHashCode()
 | 
						|
        {
 | 
						|
            int hashCode = 2053068273;
 | 
						|
            hashCode = hashCode * -1521134295 + Handle.GetHashCode();
 | 
						|
            hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Name);
 | 
						|
            return hashCode;
 | 
						|
        }
 | 
						|
 | 
						|
        public override bool Equals(object obj)
 | 
						|
        {
 | 
						|
            return base.Equals(obj);
 | 
						|
        }
 | 
						|
 | 
						|
        public override string ToString()
 | 
						|
        {
 | 
						|
            return base.ToString();
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region CreateData.
 | 
						|
        /// <summary>
 | 
						|
        /// Returns a new SceneLookupData.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="scene">Scene to create from.</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static SceneLookupData CreateData(Scene scene) => new SceneLookupData(scene);
 | 
						|
        /// <summary>
 | 
						|
        /// Returns a new SceneLookupData.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="scene">Scene name to create from.</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static SceneLookupData CreateData(string name) => new SceneLookupData(name);
 | 
						|
        /// <summary>
 | 
						|
        /// Returns a new SceneLookupData.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="scene">Scene handle to create from.</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static SceneLookupData CreateData(int handle) => new SceneLookupData(handle);
 | 
						|
        /// <summary>
 | 
						|
        /// Returns a SceneLookupData collection.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="scenes">Scenes to create from.</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static SceneLookupData[] CreateData(List<Scene> scenes) => CreateData(scenes.ToArray());
 | 
						|
        /// <summary>
 | 
						|
        /// Returns a SceneLookupData collection.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="names">Scene names to create from.</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static SceneLookupData[] CreateData(List<string> names) => CreateData(names.ToArray());
 | 
						|
        /// <summary>
 | 
						|
        /// Returns a SceneLookupData collection.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="handles">Scene handles to create from.</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static SceneLookupData[] CreateData(List<int> handles) => CreateData(handles.ToArray());
 | 
						|
        /// <summary>
 | 
						|
        /// Returns a SceneLookupData collection.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="scenes">Scenes to create from.</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static SceneLookupData[] CreateData(Scene[] scenes)
 | 
						|
        {
 | 
						|
            bool invalidFound = false;
 | 
						|
            List<SceneLookupData> result = new List<SceneLookupData>();
 | 
						|
            foreach (Scene item in scenes)
 | 
						|
            {
 | 
						|
                if (!item.IsValid())
 | 
						|
                {
 | 
						|
                    invalidFound = true;
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
 | 
						|
                result.Add(CreateData(item));
 | 
						|
            }
 | 
						|
 | 
						|
            if (invalidFound)
 | 
						|
                NetworkManager.StaticLogWarning(INVALID_SCENE);
 | 
						|
 | 
						|
            return result.ToArray();
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Returns a SceneLookupData collection.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="names">Scene names to create from.</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static SceneLookupData[] CreateData(string[] names)
 | 
						|
        {
 | 
						|
            bool invalidFound = false;
 | 
						|
            List<SceneLookupData> result = new List<SceneLookupData>();
 | 
						|
            foreach (string item in names)
 | 
						|
            {
 | 
						|
                if (string.IsNullOrEmpty(item))
 | 
						|
                {
 | 
						|
                    invalidFound = true;
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
 | 
						|
                string nameOnly = System.IO.Path.GetFileNameWithoutExtension(item);
 | 
						|
                result.Add(CreateData(nameOnly));
 | 
						|
            }
 | 
						|
 | 
						|
            if (invalidFound)
 | 
						|
                NetworkManager.StaticLogWarning(INVALID_SCENE);
 | 
						|
 | 
						|
            return result.ToArray();
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Returns a SceneLookupData collection.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="handles">Scene handles to create from.</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static SceneLookupData[] CreateData(int[] handles)
 | 
						|
        {
 | 
						|
            bool invalidFound = false;
 | 
						|
            List<SceneLookupData> result = new List<SceneLookupData>();
 | 
						|
            foreach (int item in handles)
 | 
						|
            {
 | 
						|
                if (item == 0)
 | 
						|
                {
 | 
						|
                    invalidFound = true;
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
 | 
						|
                result.Add(CreateData(item));
 | 
						|
            }
 | 
						|
 | 
						|
            if (invalidFound)
 | 
						|
                NetworkManager.StaticLogWarning(INVALID_SCENE);
 | 
						|
 | 
						|
            return result.ToArray();
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns the first scene found using Handle or Name, preferring Handle.
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        /// <param name="foundByHandle">True if scene was found by handle. Handle is always checked first.</param>
 | 
						|
        public Scene GetScene(out bool foundByHandle)
 | 
						|
        {
 | 
						|
            foundByHandle = false;
 | 
						|
 | 
						|
            if (Handle == 0 && string.IsNullOrEmpty(Name))
 | 
						|
            {
 | 
						|
                NetworkManager.StaticLogWarning("Scene handle and name is unset; scene cannot be returned.");
 | 
						|
                return default;
 | 
						|
            }
 | 
						|
 | 
						|
            Scene result = default;
 | 
						|
 | 
						|
            //Lookup my handle.
 | 
						|
            if (Handle != 0)
 | 
						|
            {
 | 
						|
                result = SceneManager.GetScene(Handle);
 | 
						|
                if (result.handle != 0)
 | 
						|
                    foundByHandle = true;
 | 
						|
            }
 | 
						|
 | 
						|
            //If couldnt find handle try by string.
 | 
						|
            if (!foundByHandle)
 | 
						|
                result = SceneManager.GetScene(NameOnly);
 | 
						|
 | 
						|
            return result;
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
}
 |