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(); }
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(); }
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); }
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; }
/// <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; } }
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(); }
/// <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; } }