Ejemplo n.º 1
0
        private void PlayerWorkerThread()
        {
            // wait for map data to be loaded before proceeding (or if we are cancelled)
            EventWaitHandle.WaitAny(new ManualResetEvent[] { m_MapDataLoaded, m_Canceled });

            while (m_Running)
            {
                try
                {
                    if (m_Link.DataAvailable && m_MapData.ContainsKey(m_Link.Map))
                    {
                        FloorMapDetails map = m_MapData[m_Link.Map];

                        // convert back to inches
                        double posX = m_Link.PositionX * 39.3700787;
                        double posZ = m_Link.PositionZ * 39.3700787;
                        double rot  = m_Link.RotationPlayer;

                        posX = ArenaNetMap.TranslateX(posX, map.MapRect, map.ContinentRect);
                        posZ = ArenaNetMap.TranslateZ(posZ, map.MapRect, map.ContinentRect);

                        Location loc = ArenaNetMap.Unproject(new Point(posX, posZ), ArenaNetMap.MaxZoomLevel);

                        // move the player icon
                        Dispatcher.Invoke(() =>
                        {
                            m_Player.Heading    = rot;
                            m_Player.Visibility = Visibility.Visible;

                            // only follow player if they've asked to and the location has changed
                            if (m_FollowPlayer && m_Player.Location != loc)
                            {
                                Map.SetView(loc, Map.ZoomLevel);
                            }

                            m_Player.Location = loc;
                        }, DispatcherPriority.Background, CancellationToken.None, new TimeSpan(0, 0, 1));
                    }
                }
                catch
                { }

                m_Canceled.WaitOne(100);
            }
        }
