예제 #1
0
        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;
            }
        }