/// <summary> /// Transition player through an interior door to building exterior. Player must be inside. /// Interior stores information about exterior, no need for extra params. /// </summary> public void TransitionExterior() { // Exit if missing required components or not currently inside if (!ReferenceComponents() || !interior || !isPlayerInside) { return; } // Raise event RaiseOnPreTransitionEvent(TransitionType.ToBuildingExterior); // Find closest exterior door Vector3 exitDoorPos = Vector3.zero; int doorIndex = -1; DaggerfallStaticDoors exteriorDoors = interior.ExteriorDoors; if (exteriorDoors) { if (!exteriorDoors.FindClosestDoorToPlayer(transform.position, interior.EntryDoor.recordIndex, out exitDoorPos, out doorIndex)) { // Could not find exterior door or fall back to entry door // Just push player outside of building, better than having them trapped inside exitDoorPos = transform.position + transform.forward * 4; } } // Enable exterior parent if (ExteriorParent != null) { ExteriorParent.SetActive(true); } // Disable interior parent if (InteriorParent != null) { InteriorParent.SetActive(false); } // Destroy interior game object Destroy(interior.gameObject); interior = null; // Set player outside exterior door position transform.position = exitDoorPos; if (doorIndex >= 0) { // Adjust player position and facing Vector3 normal = exteriorDoors.GetDoorNormal(doorIndex); transform.position += normal * (controller.radius * 2f); SetFacing(normal); SetStanding(); } // Player is now outside building isPlayerInside = false; // Fire event RaiseOnTransitionExteriorEvent(); }
/// <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(); } }