Ejemplo n.º 2
0
        public MainWindow()
        {
            m_MapLayerContainer = new ArenaNetMapLayerContainer();

            InitializeComponent();

            m_Link    = new MumbleLink();
            m_MapData = new Dictionary <int, FloorMapDetails>();

            m_FollowPlayer      = false;
            m_Player            = new PlayerPushpin();
            m_Player.Visibility = Visibility.Hidden;
            Map.Children.Add(m_Player);

            Map.Children.Add(m_MapLayerContainer);

            new MapFloorRequest(1, 2).ExecuteAsync(floor =>
            {
                if (floor != null)
                {
                    foreach (FloorRegion region in floor.Regions.Values)
                    {
                        foreach (int mid in region.Maps.Keys)
                        {
                            FloorMapDetails map = region.Maps[mid];
                            m_MapData.Add(mid, map);
                        }
                    }

                    m_MapDataLoaded.Set();

                    Dispatcher.BeginInvoke(new Action(() =>
                    {
                        foreach (KeyValuePair <int, FloorMapDetails> entry in m_MapData)
                        {
                            m_MapLayerContainer.LoadFloorMapDetails(entry.Key, entry.Value);
                        }
                    }), DispatcherPriority.Background);
                }
            });

            m_MapLayerContainer.LoadBounties();

            new EventDetailsRequest().ExecuteAsync(events =>
            {
                if (events != null)
                {
                    new ChampionEventsRequest().ExecuteAsync(championEvents =>
                    {
                        IDictionary <Guid, EventDetails> evDetails = new Dictionary <Guid, EventDetails>();
                        IDictionary <Guid, bool> evChamps          = new Dictionary <Guid, bool>();

                        foreach (KeyValuePair <Guid, EventDetails> entry in events.Events)
                        {
                            Guid eid        = entry.Key;
                            EventDetails ev = entry.Value;
                            if (!ev.Name.StartsWith("skill challenge: ", StringComparison.InvariantCultureIgnoreCase) && m_MapData.ContainsKey(ev.MapId))
                            {
                                evDetails[eid] = ev;
                                evChamps[eid]  = championEvents.ChampionEvents.Contains(eid);
                            }
                        }

                        // ensure map data is loaded
                        m_MapDataLoaded.WaitOne();

                        Dispatcher.BeginInvoke(new Action(() =>
                        {
                            foreach (KeyValuePair <Guid, EventDetails> entry in evDetails)
                            {
                                m_MapLayerContainer.LoadEvent(entry.Key, entry.Value, m_MapData[entry.Value.MapId], evChamps[entry.Key]);
                            }

                            m_EventDataLoaded.Set();
                        }), DispatcherPriority.Background);
                    });
                }
            });

            m_EventTimerBoxes = new Dictionary <string, EventTimerBox>();
            new EventTimerRequest().ExecuteAsync(timerData =>
            {
                if (timerData != null)
                {
                    Dispatcher.BeginInvoke(new Action(() =>
                    {
                        foreach (MetaEventStatus e in timerData.Events)
                        {
                            EventTimerBox box = new EventTimerBox();
                            box.SetData(e);
                            m_EventTimerBoxes.Add(e.Id, box);

                            switch (e.StageTypeEnum)
                            {
                            case MetaEventStage.StageType.Boss:
                                EventTimerItems_Boss.Children.Add(box);
                                break;

                            case MetaEventStage.StageType.PreEvent:
                                EventTimerItems_PreEvent.Children.Add(box);
                                break;

                            default:
                                EventTimerItems_Other.Children.Add(box);
                                break;
                            }
                        }

                        m_TimerDataLoaded.Set();
                    }), DispatcherPriority.Background);
                }
            });

            MouseDown += DrawPolyMouseDownHandler;
            KeyDown   += DrawPolyKeyDownHandler;
            KeyUp     += DrawPolyKeyUpHandler;

            m_Running            = true;
            m_Canceled           = new ManualResetEvent(false);
            m_PlayerWorkerThread = new Thread(PlayerWorkerThread);
            m_PlayerWorkerThread.Start();
            m_EventWorkerThread = new Thread(EventWorkerThread);
            m_EventWorkerThread.Start();
            m_EventTimerWorkerThread = new Thread(EventTimerWorkerThread);
            m_EventTimerWorkerThread.Start();
        }
        public void LoadFloorMapDetails(int mid, FloorMapDetails map)
        {
            if (!m_MapLayers.ContainsKey(mid))
            {
                m_MapLayers.Add(mid, new MapLayer());
            }

            if (!m_MapWaypoints.ContainsKey(mid))
            {
                m_MapWaypoints.Add(mid, new MapLayer());
                m_MapLayers[mid].Children.Add(m_MapWaypoints[mid]);
            }

            if (!m_MapPointsOfInterest.ContainsKey(mid))
            {
                m_MapPointsOfInterest.Add(mid, new MapLayer());
                m_MapLayers[mid].Children.Add(m_MapPointsOfInterest[mid]);
            }

            if (!m_MapVistas.ContainsKey(mid))
            {
                m_MapVistas.Add(mid, new MapLayer());
                m_MapLayers[mid].Children.Add(m_MapVistas[mid]);
            }

            if (!m_MapDungeons.ContainsKey(mid))
            {
                m_MapDungeons.Add(mid, new MapLayer());
                m_MapLayers[mid].Children.Add(m_MapDungeons[mid]);
            }

            if (!m_MapRenownHearts.ContainsKey(mid))
            {
                m_MapRenownHearts.Add(mid, new MapLayer());
                m_MapLayers[mid].Children.Add(m_MapRenownHearts[mid]);
            }

            if (!m_MapSkillPoints.ContainsKey(mid))
            {
                m_MapSkillPoints.Add(mid, new MapLayer());
                m_MapLayers[mid].Children.Add(m_MapSkillPoints[mid]);
            }

            if (!m_MapSectors.ContainsKey(mid))
            {
                m_MapSectors.Add(mid, new MapLayer());
                m_MapLayers[mid].Children.Add(m_MapSectors[mid]);
            }

            m_MapWaypoints[mid].Children.Clear();
            m_MapPointsOfInterest[mid].Children.Clear();
            m_MapVistas[mid].Children.Clear();
            m_MapDungeons[mid].Children.Clear();
            m_MapRenownHearts[mid].Children.Clear();
            m_MapSkillPoints[mid].Children.Clear();
            m_MapSectors[mid].Children.Clear();

            foreach (PointOfInterest poi in map.PointsOfInterest)
            {
                Pushpin poiPin = new PointOfInterestPushpin(poi);

                poiPin.Location = ArenaNetMap.Unproject(new Point(poi.Coord[0], poi.Coord[1]), ArenaNetMap.MaxZoomLevel);

                switch (poi.TypeEnum)
                {
                case PointOfInterestType.Waypoint:
                    m_MapWaypoints[mid].Children.Add(poiPin);
                    break;

                case PointOfInterestType.Landmark:
                    m_MapPointsOfInterest[mid].Children.Add(poiPin);
                    break;

                case PointOfInterestType.Vista:
                    m_MapVistas[mid].Children.Add(poiPin);
                    break;

                case PointOfInterestType.Unlock:
                    m_MapDungeons[mid].Children.Add(poiPin);
                    break;

                default:
                    continue;
                }
            }

            foreach (Task rh in map.Tasks)
            {
                Pushpin rhPin = new TaskPushpin(rh);

                rhPin.Location = ArenaNetMap.Unproject(new Point(rh.Coord[0], rh.Coord[1]), ArenaNetMap.MaxZoomLevel);

                m_MapRenownHearts[mid].Children.Add(rhPin);
            }

            foreach (MappedModel sp in map.SkillChallenges)
            {
                Pushpin spPin = new SkillChallengePushpin(sp);

                spPin.Location = ArenaNetMap.Unproject(new Point(sp.Coord[0], sp.Coord[1]), ArenaNetMap.MaxZoomLevel);

                m_MapSkillPoints[mid].Children.Add(spPin);
            }

            // hide sectors by default
            m_MapSectors[mid].Visibility = Visibility.Collapsed;
            foreach (Sector s in map.Sectors)
            {
                Pushpin sPin = new SectorPushpin(s);

                sPin.Location = ArenaNetMap.Unproject(new Point(s.Coord[0], s.Coord[1]), ArenaNetMap.MaxZoomLevel);

                m_MapSectors[mid].Children.Add(sPin);
            }
        }
        public void LoadEvent(Guid eid, EventDetails ev, FloorMapDetails map, bool isChampion)
        {
            int mid = ev.MapId;

            if (!m_MapLayers.ContainsKey(mid))
            {
                m_MapLayers.Add(mid, new MapLayer());
            }

            if (!m_MapEvents.ContainsKey(mid))
            {
                m_MapEvents.Add(mid, new MapLayer());

                // we insert instead of add so events always show up under other pushpins
                m_MapLayers[mid].Children.Insert(0, m_MapEvents[mid]);
            }

            if (!m_MapEventPolygons.ContainsKey(mid))
            {
                m_MapEventPolygons.Add(mid, new MapLayer());

                // we insert instead of add so events always show up under other pushpins
                m_MapLayers[mid].Children.Insert(0, m_MapEventPolygons[mid]);
            }

            // clean up
            if (m_EventMapPolygons.ContainsKey(eid))
            {
                m_MapEvents[mid].Children.Remove(m_EventMapPolygons[eid]);
                m_EventMapPolygons.Remove(eid);
            }

            if (m_EventPushpins.ContainsKey(eid))
            {
                m_MapEvents[mid].Children.Remove(m_EventPushpins[eid]);
                m_EventPushpins.Remove(eid);
            }

            Point center = new Point(ArenaNetMap.TranslateX(ev.Location.Center[0], map.MapRect, map.ContinentRect),
                                     ArenaNetMap.TranslateZ(ev.Location.Center[1], map.MapRect, map.ContinentRect));

            switch (ev.Location.TypeEnum)
            {
            case LocationType.Poly:
                EventMapPolygon evPoly = new EventMapPolygon(ev, isChampion);

                foreach (List <double> pt in ev.Location.Points)
                {
                    evPoly.Locations.Add(
                        ArenaNetMap.Unproject(
                            new Point(
                                ArenaNetMap.TranslateX(pt[0], map.MapRect, map.ContinentRect),
                                ArenaNetMap.TranslateZ(pt[1], map.MapRect, map.ContinentRect)),
                            ArenaNetMap.MaxZoomLevel));
                }

                m_EventMapPolygons[eid] = evPoly;
                // insert so polys are below all pushpins
                m_MapEventPolygons[mid].Children.Insert(0, evPoly);
                break;

            case LocationType.Sphere:
            case LocationType.Cylinder:
                EventMapPolygon evCircle = new EventMapPolygon(ev, isChampion);

                double radius = ArenaNetMap.TranslateX(ev.Location.Center[0] + ev.Location.Radius, map.MapRect, map.ContinentRect) - center.X;

                for (int i = 0; i < 360; i += 10)
                {
                    evCircle.Locations.Add(
                        ArenaNetMap.Unproject(
                            new Point(
                                center.X + radius * Math.Cos(i * (Math.PI / 180)),
                                center.Y + radius * Math.Sin(i * (Math.PI / 180))),
                            ArenaNetMap.MaxZoomLevel));
                }

                m_EventMapPolygons[eid] = evCircle;
                // insert so polys are below all pushpins
                m_MapEventPolygons[ev.MapId].Children.Insert(0, evCircle);
                break;

            default:
                break;
            }

            EventPushpin evPin = new EventPushpin(ev);

            evPin.Location       = ArenaNetMap.Unproject(center, ArenaNetMap.MaxZoomLevel);
            m_EventPushpins[eid] = evPin;
            m_MapEvents[ev.MapId].Children.Add(evPin);
        }