/// <summary>
        /// Player is leaving dungeon, transition them back outside.
        /// </summary>
        public void TransitionDungeonExterior()
        {
            if (!ReferenceComponents() || !dungeon || !isPlayerInsideDungeon)
            {
                return;
            }

            // Enable exterior parent
            if (ExteriorParent != null)
            {
                ExteriorParent.SetActive(true);
            }

            // Disable dungeon parent
            if (DungeonParent != null)
            {
                DungeonParent.SetActive(false);
            }

            // Destroy dungeon game object
            Destroy(dungeon.gameObject);
            dungeon = null;

            // Set player outside exterior door position and set facing
            transform.position = dungeonEntrancePosition;
            SetFacing(-dungeonEntranceForward);
            SetStanding();

            // Player is now outside dungeon
            isPlayerInside              = false;
            isPlayerInsideDungeon       = false;
            isPlayerInsideDungeonPalace = false;
            lastPlayerDungeonBlockIndex = -1;
            playerDungeonBlockData      = new DFLocation.DungeonBlock();
        }
 /// <summary>Constructor.</summary>
 public TransitionEventArgs()
 {
     TransitionType     = PlayerEnterExit.TransitionType.NotDefined;
     StaticDoor         = new StaticDoor();
     DaggerfallInterior = null;
     DaggerfallDungeon  = null;
 }
        /// <summary>
        /// Player is leaving dungeon, transition them back outside.
        /// </summary>
        public void TransitionDungeonExterior()
        {
            if (!ReferenceComponents() || !dungeon || !isPlayerInsideDungeon)
            {
                return;
            }

            // Enable exterior parent
            if (ExteriorParent != null)
            {
                ExteriorParent.SetActive(true);
            }

            // Disable dungeon parent
            if (DungeonParent != null)
            {
                DungeonParent.SetActive(false);
            }

            // Destroy dungeon game object
            Destroy(dungeon.gameObject);
            dungeon = null;

            // Set player outside exterior door position and set facing
            transform.position = dungeonEntrancePosition;
            SetFacing(-dungeonEntranceForward);
            SetStanding();

            // Player is now outside dungeon
            isPlayerInside        = false;
            isPlayerInsideDungeon = false;

            //Debug.Log("Player attempted to leave dungeon.");
        }
        /// <summary>
        /// Transition player through a dungeon entrance door into dungeon interior.
        /// </summary>
        /// <param name="doorOwner">Parent transform owning door array.</param>
        /// <param name="door">Exterior door player clicked on.</param>
        public void TransitionDungeonInterior(Transform doorOwner, StaticDoor door, DFLocation location)
        {
            // Ensure we have component references
            if (!ReferenceComponents())
            {
                return;
            }

            // Layout dungeon
            GameObject newDungeon = GameObjectHelper.CreateDaggerfallDungeonGameObject(location, DungeonParent.transform);

            newDungeon.hideFlags = HideFlags.HideAndDontSave;
            dungeon = newDungeon.GetComponent <DaggerfallDungeon>();

            // Find start marker to position player
            if (!dungeon.StartMarker)
            {
                // Could not find a start marker
                Destroy(newDungeon);
                return;
            }

            // Cache player starting position and facing to use on exit
            dungeonEntrancePosition = transform.position;
            dungeonEntranceForward  = transform.forward;

            // Disable exterior parent
            if (ExteriorParent != null)
            {
                ExteriorParent.SetActive(false);
            }

            // Enable dungeon parent
            if (DungeonParent != null)
            {
                DungeonParent.SetActive(true);
            }

            // Set player to start position
            transform.position = dungeon.StartMarker.transform.position + Vector3.up * (controller.height * 0.6f);

            //// TODO: Find closest exit door to orient player
            //DaggerfallStaticDoors doors = newDungeon.GetComponent<DaggerfallStaticDoors>();
            //if (doors)
            //{
            //    Vector3 doorPos;
            //    int doorIndex;
            //    if (doors.FindClosestDoorToPlayer(transform.position, 0, out doorPos, out doorIndex))
            //    {
            //    }
            //}

            // Fix player standing
            SetStanding();

            // Player is now inside dungeon
            isPlayerInside        = true;
            isPlayerInsideDungeon = true;
        }
 /// <summary>Constructor helper.</summary>
 public TransitionEventArgs(TransitionType transitionType, StaticDoor staticDoor, DaggerfallInterior daggerfallInterior = null, DaggerfallDungeon daggerfallDungeon = null)
     : base()
 {
     this.TransitionType     = transitionType;
     this.StaticDoor         = staticDoor;
     this.DaggerfallInterior = daggerfallInterior;
     this.DaggerfallDungeon  = daggerfallDungeon;
 }
 private void DaggerfallDungeon_OnSetDungeon(DaggerfallDungeon daggerfallDungeon)
 {
     if (transform.IsChildOf(daggerfallDungeon.transform))
     {
         DaggerfallDungeon.OnSetDungeon -= DaggerfallDungeon_OnSetDungeon;
         subscribedToOnSetDungeon        = false;
         ApplyMaterials(false, daggerfallDungeon.DungeonTextureTable);
     }
 }
