/// <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(bool doFade = false) { // Exit if missing required components or not currently inside if (!ReferenceComponents() || !interior || !isPlayerInside) { return; } // Raise event RaiseOnPreTransitionEvent(TransitionType.ToBuildingExterior); // Find closest door and position player outside of it StaticDoor closestDoor; Vector3 closestDoorPos = DaggerfallStaticDoors.FindClosestDoor(transform.position, ExteriorDoors, out closestDoor); Vector3 normal = DaggerfallStaticDoors.GetDoorNormal(closestDoor); Vector3 position = closestDoorPos + normal * (controller.radius * 3f); world.SetAutoReposition(StreamingWorld.RepositionMethods.Offset, position); EnableExteriorParent(); // Player is now outside building isPlayerInside = false; // Fire event RaiseOnTransitionExteriorEvent(); // Fade in from black if (doFade) { DaggerfallUI.Instance.FadeHUDFromBlack(); } }
/// <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 an interior door to building exterior. Player must be inside. /// Interior stores information about exterior, no need for extra params. /// </summary> public void TransitionExterior(bool doFade = false) { // 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; // } //} // Find closest door and position player outside of it StaticDoor closestDoor; Vector3 closestDoorPos = DaggerfallStaticDoors.FindClosestDoor(transform.position, exteriorDoors, out closestDoor); Vector3 normal = DaggerfallStaticDoors.GetDoorNormal(closestDoor); Vector3 position = closestDoorPos + normal * (controller.radius * 2f); world.SetAutoReposition(StreamingWorld.RepositionMethods.Offset, position); EnableExteriorParent(); //// 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(); // 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(); } }