Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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);
            }
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
0
        /// <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();
            }
        }