/// <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); } }
/// <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(); }
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); }
// 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); }
/// <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); }