public static void Update() { if (_isUpdateRunning) { return; } _isUpdateRunning = true; lock (_updateLock) { using (new PerformanceLogger("[GridProvider] Update", true)) { var discoveredScenes = new List <GridScene>(); foreach (var scene in ZetaDia.Scenes) { if (!scene.IsValid) { continue; } var mesh = scene.Mesh; if (mesh == null || !mesh.IsValid) { continue; } var name = scene.Name.ToLowerInvariant(); if (string.IsNullOrWhiteSpace(name) || name.Contains("filler") || name.Contains("fillscene") || name.Contains("buffer")) { continue; } var zone = mesh.Zone; if (zone == null || !zone.IsValid) { continue; } var sceneNameHash = GetSceneNameHash(mesh, zone); if (CachedScenes.ContainsKey(sceneNameHash)) { continue; } if (!SceneDefinitions.ContainsKey(mesh.SceneSnoId)) { using (new PerformanceLogger("SceneDefinition.Create", true)) { var navZoneDef = zone.NavZoneDef; if (navZoneDef == null || !navZoneDef.IsValid) { continue; } var sceneDefinition = SceneDefinition.Create(mesh, zone, navZoneDef); if (sceneDefinition != null) { SceneDefinitions.Add(mesh.SceneSnoId, sceneDefinition); } } } GridScene cachedScene; using (new PerformanceLogger("GridScene.Create", true)) { cachedScene = GridScene.Create(scene, mesh, zone); } CachedScenes.Add(sceneNameHash, cachedScene); discoveredScenes.Add(cachedScene); Logger.Info("[GridProvider] Added Scene {0} at {1})", cachedScene.Name, cachedScene.Min); } using (new PerformanceLogger("MainGrid.Instance.Update", true)) { MainGrid.Instance.Update(discoveredScenes.SelectMany(s => s.GridNodes)); } } _isUpdateRunning = false; } }