示例#1
0
 public override void FromOSD(OSDMap map)
 {
     foreach (KeyValuePair <string, OSD> kvp in map)
     {
         ulong               regionHandle = ulong.Parse(kvp.Key);
         OSDArray            array        = (OSDArray)kvp.Value;
         List <mapItemReply> replies      = new List <mapItemReply>();
         foreach (OSD o in array)
         {
             mapItemReply r = new mapItemReply();
             r.FromOSD((OSDMap)o);
             replies.Add(r);
         }
         items[regionHandle] = replies;
     }
 }
示例#2
0
        public virtual void HandleMapItemRequest (IClientAPI remoteClient, uint flags,
                                                 uint EstateID, bool godlike, uint itemtype, ulong regionhandle)
        {
            IScenePresence presence = remoteClient.Scene.GetScenePresence (remoteClient.AgentId);
            if (presence == null || presence.IsChildAgent)
                return; //No child agent requests

            uint xstart;
            uint ystart;
            Utils.LongToUInts (m_scene.RegionInfo.RegionHandle, out xstart, out ystart);

            List<mapItemReply> mapitems = new List<mapItemReply> ();
            int tc = Environment.TickCount;
            if (itemtype == (int)GridItemType.AgentLocations) {
                //If its local, just let it do it on its own.
                if (regionhandle == 0 || regionhandle == m_scene.RegionInfo.RegionHandle) {
                    //Only one person here, send a zero person response
                    mapItemReply mapitem;
                    IEntityCountModule entityCountModule = m_scene.RequestModuleInterface<IEntityCountModule> ();
                    if (entityCountModule != null && entityCountModule.RootAgents <= 1) {
                        mapitem = new mapItemReply {
                            x = xstart + 1,
                            y = ystart + 1,
                            id = UUID.Zero,
                            name = Util.Md5Hash (m_scene.RegionInfo.RegionName + tc),
                            Extra = 0,
                            Extra2 = 0
                        };
                        mapitems.Add (mapitem);
                        remoteClient.SendMapItemReply (mapitems.ToArray (), itemtype, flags);
                        return;
                    }
                    m_scene.ForEachScenePresence (delegate (IScenePresence sp) {
                        // Don't send a green dot for yourself
                        if (!sp.IsChildAgent && sp.UUID != remoteClient.AgentId) {
                            mapitem = new mapItemReply {
                                x = (uint)(xstart + sp.AbsolutePosition.X),
                                y = (uint)(ystart + sp.AbsolutePosition.Y),
                                id = UUID.Zero,
                                name = Util.Md5Hash (m_scene.RegionInfo.RegionName + tc),
                                Extra = 1,
                                Extra2 = 0
                            };
                            mapitems.Add (mapitem);
                        }
                    });
                    remoteClient.SendMapItemReply (mapitems.ToArray (), itemtype, flags);
                } else {
                    List<mapItemReply> reply;
                    if (!m_mapItemCache.TryGetValue (regionhandle, out reply)) {
                        m_itemsToRequest.Enqueue (new MapItemRequester {
                            flags = flags,
                            itemtype = itemtype,
                            regionhandle = regionhandle,
                            remoteClient = remoteClient
                        });

                        if (!itemRequesterIsRunning)
                            threadpool.QueueEvent (GetMapItems, 3);
                    } else {
                        remoteClient.SendMapItemReply (mapitems.ToArray (), itemtype, flags);
                    }
                }
            }
        }
 public override void FromOSD(OSDMap map)
 {
     foreach (KeyValuePair<string, OSD> kvp in map)
     {
         ulong regionHandle = ulong.Parse(kvp.Key);
         OSDArray array = (OSDArray) kvp.Value;
         List<mapItemReply> replies = new List<mapItemReply>();
         foreach (OSD o in array)
         {
             mapItemReply r = new mapItemReply();
             r.FromOSD((OSDMap) o);
             replies.Add(r);
         }
         items[regionHandle] = replies;
     }
 }