예제 #1
0
파일: Scene.cs 프로젝트: Neverknew/mooege
        public Scene(MpqFile file)
        {
            var stream = file.Open();

            this.Header = new Header(stream);

            Int0                     = stream.ReadValueS32();
            this.AABBBounds          = new AABB(stream);
            this.AABBMarketSetBounds = new AABB(stream);

            this.NavMesh    = new NavMeshDef(stream); //load NavMeshDef
            this.Exclusions = stream.ReadSerializedInts();
            //var exclusions = stream.GetSerializedDataPointer();

            stream.Position += (14 * 4);
            this.Inclusions  = stream.ReadSerializedInts();
            //var inclusions = stream.GetSerializedDataPointer();

            stream.Position += (14 * 4);
            this.MarkerSets  = stream.ReadSerializedInts();

            stream.Position += (14 * 4);
            this.LookLink    = stream.ReadString(64, true);

            // Maybe this is a list/array - DarkLotus
            this.MsgTriggeredEvent = stream.ReadSerializedItem <MsgTriggeredEvent>();
            this.Int1 = stream.ReadValueS32();

            stream.Position += (3 * 4);
            this.NavZone     = new NavZoneDef(stream);

            stream.Close();
        }
예제 #2
0
파일: Scene.cs 프로젝트: keltins/mooege
        public Scene(MpqFile file)
        {
            var stream = file.Open();
            this.Header = new Header(stream);

            Int0 = stream.ReadValueS32();
            this.AABBBounds = new AABB(stream);
            this.AABBMarketSetBounds = new AABB(stream);

            this.NavMesh = new NavMeshDef(stream); //load NavMeshDef
            var exclusions = stream.GetSerializedDataPointer();

            stream.Position += (14 * 4);
            var inclusions = stream.GetSerializedDataPointer();

            stream.Position += (14 * 4);
            this.MarkerSets = stream.ReadSerializedInts();

            stream.Position += (14 * 4);
            this.LookLink = stream.ReadString(64, true);

            // Maybe this is a list/array - DarkLotus
            this.MsgTriggeredEvent = stream.ReadSerializedItem<MsgTriggeredEvent>();
            this.Int1 = stream.ReadValueS32();

            stream.Position += (3 * 4);
            this.NavZone = new NavZoneDef(stream);

            stream.Close();
        }
예제 #3
0
        public static SceneDefinition Create(Scene.NavMesh mesh, NavZone zone, NavZoneDef navZoneDef)
        {
            var filePath = string.Format("{0}{1}.json", SCENES_PATH, mesh.SceneSnoId);

            if (USE_DISK_CACHE)
            {
                if (File.Exists(filePath))
                {
                    var fileContent = File.ReadAllText(filePath);
                    if (!string.IsNullOrWhiteSpace(fileContent))
                    {
                        var savedScene = JsonSerializer.Deserialize <SceneDefinition>(fileContent);
                        if (savedScene != null)
                        {
                            return(savedScene);
                        }
                    }
                }
            }
            var sceneDefinition = new SceneDefinition {
                SceneSNO = mesh.SceneSnoId
            };

            #region NavCells
            var cachedNavCells = new List <NavCellDefinition>();
            var sceneNavCells  = navZoneDef.NavCells.ToList();

            if (sceneNavCells.Count > 0)
            {
                cachedNavCells.AddRange(sceneNavCells.Select(NavCellDefinition.Create));
            }
            sceneDefinition.NavCellDefinitions = cachedNavCells;
            #endregion


            if (USE_DISK_CACHE)
            {
                var serializedScene = JsonSerializer.Serialize(sceneDefinition);
                File.WriteAllText(filePath, serializedScene);
            }
            Logger.Warn("[GridProvider] Added SceneDefinition {0} (Dimensions: {1}, NavCells: {2})", sceneDefinition.SceneSNO, zone.ZoneMax - zone.ZoneMin, sceneDefinition.NavCellDefinitions.Count);
            return(sceneDefinition);
        }
