Exemple #1
0
        /// <summary>
        /// Sends the mapitem response to the IClientAPI
        /// </summary>
        /// <param name="response">The OSDMap Response for the mapitem</param>
        private void RequestMapItemsCompleted(IAsyncResult iar)
        {
            AsyncResult             result = (AsyncResult)iar;
            RequestMapItemsDelegate icon   = (RequestMapItemsDelegate)result.AsyncDelegate;

            OSDMap response = (OSDMap)icon.EndInvoke(iar);

            Interlocked.Decrement(ref nAsyncRequests);

            if (!response.ContainsKey("requestID"))
            {
                return;
            }

            UUID requestID = response["requestID"].AsUUID();

            if (requestID != UUID.Zero)
            {
                MapRequestState mrs = new MapRequestState();
                mrs.agentID = UUID.Zero;
                lock (m_openRequests)
                {
                    if (m_openRequests.ContainsKey(requestID))
                    {
                        mrs = m_openRequests[requestID];
                        m_openRequests.Remove(requestID);
                    }
                }

                if (mrs.agentID != UUID.Zero)
                {
                    ScenePresence av = null;
                    m_scene.TryGetScenePresence(mrs.agentID, out av);
                    if (av != null)
                    {
                        if (response.ContainsKey(mrs.itemtype.ToString()))
                        {
                            List <mapItemReply> returnitems = new List <mapItemReply>();
                            OSDArray            itemarray   = (OSDArray)response[mrs.itemtype.ToString()];
                            for (int i = 0; i < itemarray.Count; i++)
                            {
                                OSDMap       mapitem = (OSDMap)itemarray[i];
                                mapItemReply mi      = new mapItemReply();
                                mi.x      = (uint)mapitem["X"].AsInteger();
                                mi.y      = (uint)mapitem["Y"].AsInteger();
                                mi.id     = mapitem["ID"].AsUUID();
                                mi.Extra  = mapitem["Extra"].AsInteger();
                                mi.Extra2 = mapitem["Extra2"].AsInteger();
                                mi.name   = mapitem["Name"].AsString();
                                returnitems.Add(mi);
                            }
                            av.ControllingClient.SendMapItemReply(returnitems.ToArray(), mrs.itemtype, mrs.flags);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Sends the mapitem response to the IClientAPI
        /// </summary>
        /// <param name="response">The OSDMap Response for the mapitem</param>
        private void RequestMapItemsCompleted(OSDMap response)
        {
            UUID requestID = response["requestID"].AsUUID();

            if (requestID != UUID.Zero)
            {
                MapRequestState mrs = new MapRequestState();
                mrs.agentID = UUID.Zero;
                lock (m_openRequests)
                {
                    if (m_openRequests.ContainsKey(requestID))
                    {
                        mrs = m_openRequests[requestID];
                        m_openRequests.Remove(requestID);
                    }
                }

                if (mrs.agentID != UUID.Zero)
                {
                    ScenePresence av = null;
                    m_scene.TryGetAvatar(mrs.agentID, out av);
                    if (av != null)
                    {
                        if (response.ContainsKey(mrs.itemtype.ToString()))
                        {
                            List <mapItemReply> returnitems = new List <mapItemReply>();
                            OSDArray            itemarray   = (OSDArray)response[mrs.itemtype.ToString()];
                            for (int i = 0; i < itemarray.Count; i++)
                            {
                                OSDMap       mapitem = (OSDMap)itemarray[i];
                                mapItemReply mi      = new mapItemReply();
                                mi.x      = (uint)mapitem["X"].AsInteger();
                                mi.y      = (uint)mapitem["Y"].AsInteger();
                                mi.id     = mapitem["ID"].AsUUID();
                                mi.Extra  = mapitem["Extra"].AsInteger();
                                mi.Extra2 = mapitem["Extra2"].AsInteger();
                                mi.name   = mapitem["Name"].AsString();
                                returnitems.Add(mi);
                            }
                            av.ControllingClient.SendMapItemReply(returnitems.ToArray(), mrs.itemtype, mrs.flags);
                        }
                    }
                }
            }
        }
Exemple #3
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.ToString()),
                            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);
                    }
                }
            }
        }
