Beispiel #1
0
        private void LoadMap()
        {
            if (MapListBox.SelectedValue == null)
            {
                return;
            }

            string _SelectedMapName = ((KeyValuePair <int, string>)MapListBox.SelectedValue).Value;

            WDTGrid.Children.Clear();

            progressBar.Visibility   = Visibility.Visible;
            progressLabel.Visibility = Visibility.Visible;

            progressBar.Value     = 0;
            progressLabel.Content = "Loading minimap..";

            var wdt = new WDTReader();

            if (CASC.cascHandler.FileExists(System.IO.Path.Combine(@"world\maps\", _SelectedMapName, _SelectedMapName + ".wdt")))
            {
                Stopwatch        _SW = new Stopwatch();
                BackgroundWorker _BackgroundWorker = new BackgroundWorker();
                _BackgroundWorker.WorkerReportsProgress = true;

                _BackgroundWorker.DoWork += new DoWorkEventHandler(
                    (object o, DoWorkEventArgs args) =>
                {
                    _SW.Start();
                    BackgroundWorker _Worker = o as BackgroundWorker;
                    wdt.LoadWDT(System.IO.Path.Combine(@"world\maps\", _SelectedMapName, _SelectedMapName + ".wdt"));
                    List <int[]> tiles = wdt.GetTiles();

                    for (int i = 0; i < tiles.Count; i++)
                    {
                        if (fCancelMapLoading)
                        {
                            break;
                        }

                        Action _LoadTileAction = delegate() { LoadTile(tiles[i]); };
                        this.Dispatcher.Invoke(_LoadTileAction);
                        _Worker.ReportProgress((i * 100) / tiles.Count, "Loading minimap..");
                    }

                    _Worker.ReportProgress(100, "Minimap loaded.");
                });

                _BackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(
                    (object o, ProgressChangedEventArgs args) =>
                {
                    progressBar.Value     = args.ProgressPercentage;
                    progressLabel.Content = (string)args.UserState;
                });

                _BackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
                    (object sender, RunWorkerCompletedEventArgs args) =>
                {
                    fCancelMapLoading = false;
                    _SW.Stop();
                });

                _BackgroundWorker.RunWorkerAsync();
            }
        }
        private void LoadMap(string map)
        {
            WDTGrid.Children.Clear();

            var wdt = new WDTReader();

            if (CASC.cascHandler.FileExists(System.IO.Path.Combine(@"world\maps\", map, map + ".wdt")))
            {
                Stopwatch        _SW = new Stopwatch();
                BackgroundWorker _BackgroundWorker = new BackgroundWorker();
                _BackgroundWorker.WorkerReportsProgress = true;

                _BackgroundWorker.DoWork += new DoWorkEventHandler(
                    (object o, DoWorkEventArgs args) =>
                {
                    _SW.Start();
                    BackgroundWorker _Worker = o as BackgroundWorker;
                    wdt.LoadWDT(System.IO.Path.Combine(@"world\maps\", map, map + ".wdt"));
                    List <int[]> tiles = wdt.GetTiles();

                    if (tiles.Count == 0)
                    {
                        return;
                    }

                    for (int i = 0; i < tiles.Count; i++)
                    {
                        if (map == "Kalimdor")
                        {
                            if (tiles[i][0] < 5 && tiles[i][1] < 5)
                            {
                                // Filter out GM island
                                continue;
                            }
                        }

                        if (tiles[i][0] < min_x)
                        {
                            min_x = tiles[i][0];
                        }
                        if (tiles[i][1] < min_y)
                        {
                            min_y = tiles[i][1];
                        }

                        if (tiles[i][0] > max_x)
                        {
                            max_x = tiles[i][0];
                        }
                        if (tiles[i][1] > max_y)
                        {
                            max_y = tiles[i][1];
                        }
                    }

                    for (int i = 0; i < tiles.Count; i++)
                    {
                        if (map == "Kalimdor")
                        {
                            // Filter out GM island
                            if (tiles[i][0] < 5 && tiles[i][1] < 5)
                            {
                                continue;
                            }
                        }

                        if (fCancelMapLoading)
                        {
                            break;
                        }

                        Action _LoadTileAction = delegate() { LoadTile(tiles[i]); };
                        this.Dispatcher.Invoke(_LoadTileAction);
                        _Worker.ReportProgress((i * 100) / tiles.Count, "Loading map..");
                    }

                    _Worker.ReportProgress(100, "Map loaded.");
                });

                _BackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(
                    (object o, ProgressChangedEventArgs args) =>
                {
                    progressBar.Value     = args.ProgressPercentage;
                    progressLabel.Content = (string)args.UserState;
                });

                _BackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
                    (object sender, RunWorkerCompletedEventArgs args) =>
                {
                    fCancelMapLoading = false;
                    if (max_x == 0 && min_x == 64)
                    {
                        Close();
                        return;
                    }
                    Width  = (max_x - min_x) * (WDTGrid.Width / 64) + 64;
                    Height = (max_y - min_y) * (WDTGrid.Height / 64) + 64;
                    progressBar.Visibility   = Visibility.Hidden;
                    progressLabel.Visibility = Visibility.Hidden;
                    WDTGrid.Visibility       = Visibility.Visible;
                    _SW.Stop();
                });

                _BackgroundWorker.RunWorkerAsync();
            }
        }