Example #7
0
        /// <summary>
        /// Starts player inside dungeon with no exterior world.
        /// </summary>
        public void StartDungeonInterior(DFLocation location, bool preferEnterMarker = true, bool importEnemies = true)
        {
            // Ensure we have component references
            if (!ReferenceComponents())
            {
                return;
            }

            // Layout dungeon
            GameObject newDungeon = GameObjectHelper.CreateDaggerfallDungeonGameObject(location, DungeonParent.transform, importEnemies);

            newDungeon.hideFlags = defaultHideFlags;
            dungeon = newDungeon.GetComponent <DaggerfallDungeon>();

            GameObject marker = null;

            if (preferEnterMarker && dungeon.EnterMarker != null)
            {
                marker = dungeon.EnterMarker;
            }
            else
            {
                marker = dungeon.StartMarker;
            }

            // Find start marker to position player
            if (!marker)
            {
                // Could not find marker
                DaggerfallUnity.LogMessage("No start or enter marker found for this dungeon. Aborting load.");
                Destroy(newDungeon);
                return;
            }

            EnableDungeonParent();

            // Add quest resources - except foes, these are loaded from enemy save data
            GameObjectHelper.AddQuestResourceObjects(SiteTypes.Dungeon, dungeon.transform, 0, true, false, true);

            // Set to start position
            MovePlayerToMarker(marker);

            // Set player facing north
            PlayerMouseLook playerMouseLook = GameManager.Instance.PlayerMouseLook;

            if (playerMouseLook)
            {
                playerMouseLook.SetFacing(Vector3.forward);
            }

            // Raise event
            RaiseOnTransitionDungeonInteriorEvent(new StaticDoor(), dungeon);
        }
        /// <summary>
        /// Transition player through a dungeon entrance door into dungeon interior.
        /// </summary>
        /// <param name="doorOwner">Parent transform owning door array.</param>
        /// <param name="door">Exterior door player clicked on.</param>
        public void TransitionDungeonInterior(Transform doorOwner, StaticDoor door, DFLocation location)
        {
            // Ensure we have component references
            if (!ReferenceComponents())
            {
                return;
            }

            // Layout dungeon
            GameObject newDungeon = GameObjectHelper.CreateDaggerfallDungeonGameObject(location, DungeonParent.transform);

            newDungeon.hideFlags = HideFlags.HideAndDontSave;
            dungeon = newDungeon.GetComponent <DaggerfallDungeon>();

            // Find start marker to position player
            if (!dungeon.StartMarker)
            {
                // Could not find a start marker
                Destroy(newDungeon);
                return;
            }

            // Cache player starting position and facing to use on exit
            dungeonEntrancePosition = transform.position;
            dungeonEntranceForward  = transform.forward;

            // Disable exterior parent
            if (ExteriorParent != null)
            {
                ExteriorParent.SetActive(false);
            }

            // Enable dungeon parent
            if (DungeonParent != null)
            {
                DungeonParent.SetActive(true);
            }

            // Set player to start position
            // Not sure how to set facing here as player transitions to a marker, not a door
            // Could always find closest exit door and use that
            transform.position = dungeon.StartMarker.transform.position + Vector3.up * (controller.height * 0.6f);
            SetStanding();

            // Player is now inside dungeon
            isPlayerInside        = true;
            isPlayerInsideDungeon = true;
        }
        /// <summary>
        /// Starts player inside dungeon with no exterior world.
        /// </summary>
        public void StartDungeonInterior(DFLocation location, bool preferEnterMarker = true)
        {
            // Ensure we have component references
            if (!ReferenceComponents())
            {
                return;
            }

            // Layout dungeon
            GameObject newDungeon = GameObjectHelper.CreateDaggerfallDungeonGameObject(location, DungeonParent.transform);

            newDungeon.hideFlags = defaultHideFlags;
            dungeon = newDungeon.GetComponent <DaggerfallDungeon>();

            GameObject marker = null;

            if (preferEnterMarker && dungeon.EnterMarker != null)
            {
                marker = dungeon.EnterMarker;
            }
            else
            {
                marker = dungeon.StartMarker;
            }

            // Find start marker to position player
            if (!marker)
            {
                // Could not find marker
                DaggerfallUnity.LogMessage("No start or enter marker found for this dungeon. Aborting load.");
                Destroy(newDungeon);
                return;
            }

            EnableDungeonParent();

            // Set to start position
            MovePlayerToMarker(marker);

            // Set player facing north
            PlayerMouseLook playerMouseLook = GameManager.Instance.PlayerMouseLook;

            if (playerMouseLook)
            {
                playerMouseLook.SetFacing(Vector3.forward);
            }
        }
        /// <summary>
        /// Transition player through a dungeon entrance door into dungeon interior.
        /// </summary>
        /// <param name="doorOwner">Parent transform owning door array.</param>
        /// <param name="door">Exterior door player clicked on.</param>
        public void TransitionDungeonInterior(Transform doorOwner, StaticDoor door, DFLocation location)
        {
            // Ensure we have component references
            if (!ReferenceComponents())
            {
                return;
            }

            // Layout dungeon
            GameObject newDungeon = GameObjectHelper.CreateDaggerfallDungeonGameObject(location, DungeonParent.transform);

            newDungeon.hideFlags = HideFlags.HideAndDontSave;
            dungeon = newDungeon.GetComponent <DaggerfallDungeon>();

            // Find start marker to position player
            if (!dungeon.StartMarker)
            {
                // Could not find a start marker
                Destroy(newDungeon);
                return;
            }

            // Cache player starting position and facing to use on exit
            dungeonEntrancePosition = transform.position;
            dungeonEntranceForward  = transform.forward;

            // Disable exterior parent
            if (ExteriorParent != null)
            {
                ExteriorParent.SetActive(false);
            }

            // Enable dungeon parent
            if (DungeonParent != null)
            {
                DungeonParent.SetActive(true);
            }

            // Player is now inside dungeon
            isPlayerInside        = true;
            isPlayerInsideDungeon = true;

            // Set to start position
            MovePlayerToDungeonStart();
        }