예제 #4
0
        public static SceneDefinition Create(Scene.NavMesh mesh, NavZone zone, NavZoneDef navZoneDef)
        {
            var filePath = string.Format("{0}{1}.json", SCENES_PATH, mesh.SceneSnoId);
            if (USE_DISK_CACHE)
            {
                if (File.Exists(filePath))
                {
                    var fileContent = File.ReadAllText(filePath);
                    if (!string.IsNullOrWhiteSpace(fileContent))
                    {
                        var savedScene = JsonSerializer.Deserialize<SceneDefinition>(fileContent);
                        if (savedScene != null)
                        {
                            return savedScene;
                        }
                    }
                }
            }
            var sceneDefinition = new SceneDefinition { SceneSNO = mesh.SceneSnoId };

            #region NavCells
            var cachedNavCells = new List<NavCellDefinition>();
            var sceneNavCells = navZoneDef.NavCells.ToList();

            if (sceneNavCells.Count > 0)
            {
                cachedNavCells.AddRange(sceneNavCells.Select(NavCellDefinition.Create));
            }
            sceneDefinition.NavCellDefinitions = cachedNavCells;
            #endregion


            if (USE_DISK_CACHE)
            {

                var serializedScene = JsonSerializer.Serialize(sceneDefinition);
                File.WriteAllText(filePath, serializedScene);
            }
            Logger.Warn("[GridProvider] Added SceneDefinition {0} (Dimensions: {1}, NavCells: {2})", sceneDefinition.SceneSNO, zone.ZoneMax - zone.ZoneMin, sceneDefinition.NavCellDefinitions.Count);
            return sceneDefinition;
        }
예제 #5
0
        /// <summary>
        /// Finds a navigable point in a priority scene
        /// </summary>
        private void FindPrioritySceneTarget()
        {
            if (SceneId == 0 && SceneName == String.Empty)
            {
                return;
            }

            gp.Update();

            if (PrioritySceneTarget != Vector3.Zero)
            {
                return;
            }

            bool foundPriorityScene = false;

            // find any matching priority scenes in scene manager - match by name or SNOId

            List <Scene> PScenes = ZetaDia.Scenes.GetScenes()
                                   .Where(s => s.SceneInfo.SNOId == SceneId).ToList();

            PScenes.AddRange(ZetaDia.Scenes.GetScenes()
                             .Where(s => SceneName.Trim() != String.Empty && s.Name.ToLower().Contains(SceneName.ToLower())).ToList());

            List <Scene> foundPriorityScenes = new List <Scene>();
            Dictionary <int, Vector3> foundPrioritySceneIndex = new Dictionary <int, Vector3>();

            foreach (Scene scene in PScenes)
            {
                if (PriorityScenesInvestigated.Contains(scene.SceneInfo.SNOId))
                {
                    continue;
                }

                foundPriorityScene = true;

                NavZone    navZone = scene.Mesh.Zone;
                NavZoneDef zoneDef = navZone.NavZoneDef;

                Vector2 zoneMin = navZone.ZoneMin;
                Vector2 zoneMax = navZone.ZoneMax;

                Vector3 zoneCenter = GetNavZoneCenter(navZone);

                List <NavCell> NavCells = zoneDef.NavCells.Where(c => c.Flags.HasFlag(NavCellFlags.AllowWalk)).ToList();

                if (!NavCells.Any())
                {
                    continue;
                }

                NavCell bestCell = NavCells.OrderBy(c => GetNavCellCenter(c.Min, c.Max, navZone).Distance2D(zoneCenter)).FirstOrDefault();

                if (bestCell != null)
                {
                    foundPrioritySceneIndex.Add(scene.SceneInfo.SNOId, GetNavCellCenter(bestCell, navZone));
                    foundPriorityScenes.Add(scene);
                }
                else
                {
                    DbHelper.Log(TrinityLogLevel.Normal, LogCategory.ProfileTag, "Found Priority Scene but could not find a navigable point!", true);
                }
            }

            if (foundPrioritySceneIndex.Any())
            {
                KeyValuePair <int, Vector3> nearestPriorityScene = foundPrioritySceneIndex.OrderBy(s => s.Value.Distance2D(myPos)).FirstOrDefault();

                PrioritySceneSNOId   = nearestPriorityScene.Key;
                PrioritySceneTarget  = nearestPriorityScene.Value;
                CurrentPriorityScene = foundPriorityScenes.FirstOrDefault(s => s.SceneInfo.SNOId == PrioritySceneSNOId);

                DbHelper.Log(TrinityLogLevel.Normal, LogCategory.ProfileTag, "Found Priority Scene {0} - {1} Center {2} Distance {3:0}",
                             CurrentPriorityScene.Name, CurrentPriorityScene.SceneInfo.SNOId, PrioritySceneTarget, PrioritySceneTarget.Distance2D(myPos));
            }

            if (!foundPriorityScene)
            {
                PrioritySceneTarget = Vector3.Zero;
            }
        }
