/// <summary> /// Layout interior for automap based on data in exterior door and optional location for climate settings. /// </summary> /// <param name="doorOwner">Parent transform owning door array.</param> /// <param name="door">Exterior door player clicked on.</param> /// <returns>True if successful.</returns> public bool DoLayoutAutomap(Transform doorOwner, StaticDoor door, ClimateBases climateBase) { if (dfUnity == null) { dfUnity = DaggerfallUnity.Instance; } // Use specified climate this.climateBase = climateBase; // Save exterior information this.entryDoor = door; this.doorOwner = doorOwner; // Get block data blockData = dfUnity.ContentReader.BlockFileReader.GetBlock(door.blockIndex); if (blockData.Type != DFBlock.BlockTypes.Rmb) { throw new Exception(string.Format("Could not load RMB block index {0}", door.blockIndex), null); } // Get record data recordData = blockData.RmbBlock.SubRecords[door.recordIndex]; if (recordData.Interior.Header.Num3dObjectRecords == 0) { throw new Exception(string.Format("No interior 3D models found for record index {0}", door.recordIndex), null); } // Layout interior data AddModels(mapBD); return(true); }
/// <summary> /// Set block data corresponding to interior. /// </summary> private void AssignBlockData(StaticDoor door) { // Get block data DFLocation location = GameManager.Instance.PlayerGPS.CurrentLocation; DFBlock[] blocks; RMBLayout.GetLocationBuildingData(location, out blocks); bool foundBlock = false; for (int index = 0; index < blocks.Length && !foundBlock; ++index) { if (blocks[index].Index == door.blockIndex) { this.blockData = blocks[index]; foundBlock = true; } } if (!foundBlock || this.blockData.Type != DFBlock.BlockTypes.Rmb) { throw new Exception(string.Format("Could not load RMB block index {0}", door.blockIndex), null); } // Get record data recordData = blockData.RmbBlock.SubRecords[door.recordIndex]; if (recordData.Interior.Header.Num3dObjectRecords == 0) { throw new Exception(string.Format("No interior 3D models found for record index {0}", door.recordIndex), null); } }
/// <summary> /// Gets BuildingSummary array generated from DFBlock data. /// </summary> /// <param name="blockData"></param> /// <returns></returns> public static BuildingSummary[] GetBuildingData(DFBlock blockData) { // Store building information int buildingCount = blockData.RmbBlock.SubRecords.Length; BuildingSummary[] buildings = new BuildingSummary[buildingCount]; for (int i = 0; i < buildingCount; i++) { // Create building summary buildings[i] = new BuildingSummary(); // Set building data DFLocation.BuildingData buildingData = blockData.RmbBlock.FldHeader.BuildingDataList[i]; buildings[i].NameSeed = buildingData.NameSeed; buildings[i].FactionId = buildingData.FactionId; buildings[i].LocationId = buildingData.LocationId; buildings[i].BuildingType = buildingData.BuildingType; buildings[i].Quality = buildingData.Quality; // Set building transform info DFBlock.RmbSubRecord subRecord = blockData.RmbBlock.SubRecords[i]; buildings[i].Position = new Vector3(subRecord.XPos, 0, BlocksFile.RMBDimension - subRecord.ZPos) * MeshReader.GlobalScale; buildings[i].Rotation = new Vector3(0, -subRecord.YRotation / BlocksFile.RotationDivisor, 0); buildings[i].Matrix = Matrix4x4.TRS(buildings[i].Position, Quaternion.Euler(buildings[i].Rotation), Vector3.one); } return(buildings); }
/// <summary> /// Gets BuildingSummary array generated from DFBlock data. /// DFBlock data should be provided from RMBLayout.GetLocationBuildingData() output. /// Otherwise not all building data will be present. /// </summary> /// <param name="blockData">DFBlock data.</param> /// <param name="layoutX">X coordindate in map layout used to generate building key.</param> /// <param name="layoutY">Y coordindate in map layout used to generate building key.</param> /// <returns>BuildingSummary.</returns> public static BuildingSummary[] GetBuildingData(DFBlock blockData, int layoutX = -1, int layoutY = -1) { // Store building information int buildingCount = blockData.RmbBlock.SubRecords.Length; BuildingSummary[] buildings = new BuildingSummary[buildingCount]; for (int i = 0; i < buildingCount; i++) { // Create building summary buildings[i] = new BuildingSummary(); // Set building data DFLocation.BuildingData buildingData = blockData.RmbBlock.FldHeader.BuildingDataList[i]; buildings[i].buildingKey = BuildingDirectory.MakeBuildingKey((byte)layoutX, (byte)layoutY, (byte)i); buildings[i].NameSeed = buildingData.NameSeed; buildings[i].FactionId = buildingData.FactionId; buildings[i].BuildingType = buildingData.BuildingType; buildings[i].Quality = buildingData.Quality; // Set building transform info DFBlock.RmbSubRecord subRecord = blockData.RmbBlock.SubRecords[i]; buildings[i].Position = new Vector3(subRecord.XPos, 0, BlocksFile.RMBDimension - subRecord.ZPos) * MeshReader.GlobalScale; buildings[i].Rotation = new Vector3(0, -subRecord.YRotation / BlocksFile.RotationDivisor, 0); buildings[i].Matrix = Matrix4x4.TRS(buildings[i].Position, Quaternion.Euler(buildings[i].Rotation), Vector3.one); // First model of record is building model if (subRecord.Exterior.Block3dObjectRecords.Length > 0) { buildings[i].ModelID = subRecord.Exterior.Block3dObjectRecords[0].ModelIdNum; } } return(buildings); }
/// <summary> /// Collect all quest markers inside a building. /// </summary> void EnumerateBuildingQuestMarkers(DFBlock blockData, int recordIndex, out QuestMarker[] questSpawnMarkers, out QuestMarker[] questItemMarkers) { questSpawnMarkers = null; questItemMarkers = null; List <QuestMarker> questSpawnMarkerList = new List <QuestMarker>(); List <QuestMarker> questItemMarkerList = new List <QuestMarker>(); // Step through building layout to find markers DFBlock.RmbSubRecord recordData = blockData.RmbBlock.SubRecords[recordIndex]; foreach (DFBlock.RmbBlockFlatObjectRecord obj in recordData.Interior.BlockFlatObjectRecords) { Vector3 position = new Vector3(obj.XPos, -obj.YPos, obj.ZPos) * MeshReader.GlobalScale; if (obj.TextureArchive == editorFlatArchive) { switch (obj.TextureRecord) { case spawnMarkerFlatIndex: questSpawnMarkerList.Add(CreateQuestMarker(MarkerTypes.QuestSpawn, position)); break; case itemMarkerFlatIndex: questItemMarkerList.Add(CreateQuestMarker(MarkerTypes.QuestItem, position)); break; } } } // Assign arrays if at least one quest marker found if (questSpawnMarkerList.Count > 0) { questSpawnMarkers = questSpawnMarkerList.ToArray(); } if (questItemMarkerList.Count > 0) { questItemMarkers = questItemMarkerList.ToArray(); } }