/// <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> /// 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(); }
private void DisplayImporterGUI() { // Hide importer GUI when not active in hierarchy if (!dfUnity.gameObject.activeInHierarchy) { return; } EditorGUILayout.Space(); ShowImportFoldout = GUILayoutHelper.Foldout(ShowImportFoldout, new GUIContent("Importer"), () => { GUILayoutHelper.Indent(() => { EditorGUILayout.Space(); var propModelID = Prop("ModelImporter_ModelID"); EditorGUILayout.LabelField(new GUIContent("ModelID", "Enter numeric ID of model.")); GUILayoutHelper.Horizontal(() => { propModelID.intValue = EditorGUILayout.IntField(propModelID.intValue); if (GUILayout.Button("Import")) { GameObjectHelper.CreateDaggerfallMeshGameObject((uint)propModelID.intValue, null); } }); EditorGUILayout.Space(); var propBlockName = Prop("BlockImporter_BlockName"); EditorGUILayout.LabelField(new GUIContent("Block Name", "Enter name of block. Accepts .RMB and .RDB blocks.")); GUILayoutHelper.Horizontal(() => { propBlockName.stringValue = EditorGUILayout.TextField(propBlockName.stringValue.Trim().ToUpper()); if (GUILayout.Button("Import")) { // Create block if (propBlockName.stringValue.EndsWith(".RMB")) { GameObjectHelper.CreateRMBBlockGameObject(propBlockName.stringValue, dfUnity.Option_RMBGroundPlane, dfUnity.Option_CityBlockPrefab); } else if (propBlockName.stringValue.EndsWith(".RDB")) { GameObjectHelper.CreateRDBBlockGameObject( propBlockName.stringValue, null, true, DFRegion.DungeonTypes.HumanStronghold, 0.5f, 4, (int)DateTime.Now.Ticks, dfUnity.Option_DungeonBlockPrefab); } } }); EditorGUILayout.Space(); var propCityName = Prop("CityImporter_CityName"); EditorGUILayout.LabelField(new GUIContent("City Name", "Enter exact city name in format RegionName/CityName. Case-sensitive.")); GUILayoutHelper.Horizontal(() => { propCityName.stringValue = EditorGUILayout.TextField(propCityName.stringValue.Trim()); if (GUILayout.Button("Import")) { GameObjectHelper.CreateDaggerfallLocationGameObject(propCityName.stringValue, null); } }); EditorGUILayout.Space(); var propDungeonName = Prop("DungeonImporter_DungeonName"); EditorGUILayout.LabelField(new GUIContent("Dungeon Name", "Enter exact dungeon name in format RegionName/DungeonName. Case-sensitive.")); GUILayoutHelper.Horizontal(() => { propDungeonName.stringValue = EditorGUILayout.TextField(propDungeonName.stringValue.Trim()); if (GUILayout.Button("Import")) { GameObjectHelper.CreateDaggerfallDungeonGameObject(propDungeonName.stringValue, null); } }); }); }); }
private void DisplayImporterGUI() { // Hide importer GUI when not active in hierarchy if (!dfUnity.gameObject.activeInHierarchy) { return; } EditorGUILayout.Space(); ShowImportFoldout = GUILayoutHelper.Foldout(ShowImportFoldout, new GUIContent("Importer"), () => { GUILayoutHelper.Indent(() => { EditorGUILayout.Space(); var propModelID = Prop("ModelImporter_ModelID"); EditorGUILayout.LabelField(new GUIContent("ModelID", "Enter numeric ID of model.")); GUILayoutHelper.Horizontal(() => { propModelID.intValue = EditorGUILayout.IntField(propModelID.intValue); if (GUILayout.Button("Import")) { GameObjectHelper.CreateDaggerfallMeshGameObject((uint)propModelID.intValue, null); } }); EditorGUILayout.Space(); var propBlockName = Prop("BlockImporter_BlockName"); EditorGUILayout.LabelField(new GUIContent("Block Name", "Enter name of block. Accepts .RMB and .RDB blocks.")); GUILayoutHelper.Horizontal(() => { propBlockName.stringValue = EditorGUILayout.TextField(propBlockName.stringValue.Trim().ToUpper()); if (GUILayout.Button("Import")) { GameObjectHelper.CreateDaggerfallBlockGameObject(propBlockName.stringValue, null); } }); EditorGUILayout.Space(); var propCityName = Prop("CityImporter_CityName"); EditorGUILayout.LabelField(new GUIContent("City Name", "Enter exact city name in format RegionName/CityName. Case-sensitive.")); GUILayoutHelper.Horizontal(() => { propCityName.stringValue = EditorGUILayout.TextField(propCityName.stringValue.Trim()); if (GUILayout.Button("Import")) { GameObjectHelper.CreateDaggerfallLocationGameObject(propCityName.stringValue, null); } }); EditorGUILayout.Space(); var propDungeonName = Prop("DungeonImporter_DungeonName"); EditorGUILayout.LabelField(new GUIContent("Dungeon Name", "Enter exact dungeon name in format RegionName/DungeonName. Case-sensitive.")); GUILayoutHelper.Horizontal(() => { propDungeonName.stringValue = EditorGUILayout.TextField(propDungeonName.stringValue.Trim()); if (GUILayout.Button("Import")) { GameObjectHelper.CreateDaggerfallDungeonGameObject(propDungeonName.stringValue, null); } }); }); }); }
/// <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(); } }
/// <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); }