예제 #6
0
파일: Scene.cs 프로젝트: benracoon/mooege
        public Scene(MpqFile file)
        {
            var stream = file.Open();

            long pos = 0; // x
            DEADBEEF = stream.ReadInt32();
            snoType = stream.ReadInt32();
            unknown1 = stream.ReadInt32();
            unknown2 = stream.ReadInt32();
            SceneSNO = stream.ReadInt32();
            unknown3 = stream.ReadInt32();
            unknown4 = stream.ReadInt32();
            i0 = stream.ReadInt32();
            aabbBounds = new AABB(stream);
            aabbMarkerSetBounds = new AABB(stream);

            //load NavMeshDef
            NavMesh = new NavMeshDef(stream);
            // end navmeshdef
            var serExclusions = new SerializeData(stream);
            stream.Position += 56;
            var serInclusions = new SerializeData(stream);
            stream.Position += 56;

            //MarkerSet Time
            var serMarkerSets = new SerializeData(stream);
            pos = stream.Position;
            stream.Position = serMarkerSets.Offset + 16;
            MarkerSets = new int[serMarkerSets.Size/4];
            for (int i = 0; i < serMarkerSets.Size/4; i++)
            {
                MarkerSets[i] = stream.ReadInt32();
            }
            stream.Position = pos + 56;

            //TODO - parse LookLink /dark
            LookLink = new char[64];
            for (int i = 0; i < 64; i++)
            {
                LookLink[i] = (char) stream.ReadByte();
            }

            var sermsgTriggeredEvents = new SerializeData(stream);
            int i1 = stream.ReadInt32();
            stream.Position += 12;

            //navzonedef
            NavZone = new NavZoneDef(stream);

            stream.Close();
        }
예제 #7
0
        /// <summary>
        /// Finds a navigable point in a priority scene
        /// </summary>
        private void FindPrioritySceneTarget()
        {
            if (SceneId == 0 && string.IsNullOrWhiteSpace(SceneName))
            {
                return;
            }

            if (_prioritySceneTarget != Vector3.Zero)
            {
                return;
            }

            bool foundPriorityScene = false;

            // find any matching priority scenes in scene manager - match by name or SNOId

            List <Scene> pScenes;
            var          allScenes = ZetaDia.Scenes.ToList();

            if (allScenes.Any())
            {
                pScenes = GetPScenesBySceneId(allScenes);

                pScenes.AddRange(GetPScenesByName(allScenes));
            }
            else
            {
                return;
            }

            List <Scene> foundPriorityScenes = new List <Scene>();
            Dictionary <int, Vector3> foundPrioritySceneIndex = new Dictionary <int, Vector3>();

            foreach (Scene scene in pScenes)
            {
                try
                {
                    if (_priorityScenesInvestigated.Contains(scene.SceneInfo.SNOId))
                    {
                        continue;
                    }

                    foundPriorityScene = true;

                    NavZone    navZone = scene.Mesh.Zone;
                    NavZoneDef zoneDef = navZone.NavZoneDef;

                    Vector3 zoneCenter = GetNavZoneCenter(navZone);

                    List <NavCell> navCells = zoneDef.NavCells.Where(c => c.Flags.HasFlag(NavCellFlags.AllowWalk)).ToList();

                    if (!navCells.Any())
                    {
                        continue;
                    }

                    NavCell bestCell = navCells.OrderBy(c => GetNavCellCenter(c.Min, c.Max, navZone).Distance2D(zoneCenter)).FirstOrDefault();

                    if (bestCell != null)
                    {
                        foundPrioritySceneIndex.Add(scene.SceneInfo.SNOId, GetNavCellCenter(bestCell, navZone));
                        foundPriorityScenes.Add(scene);
                    }
                    else
                    {
                        Logger.Log("Found Scene but could not find a navigable point!", true);
                    }
                }
                catch (Exception ex)
                {
                    Logger.Log(ex.ToString());
                }
            }

            if (foundPrioritySceneIndex.Any())
            {
                KeyValuePair <int, Vector3> nearestPriorityScene = foundPrioritySceneIndex.OrderBy(s => s.Value.Distance2D(myPos)).FirstOrDefault();

                _prioritySceneSNOId   = nearestPriorityScene.Key;
                _prioritySceneTarget  = nearestPriorityScene.Value;
                _currentPriorityScene = foundPriorityScenes.FirstOrDefault(s => s.SceneInfo.SNOId == _prioritySceneSNOId);

                if (_currentPriorityScene != null)
                {
                    Logger.Log("Found Scene {0} - {1} Center {2} Distance {3:0}",
                               _currentPriorityScene.Name, _currentPriorityScene.SceneInfo.SNOId, _prioritySceneTarget, _prioritySceneTarget.Distance2D(myPos));
                }
            }

            if (!foundPriorityScene)
            {
                _prioritySceneTarget = Vector3.Zero;
            }
        }