Example #11
0
        public static GameObject CreateDaggerfallDungeonGameObject(DFLocation location, Transform parent)
        {
            if (!location.HasDungeon)
            {
                string multiName = string.Format("{0}/{1}", location.RegionName, location.Name);
                DaggerfallUnity.LogMessage(string.Format("Location '{0}' does not contain a dungeon map", multiName), true);
                return(null);
            }

            GameObject go = new GameObject(string.Format("DaggerfallDungeon [Region={0}, Name={1}]", location.RegionName, location.Name));

            if (parent)
            {
                go.transform.parent = parent;
            }
            DaggerfallDungeon c = go.AddComponent <DaggerfallDungeon>();

            c.SetDungeon(location);

            return(go);
        }
Example #12
0
 // Place foe somewhere near player when inside a dungeon
 // Dungeons interiors are complex 3D environments with no navgrid/navmesh or known spawn nodes
 void PlaceFoeDungeonInterior(GameObject[] gameObjects, DaggerfallDungeon dungeonParent)
 {
     PlaceFoeFreely(gameObjects, dungeonParent.transform);
 }
 /// <summary>Constructor helper.</summary>
 public TransitionEventArgs(TransitionType transitionType, StaticDoor staticDoor, DaggerfallInterior daggerfallInterior = null, DaggerfallDungeon daggerfallDungeon = null)
     : base()
 {
     this.TransitionType = transitionType;
     this.StaticDoor = staticDoor;
     this.DaggerfallInterior = daggerfallInterior;
     this.DaggerfallDungeon = daggerfallDungeon;
 }
        /// <summary>
        /// Player is leaving dungeon, transition them back outside.
        /// </summary>
        public void TransitionDungeonExterior()
        {
            if (!ReferenceComponents() || !dungeon || !isPlayerInsideDungeon)
                return;

            // Raise event
            RaiseOnPreTransitionEvent(TransitionType.ToDungeonExterior);

            // Enable exterior parent
            if (ExteriorParent != null)
                ExteriorParent.SetActive(true);

            // Disable dungeon parent
            if (DungeonParent != null)
                DungeonParent.SetActive(false);

            // Destroy dungeon game object
            Destroy(dungeon.gameObject);
            dungeon = null;

            // Set player outside exterior door position and set facing
            transform.position = dungeonEntrancePosition;
            SetFacing(-dungeonEntranceForward);
            SetStanding();

            // Player is now outside dungeon
            isPlayerInside = false;
            isPlayerInsideDungeon = false;
            isPlayerInsideDungeonPalace = false;
            lastPlayerDungeonBlockIndex = -1;
            playerDungeonBlockData = new DFLocation.DungeonBlock();

            // Raise event
            RaiseOnTransitionDungeonExteriorEvent();
        }
        private void EnableDungeonFog(DaggerfallDungeon dungeon)
        {
            var   rnd      = totalRandom ? new System.Random(Time.time.GetHashCode()) : new System.Random(dungeon.name.GetHashCode());
            Color fogColor = new Color((float)rnd.NextDouble(), (float)rnd.NextDouble(), (float)rnd.NextDouble());

            if (enableFog)
            {
                float start = ((float)rnd.NextDouble() * (maxFogStart - minFogStart)) + minFogStart;
                float end   = ((float)rnd.NextDouble() * (maxFogDistance - minFogDistance)) + minFogDistance + start;

                RenderSettings.fogColor         = fogColor;
                RenderSettings.fogStartDistance = start;
                RenderSettings.fogEndDistance   = end;
                RenderSettings.fogMode          = FogMode.Linear;
            }

            if (postProcessLayer != null)
            {
                postProcessLayer.fog.excludeSkybox = true;
            }

            if (enableAO)
            {
                AmbientOcclusion ambientOcclusionSettings;
                if (postProcessVolume.profile.TryGetSettings(out ambientOcclusionSettings))
                {
                    ambientOcclusionSettings.intensity.value = 0.65f;
                    ambientOcclusionSettings.radius.value    = 1.64f;
                    ambientOcclusionSettings.enabled.value   = true;
                }
            }

            if (enableVignette)
            {
                Vignette vignetteSettings;
                if (postProcessVolume.profile.TryGetSettings(out vignetteSettings))
                {
                    vignetteSettings.intensity.value = 0.273f;
                    vignetteSettings.enabled.value   = true;
                }
            }

            if (enableAmbientLighting)
            {
                if (playerAmbientLight != null)
                {
                    playerAmbientLight.enabled = false;
                    playerAmbientLight.StopAllCoroutines();
                }

                RenderSettings.ambientMode = UnityEngine.Rendering.AmbientMode.Trilight;

                Color sky     = Color.Lerp(new Color(0.433f, 0.433f, 0.433f), fogColor, ambientLerp) * dungeonDarkness;
                Color equator = Color.Lerp(new Color(0.396f, 0.396f, 0.396f), fogColor, ambientLerp) * dungeonDarkness;
                Color ground  = Color.Lerp(new Color(0.254f, 0.254f, 0.254f), fogColor, ambientLerp) * dungeonDarkness;

                RenderSettings.ambientSkyColor     = sky;
                RenderSettings.ambientEquatorColor = equator;
                RenderSettings.ambientGroundColor  = ground;
            }
        }
        protected virtual void RaiseOnTransitionDungeonInteriorEvent(StaticDoor staticDoor, DaggerfallDungeon daggerfallDungeon)
        {
            TransitionEventArgs args = new TransitionEventArgs(TransitionType.ToDungeonInterior, staticDoor, null, daggerfallDungeon);

            if (OnTransitionDungeonInterior != null)
            {
                OnTransitionDungeonInterior(args);
            }
        }
        /// <summary>
        /// Transition player through a dungeon entrance door into dungeon interior.
        /// </summary>
        /// <param name="doorOwner">Parent transform owning door array.</param>
        /// <param name="door">Exterior door player clicked on.</param>
        public void TransitionDungeonInterior(Transform doorOwner, StaticDoor door, DFLocation location)
        {
            // Ensure we have component references
            if (!ReferenceComponents())
                return;

            // Override location if specified
            if (OverrideLocation != null)
            {
                DFLocation overrideLocation = dfUnity.ContentReader.MapFileReader.GetLocation(OverrideLocation.Summary.RegionName, OverrideLocation.Summary.LocationName);
                if (overrideLocation.Loaded)
                    location = overrideLocation;
            }

            // Raise event
            RaiseOnPreTransitionEvent(TransitionType.ToDungeonInterior, door);

            // Layout dungeon
            GameObject newDungeon = GameObjectHelper.CreateDaggerfallDungeonGameObject(location, DungeonParent.transform);
            newDungeon.hideFlags = HideFlags.HideAndDontSave;
            dungeon = newDungeon.GetComponent<DaggerfallDungeon>();

            // Find start marker to position player
            if (!dungeon.StartMarker)
            {
                // Could not find a start marker
                Destroy(newDungeon);
                return;
            }

            // Cache player starting position and facing to use on exit
            dungeonEntrancePosition = transform.position;
            dungeonEntranceForward = transform.forward;

            // Disable exterior parent
            if (ExteriorParent != null)
                ExteriorParent.SetActive(false);

            // Enable dungeon parent
            if (DungeonParent != null)
                DungeonParent.SetActive(true);

            // Player is now inside dungeon
            isPlayerInside = true;
            isPlayerInsideDungeon = true;

            // Set to start position
            MovePlayerToDungeonStart();

            // Raise event
            RaiseOnTransitionDungeonInteriorEvent(door, dungeon);
        }
