/// <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); } } } } }
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); } } } }
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); } } }
/* * // * // 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(); } }
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 }
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); } } }
/// <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); }