示例#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);
            }
        }
        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);
        }