Example #18
0
        /// <summary>
        /// Transition player through a dungeon entrance door into dungeon interior.
        /// </summary>
        /// <param name="doorOwner">Parent transform owning door array.</param>
        /// <param name="door">Exterior door player clicked on.</param>
        public void TransitionDungeonInterior(Transform doorOwner, StaticDoor door, DFLocation location)
        {
            // Ensure we have component references
            if (!ReferenceComponents())
            {
                return;
            }

            // Override location if specified
            if (OverrideLocation != null)
            {
                DFLocation overrideLocation = dfUnity.ContentReader.MapFileReader.GetLocation(OverrideLocation.Summary.RegionName, OverrideLocation.Summary.LocationName);
                if (overrideLocation.Loaded)
                {
                    location = overrideLocation;
                }
            }

            // Raise event
            RaiseOnPreTransitionEvent(TransitionType.ToDungeonInterior, door);

            // Layout dungeon
            GameObject newDungeon = GameObjectHelper.CreateDaggerfallDungeonGameObject(location, DungeonParent.transform);

            newDungeon.hideFlags = HideFlags.HideAndDontSave;
            dungeon = newDungeon.GetComponent <DaggerfallDungeon>();

            // Find start marker to position player
            if (!dungeon.StartMarker)
            {
                // Could not find a start marker
                Destroy(newDungeon);
                return;
            }

            // Cache player starting position and facing to use on exit
            dungeonEntrancePosition = transform.position;
            dungeonEntranceForward  = transform.forward;

            // Disable exterior parent
            if (ExteriorParent != null)
            {
                ExteriorParent.SetActive(false);
            }

            // Enable dungeon parent
            if (DungeonParent != null)
            {
                DungeonParent.SetActive(true);
            }

            // Player is now inside dungeon
            isPlayerInside        = true;
            isPlayerInsideDungeon = true;

            // Set to start position
            MovePlayerToDungeonStart();

            // Raise event
            RaiseOnTransitionDungeonInteriorEvent(door, dungeon);
        }
        /// <summary>
        /// Starts player inside dungeon with no exterior world.
        /// </summary>
        public void StartDungeonInterior(DFLocation location, bool preferEnterMarker = true)
        {
            // Ensure we have component references
            if (!ReferenceComponents())
                return;

            // Layout dungeon
            GameObject newDungeon = GameObjectHelper.CreateDaggerfallDungeonGameObject(location, DungeonParent.transform);
            newDungeon.hideFlags = defaultHideFlags;
            dungeon = newDungeon.GetComponent<DaggerfallDungeon>();

            GameObject marker = null;
            if (preferEnterMarker && dungeon.EnterMarker != null)
                marker = dungeon.EnterMarker;
            else
                marker = dungeon.StartMarker;

            // Find start marker to position player
            if (!marker)
            {
                // Could not find marker
                DaggerfallUnity.LogMessage("No start or enter marker found for this dungeon. Aborting load.");
                Destroy(newDungeon);
                return;
            }

            EnableDungeonParent();

            // Set to start position
            MovePlayerToMarker(marker);

            // Set player facing north
            PlayerMouseLook playerMouseLook = GameManager.Instance.PlayerMouseLook;
            if (playerMouseLook)
                playerMouseLook.SetFacing(Vector3.forward);
        }
        /// <summary>
        /// Transition player through a dungeon entrance door into dungeon interior.
        /// </summary>
        /// <param name="doorOwner">Parent transform owning door array.</param>
        /// <param name="door">Exterior door player clicked on.</param>
        public void TransitionDungeonInterior(Transform doorOwner, StaticDoor door, DFLocation location, bool doFade = false)
        {
            // Ensure we have component references
            if (!ReferenceComponents())
                return;

            // Override location if specified
            if (OverrideLocation != null)
            {
                DFLocation overrideLocation = dfUnity.ContentReader.MapFileReader.GetLocation(OverrideLocation.Summary.RegionName, OverrideLocation.Summary.LocationName);
                if (overrideLocation.Loaded)
                    location = overrideLocation;
            }

            // Raise event
            RaiseOnPreTransitionEvent(TransitionType.ToDungeonInterior, door);

            // Layout dungeon
            GameObject newDungeon = GameObjectHelper.CreateDaggerfallDungeonGameObject(location, DungeonParent.transform);
            newDungeon.hideFlags = defaultHideFlags;
            dungeon = newDungeon.GetComponent<DaggerfallDungeon>();

            // Find start marker to position player
            if (!dungeon.StartMarker)
            {
                // Could not find a start marker
                Destroy(newDungeon);
                return;
            }

            EnableDungeonParent();

            // Set to start position
            MovePlayerToMarker(dungeon.StartMarker);

            // Find closest dungeon exit door to orient player
            StaticDoor[] doors = DaggerfallStaticDoors.FindDoorsInCollections(dungeon.StaticDoorCollections, DoorTypes.DungeonExit);
            if (doors != null && doors.Length > 0)
            {
                Vector3 doorPos;
                int doorIndex;
                if (DaggerfallStaticDoors.FindClosestDoorToPlayer(transform.position, doors, out doorPos, out doorIndex))
                {
                    // Set player facing away from door
                    PlayerMouseLook playerMouseLook = GameManager.Instance.PlayerMouseLook;
                    if (playerMouseLook)
                    {
                        Vector3 normal = DaggerfallStaticDoors.GetDoorNormal(doors[doorIndex]);
                        playerMouseLook.SetFacing(normal);
                    }
                }
            }

            // Raise event
            RaiseOnTransitionDungeonInteriorEvent(door, dungeon);

            // Fade in from black
            if (doFade)
                DaggerfallUI.Instance.FadeHUDFromBlack();
        }
        /// <summary>
        /// Transition player through a dungeon entrance door into dungeon interior.
        /// </summary>
        /// <param name="doorOwner">Parent transform owning door array.</param>
        /// <param name="door">Exterior door player clicked on.</param>
        public void TransitionDungeonInterior(Transform doorOwner, StaticDoor door, DFLocation location, bool doFade = false)
        {
            // Ensure we have component references
            if (!ReferenceComponents())
            {
                return;
            }

            // Reset dungeon block on entering dungeon
            lastPlayerDungeonBlockIndex = -1;
            playerDungeonBlockData      = new DFLocation.DungeonBlock();

            // Override location if specified
            if (OverrideLocation != null)
            {
                DFLocation overrideLocation = dfUnity.ContentReader.MapFileReader.GetLocation(OverrideLocation.Summary.RegionName, OverrideLocation.Summary.LocationName);
                if (overrideLocation.Loaded)
                {
                    location = overrideLocation;
                }
            }

            // Raise event
            RaiseOnPreTransitionEvent(TransitionType.ToDungeonInterior, door);

            // Layout dungeon
            GameObject newDungeon = GameObjectHelper.CreateDaggerfallDungeonGameObject(location, DungeonParent.transform);

            newDungeon.hideFlags = defaultHideFlags;
            dungeon = newDungeon.GetComponent <DaggerfallDungeon>();

            // Find start marker to position player
            if (!dungeon.StartMarker)
            {
                // Could not find a start marker
                Destroy(newDungeon);
                return;
            }

            EnableDungeonParent();

            // Set to start position
            MovePlayerToMarker(dungeon.StartMarker);

            // Find closest dungeon exit door to orient player
            StaticDoor[] doors = DaggerfallStaticDoors.FindDoorsInCollections(dungeon.StaticDoorCollections, DoorTypes.DungeonExit);
            if (doors != null && doors.Length > 0)
            {
                Vector3 doorPos;
                int     doorIndex;
                if (DaggerfallStaticDoors.FindClosestDoorToPlayer(transform.position, doors, out doorPos, out doorIndex))
                {
                    // Set player facing away from door
                    PlayerMouseLook playerMouseLook = GameManager.Instance.PlayerMouseLook;
                    if (playerMouseLook)
                    {
                        Vector3 normal = DaggerfallStaticDoors.GetDoorNormal(doors[doorIndex]);
                        playerMouseLook.SetFacing(normal);
                    }
                }
            }

            // Raise event
            RaiseOnTransitionDungeonInteriorEvent(door, dungeon);

            // Fade in from black
            if (doFade)
            {
                DaggerfallUI.Instance.FadeHUDFromBlack();
            }
        }
 protected virtual void RaiseOnTransitionDungeonInteriorEvent(StaticDoor staticDoor, DaggerfallDungeon daggerfallDungeon)
 {
     TransitionEventArgs args = new TransitionEventArgs(TransitionType.ToDungeonInterior, staticDoor, null, daggerfallDungeon);
     if (OnTransitionDungeonInterior != null)
         OnTransitionDungeonInterior(args);
 }