Exemple #4
0
        public void HandleMapItemRequest(IClientAPI remoteClient, uint flags,
                                         uint EstateID, bool godlike,
                                         uint itemtype, ulong regionhandle)
        {
            //The following constant appears to be from GridLayerType enum
            //defined in OpenMetaverse/GridManager.cs of libopenmetaverse.
            if (itemtype == (uint)OpenMetaverse.GridItemType.LandForSale)
            {
                Hashtable ReqHash = new Hashtable();

                //The flags are: SortAsc (1 << 15), PerMeterSort (1 << 17)
                ReqHash["flags"]       = "163840";
                ReqHash["type"]        = "4294967295"; //This is -1 in 32 bits
                ReqHash["price"]       = "0";
                ReqHash["area"]        = "0";
                ReqHash["query_start"] = "0";

                Hashtable result = GenericXMLRPCRequest(ReqHash,
                                                        "dir_land_query");

                if (!Convert.ToBoolean(result["success"]))
                {
                    remoteClient.SendAgentAlertMessage(
                        result["errorMessage"].ToString(), false);
                    return;
                }

                ArrayList dataArray = (ArrayList)result["data"];

                int count = dataArray.Count;
                if (count > 100)
                {
                    count = 101;
                }

                List <mapItemReply> mapitems = new List <mapItemReply>();
                string   ParcelRegionUUID;
                string[] landingpoint;

                foreach (Object o in dataArray)
                {
                    Hashtable d = (Hashtable)o;

                    if (d["name"] == null)
                    {
                        continue;
                    }

                    mapItemReply mapitem = new mapItemReply();

                    ParcelRegionUUID = d["region_UUID"].ToString();

                    foreach (Scene scene in m_Scenes)
                    {
                        if (scene.RegionInfo.RegionID.ToString() == ParcelRegionUUID)
                        {
                            landingpoint = d["landing_point"].ToString().Split('/');

                            mapitem.x = (uint)((scene.RegionInfo.RegionLocX * 256) +
                                               Convert.ToDecimal(landingpoint[0]));
                            mapitem.y = (uint)((scene.RegionInfo.RegionLocY * 256) +
                                               Convert.ToDecimal(landingpoint[1]));
                            break;
                        }
                    }

                    mapitem.id     = new UUID(d["parcel_id"].ToString());
                    mapitem.Extra  = Convert.ToInt32(d["area"]);
                    mapitem.Extra2 = Convert.ToInt32(d["sale_price"]);
                    mapitem.name   = d["name"].ToString();

                    mapitems.Add(mapitem);
                }

                remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                mapitems.Clear();
            }

            if (itemtype == (uint)OpenMetaverse.GridItemType.PgEvent ||
                itemtype == (uint)OpenMetaverse.GridItemType.MatureEvent ||
                itemtype == (uint)OpenMetaverse.GridItemType.AdultEvent)
            {
                Hashtable ReqHash = new Hashtable();

                //Find the maturity level
                int maturity = (1 << 24);

                //Find the maturity level
                if (itemtype == (uint)OpenMetaverse.GridItemType.MatureEvent)
                {
                    maturity = (1 << 25);
                }
                else
                {
                    if (itemtype == (uint)OpenMetaverse.GridItemType.AdultEvent)
                    {
                        maturity = (1 << 26);
                    }
                }

                //The flags are: SortAsc (1 << 15), PerMeterSort (1 << 17)
                maturity |= 163840;

                //When character before | is a u get upcoming/in-progress events
                //Character before | is number of days before/after current date
                //Characters after | is the number for a category
                ReqHash["text"]        = "u|0";
                ReqHash["flags"]       = maturity.ToString();
                ReqHash["query_start"] = "0";

                Hashtable result = GenericXMLRPCRequest(ReqHash,
                                                        "dir_events_query");

                if (!Convert.ToBoolean(result["success"]))
                {
                    remoteClient.SendAgentAlertMessage(
                        result["errorMessage"].ToString(), false);
                    return;
                }

                ArrayList dataArray = (ArrayList)result["data"];

                List <mapItemReply> mapitems = new List <mapItemReply>();
                int      event_id;
                string[] landingpoint;

                foreach (Object o in dataArray)
                {
                    Hashtable d = (Hashtable)o;

                    if (d["name"] == null)
                    {
                        continue;
                    }

                    mapItemReply mapitem = new mapItemReply();

                    //Events use a comma separator in the landing point
                    landingpoint = d["landing_point"].ToString().Split(',');
                    mapitem.x    = Convert.ToUInt32(landingpoint[0]);
                    mapitem.y    = Convert.ToUInt32(landingpoint[1]);

                    //This is a crazy way to pass the event ID back to the
                    //viewer but that is the way it wants the information.
                    event_id   = Convert.ToInt32(d["event_id"]);
                    mapitem.id = new UUID("00000000-0000-0000-0000-0000" +
                                          event_id.ToString("X8"));

                    mapitem.Extra  = Convert.ToInt32(d["unix_time"]);
                    mapitem.Extra2 = 0; //FIXME: No idea what to do here
                    mapitem.name   = d["name"].ToString();

                    mapitems.Add(mapitem);
                }

                remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                mapitems.Clear();
            }
        }
        public virtual void HandleMapItemRequest(IClientAPI remoteClient, uint flags,
                                                 uint EstateID, bool godlike, uint itemtype, ulong regionhandle)
        {
            //All the parts are in for this, except for popular places and those are not in as they are not reqested anymore.

            List<mapItemReply> mapitems = new List<mapItemReply>();
            mapItemReply mapitem = new mapItemReply();
            uint xstart = 0;
            uint ystart = 0;
            OpenMetaverse.Utils.LongToUInts(remoteClient.Scene.RegionInfo.RegionHandle, out xstart, out ystart);
            OpenSim.Services.Interfaces.GridRegion GR = m_Scenes[0].GridService.GetRegionByPosition(UUID.Zero, (int)xstart, (int)ystart);

            #region Telehub
            if (itemtype == (uint)OpenMetaverse.GridItemType.Telehub)
            {
                IRegionConnector GF = DataManager.DataManager.RequestPlugin<IRegionConnector>();
                if (GF == null)
                    return;

                int tc = Environment.TickCount;
                //Find the telehub
                Telehub telehub = GF.FindTelehub(GR.RegionID);
                if (telehub != null)
                {
                    mapitem = new mapItemReply();
                    //The position is in GLOBAL coordinates (in meters)
                    mapitem.x = (uint)(GR.RegionLocX + telehub.TelehubLocX);
                    mapitem.y = (uint)(GR.RegionLocY + telehub.TelehubLocY);
                    mapitem.id = GR.RegionID;
                    //This is how the name is sent, go figure
                    mapitem.name = Util.Md5Hash(GR.RegionName + tc.ToString());
                    //Not sure, but this is what gets sent
                    mapitem.Extra = 1;
                    mapitem.Extra2 = 0;

                    mapitems.Add(mapitem);
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            #endregion

            #region Land for sale

            //PG land that is for sale
            if (itemtype == (uint)OpenMetaverse.GridItemType.LandForSale)
            {
                if (directoryService == null)
                    return;
                //Find all the land, use "0" for the flags so we get all land for sale, no price or area checking
                DirLandReplyData[] Landdata = directoryService.FindLandForSale("0", int.MaxValue.ToString(), "0", 0, 0);
                
                uint locX = 0;
                uint locY = 0;
                foreach (DirLandReplyData landDir in Landdata)
                {
                    LandData landdata = directoryService.GetParcelInfo(landDir.parcelID);
                    if (landdata.Maturity != 0)
                        continue; //Not a PG land 
                    foreach (Scene scene in m_Scenes)
                    {
                        if (scene.RegionInfo.RegionID == landdata.RegionID)
                        {
                            //Global coords, so add the meters
                            locX = scene.RegionInfo.RegionLocX * Constants.RegionSize;
                            locY = scene.RegionInfo.RegionLocY * Constants.RegionSize;
                        }
                    }
                    if (locY == 0 && locX == 0)
                    {
                        //Ask the grid service for the coordinates if the region is not local
                        OpenSim.Services.Interfaces.GridRegion r = m_Scenes[0].GridService.GetRegionByUUID(UUID.Zero, landdata.RegionID);
                        if (r != null)
                        {
                            locX = (uint)r.RegionLocX;
                            locY = (uint)r.RegionLocY;
                        }
                    }
                    if (locY == 0 && locX == 0) //Couldn't find the region, don't send
                        continue;

                    mapitem = new mapItemReply();
                    //Global coords, so make sure its in meters
                    mapitem.x = (uint)(locX + landdata.UserLocation.X);
                    mapitem.y = (uint)(locY + landdata.UserLocation.Y);
                    mapitem.id = landDir.parcelID;
                    mapitem.name = landDir.name;
                    mapitem.Extra = landDir.actualArea;
                    mapitem.Extra2 = landDir.salePrice;
                    mapitems.Add(mapitem);
                }
                //Send all the map items
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            //Adult or mature land that is for sale
            if (itemtype == (uint)OpenMetaverse.GridItemType.AdultLandForSale)
            {
                if (directoryService == null)
                    return;
                //Find all the land, use "0" for the flags so we get all land for sale, no price or area checking
                DirLandReplyData[] Landdata = directoryService.FindLandForSale("0", int.MaxValue.ToString(), "0", 0, 0);
                
                uint locX = 0;
                uint locY = 0;
                foreach (DirLandReplyData landDir in Landdata)
                {
                    LandData landdata = directoryService.GetParcelInfo(landDir.parcelID);
                    if (landdata.Maturity == 0)
                        continue; //Its PG
                    foreach (Scene scene in m_Scenes)
                    {
                        if (scene.RegionInfo.RegionID == landdata.RegionID)
                        {
                            //Global coords, so add the meters
                            locX = scene.RegionInfo.RegionLocX * Constants.RegionSize;
                            locY = scene.RegionInfo.RegionLocY * Constants.RegionSize;
                        }
                    }
                    if (locY == 0 && locX == 0)
                    {
                        //Ask the grid service for the coordinates if the region is not local
                        OpenSim.Services.Interfaces.GridRegion r = m_Scenes[0].GridService.GetRegionByUUID(UUID.Zero, landdata.RegionID);
                        if (r != null)
                        {
                            locX = (uint)r.RegionLocX;
                            locY = (uint)r.RegionLocY;
                        }
                    }
                    if (locY == 0 && locX == 0) //Couldn't find the region, don't send
                        continue;

                    mapitem = new mapItemReply();
                    //Global coords, so make sure its in meters
                    mapitem.x = (uint)(locX + landdata.UserLocation.X);
                    mapitem.y = (uint)(locY + landdata.UserLocation.Y);
                    mapitem.id = landDir.parcelID;
                    mapitem.name = landDir.name;
                    mapitem.Extra = landDir.actualArea;
                    mapitem.Extra2 = landDir.salePrice;

                    mapitems.Add(mapitem);
                }
                //Send the results if we have any
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            #endregion

            #region Events

            if (itemtype == (uint)OpenMetaverse.GridItemType.PgEvent ||
                itemtype == (uint)OpenMetaverse.GridItemType.MatureEvent ||
                itemtype == (uint)OpenMetaverse.GridItemType.AdultEvent)
            {
                if (directoryService == null)
                    return;

                //Find the maturity level
                int maturity = itemtype == (uint)OpenMetaverse.GridItemType.PgEvent ?
                    (int)DirectoryManager.EventFlags.PG :
                    (itemtype == (uint)GridItemType.MatureEvent) ?
                    (int)DirectoryManager.EventFlags.Mature :
                    (int)DirectoryManager.EventFlags.Adult;

                //Gets all the events occuring in the given region by maturity level
                DirEventsReplyData[] Eventdata = directoryService.FindAllEventsInRegion(GR.RegionName, maturity);
                
                foreach (DirEventsReplyData eventData in Eventdata)
                {
                    //Get more info on the event
                    EventData eventdata = directoryService.GetEventInfo(eventData.eventID.ToString());
                    
                    string RegionName = eventdata.simName;
                    Vector3 globalPos = eventdata.globalPos;
                    OpenSim.Services.Interfaces.GridRegion region = m_Scenes[0].GridService.GetRegionByName(UUID.Zero, RegionName);
                    mapitem = new mapItemReply();
                    
                    //Use global position plus half the region so that it doesn't always appear in the bottom corner
                    mapitem.x = (uint)globalPos.X + (Constants.RegionSize / 2);
                    mapitem.y = (uint)globalPos.Y + (Constants.RegionSize / 2);
                    
                    mapitem.id = UUID.Random();
                    mapitem.name = eventData.name;
                    mapitem.Extra = (int)eventdata.dateUTC;
                    mapitem.Extra2 = (int)eventdata.eventID;
                    mapitems.Add(mapitem);
                }
                //Send if we have any
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            #endregion

            #region Classified

            if (itemtype == (uint)OpenMetaverse.GridItemType.Classified)
            {
                if (directoryService == null)
                    return;
                //Get all the classifieds in this region
                Classified[] Classifieds = directoryService.GetClassifiedsInRegion(GR.RegionName);
                foreach (Classified classified in Classifieds)
                {
                    //Get the region so we have its position
                    OpenSim.Services.Interfaces.GridRegion region = m_Scenes[0].GridService.GetRegionByName(UUID.Zero, classified.SimName);
                    
                    mapitem = new mapItemReply();
                    
                    //Use global position plus half the sim so that all classifieds are not in the bottom corner
                    mapitem.x = (uint)(region.RegionLocX + classified.GlobalPos.X + (Constants.RegionSize / 2));
                    mapitem.y = (uint)(region.RegionLocY + classified.GlobalPos.Y + (Constants.RegionSize / 2));
                    
                    mapitem.id = classified.CreatorUUID;
                    mapitem.name = classified.Name;
                    mapitem.Extra = 0;
                    mapitem.Extra2 = 0;
                    mapitems.Add(mapitem);
                }
                //Send the events, if we have any
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            #endregion
        }
        public virtual void HandleMapItemRequest(IClientAPI remoteClient, uint flags,
                                                 uint EstateID, bool godlike, uint itemtype, ulong regionhandle)
        {
            //All the parts are in for this, except for popular places and those are not in as they are not reqested anymore.

            List <mapItemReply> mapitems = new List <mapItemReply>();
            mapItemReply        mapitem  = new mapItemReply();
            uint xstart = 0;
            uint ystart = 0;

            Utils.LongToUInts(remoteClient.Scene.RegionInfo.RegionHandle, out xstart, out ystart);
            GridRegion GR = null;

            GR = regionhandle == 0 ? new GridRegion(remoteClient.Scene.RegionInfo) : m_Scenes[0].GridService.GetRegionByPosition(remoteClient.AllScopeIDs, (int)xstart, (int)ystart);
            if (GR == null)
            {
                //No region???
                return;
            }

            #region Telehub

            if (itemtype == (uint)GridItemType.Telehub)
            {
                IRegionConnector GF = DataManager.DataManager.RequestPlugin <IRegionConnector>();
                if (GF == null)
                {
                    return;
                }

                int tc = Environment.TickCount;
                //Find the telehub
                Telehub telehub = GF.FindTelehub(GR.RegionID, GR.RegionHandle);
                if (telehub != null)
                {
                    mapitem = new mapItemReply
                    {
                        x      = (uint)(GR.RegionLocX + telehub.TelehubLocX),
                        y      = (uint)(GR.RegionLocY + telehub.TelehubLocY),
                        id     = GR.RegionID,
                        name   = Util.Md5Hash(GR.RegionName + tc.ToString()),
                        Extra  = 1,
                        Extra2 = 0
                    };
                    //The position is in GLOBAL coordinates (in meters)
                    //This is how the name is sent, go figure
                    //Not sure, but this is what gets sent

                    mapitems.Add(mapitem);
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            #endregion

            #region Land for sale

            //PG land that is for sale
            if (itemtype == (uint)GridItemType.LandForSale)
            {
                if (directoryService == null)
                {
                    return;
                }
                //Find all the land, use "0" for the flags so we get all land for sale, no price or area checking
                List <DirLandReplyData> Landdata = directoryService.FindLandForSaleInRegion("0", uint.MaxValue, 0, 0, 0, GR.RegionID);

                int locX = 0;
                int locY = 0;
                foreach (DirLandReplyData landDir in Landdata)
                {
                    if (landDir == null)
                    {
                        continue;
                    }
                    LandData landdata = directoryService.GetParcelInfo(landDir.parcelID);
                    if (landdata == null || landdata.Maturity != 0)
                    {
                        continue; //Not a PG land
                    }
#if (!ISWIN)
                    foreach (IScene scene in m_Scenes)
                    {
                        if (scene.RegionInfo.RegionID == landdata.RegionID)
                        {
                            //Global coords, so add the meters
                            locX = scene.RegionInfo.RegionLocX;
                            locY = scene.RegionInfo.RegionLocY;
                        }
                    }
#else
                    foreach (IScene scene in m_Scenes.Where(scene => scene.RegionInfo.RegionID == landdata.RegionID))
                    {
                        //Global coords, so add the meters
                        locX = scene.RegionInfo.RegionLocX;
                        locY = scene.RegionInfo.RegionLocY;
                    }
#endif
                    if (locY == 0 && locX == 0)
                    {
                        //Ask the grid service for the coordinates if the region is not local
                        GridRegion r = m_Scenes[0].GridService.GetRegionByUUID(remoteClient.AllScopeIDs, landdata.RegionID);
                        if (r != null)
                        {
                            locX = r.RegionLocX;
                            locY = r.RegionLocY;
                        }
                    }
                    if (locY == 0 && locX == 0) //Couldn't find the region, don't send
                    {
                        continue;
                    }

                    mapitem = new mapItemReply
                    {
                        x      = (uint)(locX + landdata.UserLocation.X),
                        y      = (uint)(locY + landdata.UserLocation.Y),
                        id     = landDir.parcelID,
                        name   = landDir.name,
                        Extra  = landDir.actualArea,
                        Extra2 = landDir.salePrice
                    };
                    //Global coords, so make sure its in meters
                    mapitems.Add(mapitem);
                }
                //Send all the map items
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            //Adult or mature land that is for sale
            if (itemtype == (uint)GridItemType.AdultLandForSale)
            {
                if (directoryService == null)
                {
                    return;
                }
                //Find all the land, use "0" for the flags so we get all land for sale, no price or area checking
                List <DirLandReplyData> Landdata = directoryService.FindLandForSale("0", uint.MaxValue, 0, 0, 0, remoteClient.ScopeID);

                int locX = 0;
                int locY = 0;
                foreach (DirLandReplyData landDir in Landdata)
                {
                    LandData landdata = directoryService.GetParcelInfo(landDir.parcelID);
                    if (landdata == null || landdata.Maturity == 0)
                    {
                        continue; //Its PG
                    }
#if (!ISWIN)
                    foreach (IScene scene in m_Scenes)
                    {
                        if (scene.RegionInfo.RegionID == landdata.RegionID)
                        {
                            locX = scene.RegionInfo.RegionLocX;
                            locY = scene.RegionInfo.RegionLocY;
                        }
                    }
#else
                    foreach (IScene scene in m_Scenes.Where(scene => scene.RegionInfo.RegionID == landdata.RegionID))
                    {
                        locX = scene.RegionInfo.RegionLocX;
                        locY = scene.RegionInfo.RegionLocY;
                    }
#endif
                    if (locY == 0 && locX == 0)
                    {
                        //Ask the grid service for the coordinates if the region is not local
                        GridRegion r = m_Scenes[0].GridService.GetRegionByUUID(remoteClient.AllScopeIDs, landdata.RegionID);
                        if (r != null)
                        {
                            locX = r.RegionLocX;
                            locY = r.RegionLocY;
                        }
                    }
                    if (locY == 0 && locX == 0) //Couldn't find the region, don't send
                    {
                        continue;
                    }

                    mapitem = new mapItemReply
                    {
                        x      = (uint)(locX + landdata.UserLocation.X),
                        y      = (uint)(locY + landdata.UserLocation.Y),
                        id     = landDir.parcelID,
                        name   = landDir.name,
                        Extra  = landDir.actualArea,
                        Extra2 = landDir.salePrice
                    };
                    //Global coords, so make sure its in meters

                    mapitems.Add(mapitem);
                }
                //Send the results if we have any
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            #endregion

            #region Events

            if (itemtype == (uint)GridItemType.PgEvent ||
                itemtype == (uint)GridItemType.MatureEvent ||
                itemtype == (uint)GridItemType.AdultEvent)
            {
                if (directoryService == null)
                {
                    return;
                }

                //Find the maturity level
                int maturity = itemtype == (uint)GridItemType.PgEvent
                                   ? (int)DirectoryManager.EventFlags.PG
                                   : (itemtype == (uint)GridItemType.MatureEvent)
                                         ? (int)DirectoryManager.EventFlags.Mature
                                         : (int)DirectoryManager.EventFlags.Adult;

                //Gets all the events occuring in the given region by maturity level
                List <DirEventsReplyData> Eventdata = directoryService.FindAllEventsInRegion(GR.RegionName, maturity);

                foreach (DirEventsReplyData eventData in Eventdata)
                {
                    //Get more info on the event
                    EventData eventdata = directoryService.GetEventInfo(eventData.eventID);
                    if (eventdata == null)
                    {
                        continue; //Can't do anything about it
                    }
                    Vector3 globalPos = eventdata.globalPos;
                    mapitem = new mapItemReply
                    {
                        x      = (uint)(globalPos.X + (remoteClient.Scene.RegionInfo.RegionSizeX / 2)),
                        y      = (uint)(globalPos.Y + (remoteClient.Scene.RegionInfo.RegionSizeY / 2)),
                        id     = UUID.Random(),
                        name   = eventData.name,
                        Extra  = (int)eventdata.dateUTC,
                        Extra2 = (int)eventdata.eventID
                    };

                    //Use global position plus half the region so that it doesn't always appear in the bottom corner

                    mapitems.Add(mapitem);
                }
                //Send if we have any
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            #endregion

            #region Classified

            if (itemtype == (uint)GridItemType.Classified)
            {
                if (directoryService == null)
                {
                    return;
                }
                //Get all the classifieds in this region
                List <Classified> Classifieds = directoryService.GetClassifiedsInRegion(GR.RegionName);
                foreach (Classified classified in Classifieds)
                {
                    //Get the region so we have its position
                    GridRegion region = m_Scenes[0].GridService.GetRegionByName(remoteClient.AllScopeIDs, classified.SimName);

                    mapitem = new mapItemReply
                    {
                        x = (uint)
                            (region.RegionLocX + classified.GlobalPos.X +
                             (remoteClient.Scene.RegionInfo.RegionSizeX / 2)),
                        y = (uint)
                            (region.RegionLocY + classified.GlobalPos.Y +
                             (remoteClient.Scene.RegionInfo.RegionSizeY / 2)),
                        id     = classified.CreatorUUID,
                        name   = classified.Name,
                        Extra  = 0,
                        Extra2 = 0
                    };

                    //Use global position plus half the sim so that all classifieds are not in the bottom corner

                    mapitems.Add(mapitem);
                }
                //Send the events, if we have any
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            #endregion
        }
        public virtual void HandleMapItemRequest(IClientAPI remoteClient, uint flags,
                                                 uint EstateID, bool godlike, uint itemtype, ulong regionhandle)
        {
            lock (m_rootAgents)
            {
                if (!m_rootAgents.Contains(remoteClient.AgentId))
                {
                    return;
                }
            }
            uint xstart = 0;
            uint ystart = 0;

            Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out xstart, out ystart);
            if (itemtype == 6) // we only sevice 6 right now (avatar green dots)
            {
                if (regionhandle == 0 || regionhandle == m_scene.RegionInfo.RegionHandle)
                {
                    // Local Map Item Request
                    int tc = Environment.TickCount;
                    List <mapItemReply> mapitems = new List <mapItemReply>();
                    mapItemReply        mapitem  = new mapItemReply();
                    if (m_scene.GetRootAgentCount() <= 1)
                    {
                        mapitem        = new mapItemReply();
                        mapitem.x      = (uint)(xstart + 1);
                        mapitem.y      = (uint)(ystart + 1);
                        mapitem.id     = UUID.Zero;
                        mapitem.name   = Util.Md5Hash(m_scene.RegionInfo.RegionName + tc.ToString());
                        mapitem.Extra  = 0;
                        mapitem.Extra2 = 0;
                        mapitems.Add(mapitem);
                    }
                    else
                    {
                        m_scene.ForEachScenePresence(delegate(ScenePresence sp)
                        {
                            // Don't send a green dot for yourself
                            if (!sp.IsChildAgent && sp.UUID != remoteClient.AgentId)
                            {
                                mapitem        = new mapItemReply();
                                mapitem.x      = (uint)(xstart + sp.AbsolutePosition.X);
                                mapitem.y      = (uint)(ystart + sp.AbsolutePosition.Y);
                                mapitem.id     = UUID.Zero;
                                mapitem.name   = Util.Md5Hash(m_scene.RegionInfo.RegionName + tc.ToString());
                                mapitem.Extra  = 1;
                                mapitem.Extra2 = 0;
                                mapitems.Add(mapitem);
                            }
                        });
                    }
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                }
                else
                {
                    // Remote Map Item Request

                    // ensures that the blockingqueue doesn't get borked if the GetAgents() timing changes.
                    // Note that we only start up a remote mapItem Request thread if there's users who could
                    // be making requests
                    if (!threadrunning)
                    {
                        m_log.Warn("[WORLD MAP]: Starting new remote request thread manually.  This means that AvatarEnteringParcel never fired!  This needs to be fixed!  Don't Mantis this, as the developers can see it in this message");
                        StartThread(new object());
                    }

                    RequestMapItems("", remoteClient.AgentId, flags, EstateID, godlike, itemtype, regionhandle);
                }
            }
        }
Exemple #8
0
/*
 *              //
 *              // Already defined by osprofile
 *              //
 *              public void ClassifiedInfoRequest(UUID queryClassifiedID, IClientAPI remoteClient)
 *              {
 *                      Hashtable ReqHash = new Hashtable();
 *                      ReqHash["classifiedID"] = queryClassifiedID.ToString();
 *
 *                      Hashtable result = GenericXMLRPCRequest(ReqHash, "classifieds_info_query");
 *
 *                      if (!Convert.ToBoolean(result["success"]))
 *                      {
 *                              remoteClient.SendAgentAlertMessage(result["errorMessage"].ToString(), false);
 *                              return;
 *                      }
 *
 *                      ArrayList dataArray = (ArrayList)result["data"];
 *                      if (dataArray.Count == 0)
 *                      {
 *                              // something bad happened here, if we could return an
 *                              // event after the search,
 *                              // we should be able to find it here
 *                              // TODO do some (more) sensible error-handling here
 *                              remoteClient.SendAgentAlertMessage("Couldn't find this classifieds.", false);
 *                              return;
 *                      }
 *
 *                      Hashtable d = (Hashtable)dataArray[0];
 *
 *                      Vector3 globalPos = new Vector3();
 *                      Vector3.TryParse(d["posglobal"].ToString(), out globalPos);
 *
 *                      if (d["name"]==null)        d["name"] = String.Empty;
 *                      if (d["description"]==null) d["description"] = String.Empty;
 *                      if (d["parcelname"]==null)	d["parcelname"] = String.Empty;
 *
 *                      string name = d["name"].ToString();
 *                      string desc = d["description"].ToString();
 *                      if (Enc!=null) {
 *                              name = Enc.GetString(Convert.FromBase64String(name));
 *                              desc = Enc.GetString(Convert.FromBase64String(desc));
 *                      }
 *
 *                      remoteClient.SendClassifiedInfoReply(
 *                                      new UUID(d["classifieduuid"].ToString()),
 *                                      new UUID(d["creatoruuid"].ToString()),
 *                                      Convert.ToUInt32(d["creationdate"]),
 *                                      Convert.ToUInt32(d["expirationdate"]),
 *                                      Convert.ToUInt32(d["category"]),
 *                                      name,
 *                                      desc,
 *                                      new UUID(d["parceluuid"].ToString()),
 *                                      Convert.ToUInt32(d["parentestate"]),
 *                                      new UUID(d["snapshotuuid"].ToString()),
 *                                      d["simname"].ToString(),
 *                                      globalPos,
 *                                      d["parcelname"].ToString(),
 *                                      Convert.ToByte(d["classifiedflags"]),
 *                                      Convert.ToInt32(d["priceforlisting"]));
 *              }
 */



        public void HandleMapItemRequest(IClientAPI remoteClient, uint flags, uint EstateID, bool godlike, uint itemtype, ulong regionhandle)
        {
            //The following constant appears to be from GridLayerType enum
            //defined in OpenMetaverse/GridManager.cs of libopenmetaverse.
            if (itemtype == 7)             //(land sales)
            {
                int       tc      = Environment.TickCount;
                Hashtable ReqHash = new Hashtable();

                //m_log.Info("[OPEN SEARCH MODULE] HandleMapItemRequest Start");

                //The flags are: SortAsc (1 << 15), PerMeterSort (1 << 17)
                ReqHash["flags"]       = "163840";
                ReqHash["type"]        = "4294967295";                          //This is -1 in 32 bits
                ReqHash["price"]       = "0";
                ReqHash["area"]        = "0";
                ReqHash["query_start"] = "0";

                Hashtable result = GenericXMLRPCRequest(ReqHash, "dir_land_query");

                if (!Convert.ToBoolean(result["success"]))
                {
                    remoteClient.SendAgentAlertMessage(result["errorMessage"].ToString(), false);
                    return;
                }

                ArrayList dataArray = (ArrayList)result["data"];

                int count = dataArray.Count;
                if (count > 100)
                {
                    count = 101;
                }

                DirLandReplyData[] Landdata = new DirLandReplyData[count];

                int      i = 0;
                string[] ParcelLandingPoint = new string[count];
                string[] ParcelRegionUUID   = new string[count];

                foreach (Object o in dataArray)
                {
                    Hashtable d = (Hashtable)o;

                    if (d["name"] == null)
                    {
                        continue;
                    }
                    string name = d["name"].ToString();
                    if (Enc != null)
                    {
                        name = Enc.GetString(Convert.FromBase64String(name));
                    }

                    Landdata[i]            = new DirLandReplyData();
                    Landdata[i].parcelID   = new UUID(d["parcel_id"].ToString());
                    Landdata[i].name       = name;
                    Landdata[i].auction    = Convert.ToBoolean(d["auction"]);
                    Landdata[i].forSale    = Convert.ToBoolean(d["for_sale"]);
                    Landdata[i].salePrice  = Convert.ToInt32(d["sale_price"]);
                    Landdata[i].actualArea = Convert.ToInt32(d["area"]);
                    ParcelLandingPoint[i]  = d["landing_point"].ToString();
                    ParcelRegionUUID[i]    = d["region_UUID"].ToString();
                    i++;
                    if (i >= count)
                    {
                        break;
                    }
                }

                i = 0;
                uint locX = 0;
                uint locY = 0;

                List <mapItemReply> mapitems = new List <mapItemReply>();

                foreach (DirLandReplyData landDir in Landdata)
                {
                    foreach (Scene scene in m_Scenes)
                    {
                        if (scene.RegionInfo.RegionID.ToString() == ParcelRegionUUID[i])
                        {
                            locX = scene.RegionInfo.RegionLocX;
                            locY = scene.RegionInfo.RegionLocY;
                        }
                    }
                    string[]     landingpoint = ParcelLandingPoint[i].Split('/');
                    mapItemReply mapitem      = new mapItemReply();
                    mapitem.x      = (uint)(locX + Convert.ToDecimal(landingpoint[0]));
                    mapitem.y      = (uint)(locY + Convert.ToDecimal(landingpoint[1]));
                    mapitem.id     = landDir.parcelID;
                    mapitem.name   = landDir.name;
                    mapitem.Extra  = landDir.actualArea;
                    mapitem.Extra2 = landDir.salePrice;
                    mapitems.Add(mapitem);
                    i++;
                }
                remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                mapitems.Clear();
            }
        }
Exemple #9
0
        public virtual void HandleMapItemRequest(IClientAPI remoteClient, uint flags,
            uint EstateID, bool godlike, uint itemtype, ulong regionhandle)
        {
            if (remoteClient.Scene.GetScenePresence (remoteClient.AgentId).IsChildAgent)
                return;//No child agent requests

            uint xstart = 0;
            uint ystart = 0;
            OpenMetaverse.Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out xstart, out ystart);
            
            List<mapItemReply> mapitems = new List<mapItemReply>();
            int tc = Environment.TickCount;
            if (itemtype == (int)OpenMetaverse.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 = new mapItemReply();
                    IEntityCountModule entityCountModule = m_scene.RequestModuleInterface<IEntityCountModule>();
                    if (entityCountModule != null && entityCountModule.RootAgents <= 1)
                    {
                        mapitem = new mapItemReply();
                        mapitem.x = (uint)(xstart + 1);
                        mapitem.y = (uint)(ystart + 1);
                        mapitem.id = UUID.Zero;
                        mapitem.name = Util.Md5Hash(m_scene.RegionInfo.RegionName + tc.ToString());
                        mapitem.Extra = 0;
                        mapitem.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();
                            mapitem.x = (uint)(xstart + sp.AbsolutePosition.X);
                            mapitem.y = (uint)(ystart + sp.AbsolutePosition.Y);
                            mapitem.id = UUID.Zero;
                            mapitem.name = Util.Md5Hash(m_scene.RegionInfo.RegionName + tc.ToString());
                            mapitem.Extra = 1;
                            mapitem.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 virtual void HandleMapItemRequest(IClientAPI remoteClient, uint flags,
                                                 uint EstateID, bool godlike, uint itemtype, ulong regionhandle)
        {
            //All the parts are in for this, except for popular places and those are not in as they are not reqested anymore.

            List<mapItemReply> mapitems = new List<mapItemReply>();
            mapItemReply mapitem = new mapItemReply();
            uint xstart = 0;
            uint ystart = 0;
            OpenMetaverse.Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out xstart, out ystart);
            OpenSim.Services.Interfaces.GridRegion GR = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)xstart, (int)ystart);

            #region Telehub
            if (itemtype == (uint)OpenMetaverse.GridItemType.Telehub)
            {
                IRegionConnector GF = DataManager.DataManager.RequestPlugin<IRegionConnector>();
                if (GF == null)
                    return;
                int tc = Environment.TickCount;
                Telehub telehub = GF.FindTelehub(GR.RegionID);
                if (telehub != null)
                {
                    mapitem = new mapItemReply();
                    mapitem.x = (uint)(GR.RegionLocX + telehub.TelehubLocX);
                    mapitem.y = (uint)(GR.RegionLocY + telehub.TelehubLocY);
                    mapitem.id = GR.RegionID;
                    mapitem.name = Util.Md5Hash(GR.RegionName + tc.ToString());
                    mapitem.Extra = 1;
                    mapitem.Extra2 = 0;
                    mapitems.Add(mapitem);
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            #endregion

            #region Land for sale

            if (itemtype == (uint)OpenMetaverse.GridItemType.LandForSale)
            {
                if (DSC == null)
                    return;
                DirLandReplyData[] Landdata = DSC.FindLandForSale("4294967295", int.MaxValue.ToString(), "0", 0, (uint)DirectoryManager.DirFindFlags.IncludePG);
                
                uint locX = 0;
                uint locY = 0;
                foreach (DirLandReplyData landDir in Landdata)
                {
                    LandData landdata = DSC.GetParcelInfo(landDir.parcelID);
                    if (landdata.Maturity != 0)
                    {
                        continue;
                    }
                    foreach (Scene scene in m_Scenes)
                    {
                        if (scene.RegionInfo.RegionID == landdata.RegionID)
                        {
                            locX = scene.RegionInfo.RegionLocX;
                            locY = scene.RegionInfo.RegionLocY;
                        }
                    }
                    if (locY == 0 && locX == 0)
                        continue;
                    mapitem = new mapItemReply();
                    mapitem.x = (uint)(locX + landdata.UserLocation.X);
                    mapitem.y = (uint)(locY + landdata.UserLocation.Y);
                    mapitem.id = landDir.parcelID;
                    mapitem.name = landDir.name;
                    mapitem.Extra = landDir.actualArea;
                    mapitem.Extra2 = landDir.salePrice;
                    mapitems.Add(mapitem);
                }
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            if (itemtype == (uint)OpenMetaverse.GridItemType.AdultLandForSale)
            {
                if (DSC == null)
                    return;
                DirLandReplyData[] Landdata = DSC.FindLandForSale("4294967295", int.MaxValue.ToString(), "0",0, 0);
                
                uint locX = 0;
                uint locY = 0;
                foreach (DirLandReplyData landDir in Landdata)
                {
                    LandData landdata = DSC.GetParcelInfo(landDir.parcelID);
                    if (landdata.Maturity == 0)
                    {
                        continue;
                    }
                    foreach (Scene scene in m_Scenes)
                    {
                        if (scene.RegionInfo.RegionID == landdata.RegionID)
                        {
                            locX = scene.RegionInfo.RegionLocX;
                            locY = scene.RegionInfo.RegionLocY;
                        }
                    }
                    if (locY == 0 && locX == 0)
                        continue;
                    mapitem = new mapItemReply();
                    mapitem.x = (uint)(locX + landdata.UserLocation.X);
                    mapitem.y = (uint)(locY + landdata.UserLocation.Y);
                    mapitem.id = landDir.parcelID;
                    mapitem.name = landDir.name;
                    mapitem.Extra = landDir.actualArea;
                    mapitem.Extra2 = landDir.salePrice;
                    mapitems.Add(mapitem);
                }
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            #endregion

            #region Events

            if (itemtype == (uint)OpenMetaverse.GridItemType.PgEvent)
            {
                if (DSC == null)
                    return;
                DirEventsReplyData[] Eventdata = DSC.FindAllEventsInRegion(GR.RegionName);
                foreach (DirEventsReplyData eventData in Eventdata)
                {
                    EventData eventdata = DSC.GetEventInfo(eventData.eventID.ToString());

                    string RegionName = eventdata.simName;
                    Vector3 globalPos = eventdata.globalPos;
                    int Mature = eventdata.maturity;
                    if (Mature != 0)
                        continue;
                    OpenSim.Services.Interfaces.GridRegion region = m_scene.GridService.GetRegionByName(UUID.Zero, RegionName);
                    mapitem = new mapItemReply();
                    mapitem.x = (uint)globalPos.X;
                    mapitem.y = (uint)globalPos.Y;
                    mapitem.id = UUID.Random();
                    mapitem.name = eventData.name;
                    mapitem.Extra = (int)eventdata.dateUTC;
                    mapitem.Extra2 = (int)eventdata.eventID;//(int)DirectoryManager.EventFlags.PG;
                    mapitems.Add(mapitem);
                }
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            if (itemtype == (uint)OpenMetaverse.GridItemType.AdultEvent)
            {
                if (DSC == null)
                    return;
                DirEventsReplyData[] Eventdata = DSC.FindAllEventsInRegion(GR.RegionName);
                foreach (DirEventsReplyData eventData in Eventdata)
                {
                    EventData eventdata = DSC.GetEventInfo(eventData.eventID.ToString());

                    string RegionName = eventdata.simName;
                    Vector3 globalPos = eventdata.globalPos;
                    int Mature = eventdata.maturity;
                    if (Mature != 2)
                        continue;
                    OpenSim.Services.Interfaces.GridRegion region = m_scene.GridService.GetRegionByName(UUID.Zero, RegionName);
                    mapitem = new mapItemReply();
                    mapitem.x = (uint)globalPos.X;
                    mapitem.y = (uint)globalPos.Y;
                    mapitem.id = UUID.Random();
                    mapitem.name = eventData.name;
                    mapitem.Extra = (int)eventdata.dateUTC;
                    mapitem.Extra2 = (int)eventdata.eventID;//(int)DirectoryManager.EventFlags.PG;
                    mapitems.Add(mapitem);
                }
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }
            if (itemtype == (uint)OpenMetaverse.GridItemType.MatureEvent)
            {
                if (DSC == null)
                    return;
                DirEventsReplyData[] Eventdata = DSC.FindAllEventsInRegion(GR.RegionName);
                foreach (DirEventsReplyData eventData in Eventdata)
                {
                    EventData eventdata = DSC.GetEventInfo(eventData.eventID.ToString());

                    string RegionName = eventdata.simName;
                    Vector3 globalPos = eventdata.globalPos;
                    int Mature = eventdata.maturity;
                    if (Mature != 1)
                        continue;
                    OpenSim.Services.Interfaces.GridRegion region = m_scene.GridService.GetRegionByName(UUID.Zero, RegionName);
                    mapitem = new mapItemReply();
                    mapitem.x = (uint)globalPos.X;
                    mapitem.y = (uint)globalPos.Y;
                    mapitem.id = UUID.Random();
                    mapitem.name = eventData.name;
                    mapitem.Extra = (int)eventdata.dateUTC;
                    mapitem.Extra2 = (int)eventdata.eventID;//(int)DirectoryManager.EventFlags.PG;
                    mapitems.Add(mapitem);
                }
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            #endregion

            #region Classified

            if (itemtype == (uint)OpenMetaverse.GridItemType.Classified)
            {
                if (DSC == null)
                    return;
                Classified[] Classifieds = DSC.GetClassifiedsInRegion(GR.RegionName);
                foreach (Classified classified in Classifieds)
                {
                    OpenSim.Services.Interfaces.GridRegion region = m_scene.GridService.GetRegionByName(UUID.Zero, classified.SimName);
                    mapitem = new mapItemReply();
                    mapitem.x = (uint)(region.RegionLocX + classified.GlobalPos.X);
                    mapitem.y = (uint)(region.RegionLocY + classified.GlobalPos.Y);
                    mapitem.id = new UUID(classified.CreatorUUID);
                    mapitem.name = classified.Name;
                    mapitem.Extra = 0;
                    mapitem.Extra2 = 0;
                    mapitems.Add(mapitem);
                }
                if (mapitems.Count != 0)
                {
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                    mapitems.Clear();
                }
            }

            #endregion
        }
Exemple #11
0
        public void HandleMapItemRequest(IClientAPI remoteClient, uint flags,
                                         uint EstateID, bool godlike, uint itemtype, ulong regionhandle)
        {
            if (itemtype == 7)             //(land sales)
            {
                int       tc      = Environment.TickCount;
                Hashtable ReqHash = new Hashtable();
                ReqHash["flags"]       = "163840";
                ReqHash["type"]        = "4294967295 ";
                ReqHash["price"]       = "0";
                ReqHash["area"]        = "0";
                ReqHash["query_start"] = "0";

                Hashtable result = GenericXMLRPCRequest(ReqHash,
                                                        "dir_land_query");

                if (!Convert.ToBoolean(result["success"]))
                {
                    remoteClient.SendAgentAlertMessage(
                        result["errorMessage"].ToString(), false);
                    return;
                }

                ArrayList dataArray = (ArrayList)result["data"];

                int count = dataArray.Count;
                if (count > 100)
                {
                    count = 101;
                }

                DirLandReplyData[] Landdata = new DirLandReplyData[count];

                int           i = 0;
                List <string> ParcelLandingPoint = new List <string>();
                List <string> ParcelRegionUUID   = new List <string>();
                foreach (Object o in dataArray)
                {
                    Hashtable d = (Hashtable)o;

                    if (d["name"] == null)
                    {
                        continue;
                    }
                    Landdata[i]            = new DirLandReplyData();
                    Landdata[i].parcelID   = new UUID(d["parcel_id"].ToString());
                    Landdata[i].name       = d["name"].ToString();
                    Landdata[i].auction    = Convert.ToBoolean(d["auction"]);
                    Landdata[i].forSale    = Convert.ToBoolean(d["for_sale"]);
                    Landdata[i].salePrice  = Convert.ToInt32(d["sale_price"]);
                    Landdata[i].actualArea = Convert.ToInt32(d["area"]);
                    ParcelLandingPoint[i]  = d["landing_point"].ToString();
                    ParcelRegionUUID[i]    = d["region_UUID"].ToString();
                    i++;
                    if (i >= count)
                    {
                        break;
                    }
                }
                i = 0;
                uint locX = 0;
                uint locY = 0;

                List <mapItemReply> mapitems = new List <mapItemReply>();

                foreach (DirLandReplyData landDir in Landdata)
                {
                    foreach (Scene scene in m_Scenes)
                    {
                        if (scene.RegionInfo.RegionID.ToString() == ParcelRegionUUID[i])
                        {
                            locX = scene.RegionInfo.RegionLocX;
                            locY = scene.RegionInfo.RegionLocY;
                        }
                    }
                    string[]     landingpoint = ParcelLandingPoint[i].Split('/');
                    mapItemReply mapitem      = new mapItemReply();
                    mapitem.x      = (uint)(locX + Convert.ToDecimal(landingpoint[0]));
                    mapitem.y      = (uint)(locY + Convert.ToDecimal(landingpoint[1]));
                    mapitem.id     = landDir.parcelID;
                    mapitem.name   = landDir.name;
                    mapitem.Extra  = landDir.actualArea;
                    mapitem.Extra2 = landDir.salePrice;
                    mapitems.Add(mapitem);
                    i++;
                }
                remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                mapitems.Clear();
            }
        }
        public virtual void HandleMapItemRequest(IClientAPI remoteClient, uint flags,
                                                 uint EstateID, bool godlike, uint itemtype, ulong regionhandle)
        {
            lock (m_rootAgents)
            {
                if (!m_rootAgents.Contains(remoteClient.AgentId))
                {
                    return;
                }
            }
            uint xstart = 0;
            uint ystart = 0;

            Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out xstart, out ystart);
            if (itemtype == 6) // we only sevice 6 right now (avatar green dots)
            {
                if (regionhandle == 0 || regionhandle == m_scene.RegionInfo.RegionHandle)
                {
                    // Local Map Item Request
                    List <ScenePresence> avatars = m_scene.GetAvatars();
                    int tc = Environment.TickCount;
                    List <mapItemReply> mapitems = new List <mapItemReply>();
                    mapItemReply        mapitem  = new mapItemReply();
                    if (avatars.Count == 0 || avatars.Count == 1)
                    {
                        mapitem        = new mapItemReply();
                        mapitem.x      = (uint)(xstart + 1);
                        mapitem.y      = (uint)(ystart + 1);
                        mapitem.id     = UUID.Zero;
                        mapitem.name   = Util.Md5Hash(m_scene.RegionInfo.RegionName + tc.ToString());
                        mapitem.Extra  = 0;
                        mapitem.Extra2 = 0;
                        mapitems.Add(mapitem);
                    }
                    else
                    {
                        foreach (ScenePresence avatar in avatars)
                        {
                            // Don't send a green dot for yourself
                            Vector3 avpos;
                            if ((avatar.UUID != remoteClient.AgentId) && avatar.HasSafePosition(out avpos))
                            {
                                mapitem        = new mapItemReply();
                                mapitem.x      = (uint)(xstart + avpos.X);
                                mapitem.y      = (uint)(ystart + avpos.Y);
                                mapitem.id     = UUID.Zero;
                                mapitem.name   = Util.Md5Hash(m_scene.RegionInfo.RegionName + tc.ToString());
                                mapitem.Extra  = 1;
                                mapitem.Extra2 = 0;
                                mapitems.Add(mapitem);
                            }
                        }
                    }
                    remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags);
                }
                else
                {
                    RequestMapItems("", remoteClient.AgentId, flags, EstateID, godlike, itemtype, regionhandle);
                }
            }
        }
Exemple #13
0
        /// <summary>
        ///   Get all agent locations for the given region
        /// </summary>
        /// <param name = "X"></param>
        /// <param name = "Y"></param>
        /// <param name = "regionHandle"></param>
        /// <returns></returns>
        private List <mapItemReply> GetItems(int X, int Y, ulong regionHandle)
        {
            GridRegion region = GetRegionByPosition(UUID.Zero, X, Y);

            //if the region is down or doesn't exist, don't check it
            if (region == null || region.Access == (byte)SimAccess.Down ||
                region.Access == (byte)SimAccess.NonExistent)
            {
                return(new List <mapItemReply>());
            }

            ICapsService capsService = m_registryCore.RequestModuleInterface <ICapsService>();

            if (capsService == null)
            {
                return(new List <mapItemReply>());
            }

            IRegionCapsService regionCaps = capsService.GetCapsForRegion(regionHandle);

            if (regionCaps == null)
            {
                return(new List <mapItemReply>());
            }

            Dictionary <Vector3, int> Positions = new Dictionary <Vector3, int>();

            //Get a list of all the clients in the region and add them
            foreach (IRegionClientCapsService clientCaps in regionCaps.GetClients())
            {
                //Only root agents!
                if (clientCaps.RootAgent)
                {
                    //Normalize the positions to 5 meter blocks so that agents stack instead of cover up each other
                    Vector3 position = new Vector3(NormalizePosition(clientCaps.LastPosition.X),
                                                   NormalizePosition(clientCaps.LastPosition.Y), 0);
                    int Number = 0;
                    //Find the number of agents currently at this position
                    if (!Positions.TryGetValue(position, out Number))
                    {
                        Number = 0;
                    }
                    Number++;
                    Positions[position] = Number;
                }
            }
            //Build the mapItemReply blocks
#if (!ISWIN)
            List <mapItemReply> mapItems = new List <mapItemReply>();
            foreach (KeyValuePair <Vector3, int> kvp in Positions)
            {
                mapItems.Add(new mapItemReply
                {
                    x =
                        (uint)
                        (region.RegionLocX + kvp.Key.X),
                    y =
                        (uint)
                        (region.RegionLocY + kvp.Key.Y),
                    id   = UUID.Zero,
                    name =
                        Util.Md5Hash(region.RegionName +
                                     Environment.TickCount.
                                     ToString()),
                    Extra  = kvp.Value,
                    Extra2 = 0
                });
            }
#else
            List <mapItemReply> mapItems = Positions.Select(position => new mapItemReply
            {
                x =
                    (uint)
                    (region.RegionLocX + position.Key.X),
                y =
                    (uint)
                    (region.RegionLocY + position.Key.Y),
                id   = UUID.Zero,
                name =
                    Util.Md5Hash(region.RegionName +
                                 Environment.TickCount.
                                 ToString()),
                Extra  = position.Value,
                Extra2 = 0
            }).ToList();
#endif

            //If there are no agents, we send one blank one to the client
            if (mapItems.Count == 0)
            {
                mapItemReply mapitem = new mapItemReply
                {
                    x      = (uint)(region.RegionLocX + 1),
                    y      = (uint)(region.RegionLocY + 1),
                    id     = UUID.Zero,
                    name   = Util.Md5Hash(region.RegionName + Environment.TickCount.ToString()),
                    Extra  = 0,
                    Extra2 = 0
                };
                mapItems.Add(mapitem);
            }
            return(mapItems);
        }