diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs')
-rw-r--r-- | OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs | 258 |
1 files changed, 158 insertions, 100 deletions
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index 03e044b..a3b0f39 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs | |||
@@ -59,8 +59,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
59 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "WorldMapModule")] | 59 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "WorldMapModule")] |
60 | public class WorldMapModule : INonSharedRegionModule, IWorldMapModule | 60 | public class WorldMapModule : INonSharedRegionModule, IWorldMapModule |
61 | { | 61 | { |
62 | private static readonly ILog m_log = | 62 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
63 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 63 | private static string LogHeader = "[WORLD MAP]"; |
64 | 64 | ||
65 | private static readonly string DEFAULT_WORLD_MAP_EXPORT_PATH = "exportmap.jpg"; | 65 | private static readonly string DEFAULT_WORLD_MAP_EXPORT_PATH = "exportmap.jpg"; |
66 | private static readonly UUID STOP_UUID = UUID.Random(); | 66 | private static readonly UUID STOP_UUID = UUID.Random(); |
@@ -282,15 +282,15 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
282 | { | 282 | { |
283 | List<MapBlockData> mapBlocks = new List<MapBlockData>(); ; | 283 | List<MapBlockData> mapBlocks = new List<MapBlockData>(); ; |
284 | 284 | ||
285 | // Get regions that are within 8 regions of here | ||
285 | List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID, | 286 | List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID, |
286 | (int)(m_scene.RegionInfo.RegionLocX - 8) * (int)Constants.RegionSize, | 287 | (int)Util.RegionToWorldLoc(m_scene.RegionInfo.RegionLocX - 8), |
287 | (int)(m_scene.RegionInfo.RegionLocX + 8) * (int)Constants.RegionSize, | 288 | (int)Util.RegionToWorldLoc(m_scene.RegionInfo.RegionLocX + 8), |
288 | (int)(m_scene.RegionInfo.RegionLocY - 8) * (int)Constants.RegionSize, | 289 | (int)Util.RegionToWorldLoc(m_scene.RegionInfo.RegionLocY - 8), |
289 | (int)(m_scene.RegionInfo.RegionLocY + 8) * (int)Constants.RegionSize); | 290 | (int)Util.RegionToWorldLoc(m_scene.RegionInfo.RegionLocY + 8) ); |
290 | foreach (GridRegion r in regions) | 291 | foreach (GridRegion r in regions) |
291 | { | 292 | { |
292 | MapBlockData block = new MapBlockData(); | 293 | MapBlockData block = MapBlockFromGridRegion(r, 0); |
293 | MapBlockFromGridRegion(block, r, 0); | ||
294 | mapBlocks.Add(block); | 294 | mapBlocks.Add(block); |
295 | } | 295 | } |
296 | avatarPresence.ControllingClient.SendMapBlock(mapBlocks, 0); | 296 | avatarPresence.ControllingClient.SendMapBlock(mapBlocks, 0); |
@@ -410,24 +410,23 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
410 | } | 410 | } |
411 | uint xstart = 0; | 411 | uint xstart = 0; |
412 | uint ystart = 0; | 412 | uint ystart = 0; |
413 | Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out xstart, out ystart); | 413 | Util.RegionHandleToWorldLoc(m_scene.RegionInfo.RegionHandle, out xstart, out ystart); |
414 | if (itemtype == 6) // Service 6 right now (MAP_ITEM_AGENTS_LOCATION; green dots) | 414 | if (itemtype == (int)GridItemType.AgentLocations) |
415 | { | 415 | { |
416 | if (regionhandle == 0 || regionhandle == m_scene.RegionInfo.RegionHandle) | 416 | if (regionhandle == 0 || regionhandle == m_scene.RegionInfo.RegionHandle) |
417 | { | 417 | { |
418 | // Local Map Item Request | 418 | // Just requesting map info about the current, local region |
419 | int tc = Environment.TickCount; | 419 | int tc = Environment.TickCount; |
420 | List<mapItemReply> mapitems = new List<mapItemReply>(); | 420 | List<mapItemReply> mapitems = new List<mapItemReply>(); |
421 | mapItemReply mapitem = new mapItemReply(); | 421 | mapItemReply mapitem = new mapItemReply(); |
422 | if (m_scene.GetRootAgentCount() <= 1) | 422 | if (m_scene.GetRootAgentCount() <= 1) |
423 | { | 423 | { |
424 | mapitem = new mapItemReply(); | 424 | mapitem = new mapItemReply( |
425 | mapitem.x = (uint)(xstart + 1); | 425 | xstart + 1, |
426 | mapitem.y = (uint)(ystart + 1); | 426 | ystart + 1, |
427 | mapitem.id = UUID.Zero; | 427 | UUID.Zero, |
428 | mapitem.name = Util.Md5Hash(m_scene.RegionInfo.RegionName + tc.ToString()); | 428 | Util.Md5Hash(m_scene.RegionInfo.RegionName + tc.ToString()), |
429 | mapitem.Extra = 0; | 429 | 0, 0); |
430 | mapitem.Extra2 = 0; | ||
431 | mapitems.Add(mapitem); | 430 | mapitems.Add(mapitem); |
432 | } | 431 | } |
433 | else | 432 | else |
@@ -437,13 +436,12 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
437 | // Don't send a green dot for yourself | 436 | // Don't send a green dot for yourself |
438 | if (sp.UUID != remoteClient.AgentId) | 437 | if (sp.UUID != remoteClient.AgentId) |
439 | { | 438 | { |
440 | mapitem = new mapItemReply(); | 439 | mapitem = new mapItemReply( |
441 | mapitem.x = (uint)(xstart + sp.AbsolutePosition.X); | 440 | xstart + (uint)sp.AbsolutePosition.X, |
442 | mapitem.y = (uint)(ystart + sp.AbsolutePosition.Y); | 441 | ystart + (uint)sp.AbsolutePosition.Y, |
443 | mapitem.id = UUID.Zero; | 442 | UUID.Zero, |
444 | mapitem.name = Util.Md5Hash(m_scene.RegionInfo.RegionName + tc.ToString()); | 443 | Util.Md5Hash(m_scene.RegionInfo.RegionName + tc.ToString()), |
445 | mapitem.Extra = 1; | 444 | 1, 0); |
446 | mapitem.Extra2 = 0; | ||
447 | mapitems.Add(mapitem); | 445 | mapitems.Add(mapitem); |
448 | } | 446 | } |
449 | }); | 447 | }); |
@@ -458,7 +456,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
458 | RequestMapItems("",remoteClient.AgentId,flags,EstateID,godlike,itemtype,regionhandle); | 456 | RequestMapItems("",remoteClient.AgentId,flags,EstateID,godlike,itemtype,regionhandle); |
459 | } | 457 | } |
460 | } | 458 | } |
461 | else if (itemtype == 7) // Service 7 (MAP_ITEM_LAND_FOR_SALE) | 459 | else if (itemtype == (int)GridItemType.LandForSale) // Service 7 (MAP_ITEM_LAND_FOR_SALE) |
462 | { | 460 | { |
463 | if (regionhandle == 0 || regionhandle == m_scene.RegionInfo.RegionHandle) | 461 | if (regionhandle == 0 || regionhandle == m_scene.RegionInfo.RegionHandle) |
464 | { | 462 | { |
@@ -488,14 +486,14 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
488 | float x = (min.X+max.X)/2; | 486 | float x = (min.X+max.X)/2; |
489 | float y = (min.Y+max.Y)/2; | 487 | float y = (min.Y+max.Y)/2; |
490 | 488 | ||
491 | mapitem = new mapItemReply(); | 489 | mapitem = new mapItemReply( |
492 | mapitem.x = (uint)(xstart + x); | 490 | xstart + (uint)x, |
493 | mapitem.y = (uint)(ystart + y); | 491 | ystart + (uint)y, |
494 | // mapitem.z = (uint)m_scene.GetGroundHeight(x,y); | 492 | parcel.GlobalID, |
495 | mapitem.id = parcel.GlobalID; | 493 | parcel.Name, |
496 | mapitem.name = parcel.Name; | 494 | parcel.Area, |
497 | mapitem.Extra = parcel.Area; | 495 | parcel.SalePrice |
498 | mapitem.Extra2 = parcel.SalePrice; | 496 | ); |
499 | mapitems.Add(mapitem); | 497 | mapitems.Add(mapitem); |
500 | } | 498 | } |
501 | } | 499 | } |
@@ -510,7 +508,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
510 | RequestMapItems("",remoteClient.AgentId,flags,EstateID,godlike,itemtype,regionhandle); | 508 | RequestMapItems("",remoteClient.AgentId,flags,EstateID,godlike,itemtype,regionhandle); |
511 | } | 509 | } |
512 | } | 510 | } |
513 | else if (itemtype == 1) // Service 1 (MAP_ITEM_TELEHUB) | 511 | else if (itemtype == (int)GridItemType.Telehub) // Service 1 (MAP_ITEM_TELEHUB) |
514 | { | 512 | { |
515 | if (regionhandle == 0 || regionhandle == m_scene.RegionInfo.RegionHandle) | 513 | if (regionhandle == 0 || regionhandle == m_scene.RegionInfo.RegionHandle) |
516 | { | 514 | { |
@@ -520,13 +518,14 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
520 | SceneObjectGroup sog = m_scene.GetSceneObjectGroup(m_scene.RegionInfo.RegionSettings.TelehubObject); | 518 | SceneObjectGroup sog = m_scene.GetSceneObjectGroup(m_scene.RegionInfo.RegionSettings.TelehubObject); |
521 | if (sog != null) | 519 | if (sog != null) |
522 | { | 520 | { |
523 | mapitem = new mapItemReply(); | 521 | mapitem = new mapItemReply( |
524 | mapitem.x = (uint)(xstart + sog.AbsolutePosition.X); | 522 | xstart + (uint)sog.AbsolutePosition.X, |
525 | mapitem.y = (uint)(ystart + sog.AbsolutePosition.Y); | 523 | ystart + (uint)sog.AbsolutePosition.Y, |
526 | mapitem.id = UUID.Zero; | 524 | UUID.Zero, |
527 | mapitem.name = sog.Name; | 525 | sog.Name, |
528 | mapitem.Extra = 0; // color (not used) | 526 | 0, // color (not used) |
529 | mapitem.Extra2 = 0; // 0 = telehub / 1 = infohub | 527 | 0 // 0 = telehub / 1 = infohub |
528 | ); | ||
530 | mapitems.Add(mapitem); | 529 | mapitems.Add(mapitem); |
531 | 530 | ||
532 | remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags); | 531 | remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags); |
@@ -676,19 +675,14 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
676 | { | 675 | { |
677 | OSDMap mapitem = (OSDMap)itemarray[i]; | 676 | OSDMap mapitem = (OSDMap)itemarray[i]; |
678 | mapItemReply mi = new mapItemReply(); | 677 | mapItemReply mi = new mapItemReply(); |
679 | mi.x = (uint)mapitem["X"].AsInteger(); | 678 | mi.FromOSD(mapitem); |
680 | mi.y = (uint)mapitem["Y"].AsInteger(); | ||
681 | mi.id = mapitem["ID"].AsUUID(); | ||
682 | mi.Extra = mapitem["Extra"].AsInteger(); | ||
683 | mi.Extra2 = mapitem["Extra2"].AsInteger(); | ||
684 | mi.name = mapitem["Name"].AsString(); | ||
685 | returnitems.Add(mi); | 679 | returnitems.Add(mi); |
686 | } | 680 | } |
687 | av.ControllingClient.SendMapItemReply(returnitems.ToArray(), mrs.itemtype, mrs.flags); | 681 | av.ControllingClient.SendMapItemReply(returnitems.ToArray(), mrs.itemtype, mrs.flags); |
688 | } | 682 | } |
689 | 683 | ||
690 | // Service 7 (MAP_ITEM_LAND_FOR_SALE) | 684 | // Service 7 (MAP_ITEM_LAND_FOR_SALE) |
691 | uint itemtype = 7; | 685 | uint itemtype = (uint)GridItemType.LandForSale; |
692 | 686 | ||
693 | if (response.ContainsKey(itemtype.ToString())) | 687 | if (response.ContainsKey(itemtype.ToString())) |
694 | { | 688 | { |
@@ -698,19 +692,14 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
698 | { | 692 | { |
699 | OSDMap mapitem = (OSDMap)itemarray[i]; | 693 | OSDMap mapitem = (OSDMap)itemarray[i]; |
700 | mapItemReply mi = new mapItemReply(); | 694 | mapItemReply mi = new mapItemReply(); |
701 | mi.x = (uint)mapitem["X"].AsInteger(); | 695 | mi.FromOSD(mapitem); |
702 | mi.y = (uint)mapitem["Y"].AsInteger(); | ||
703 | mi.id = mapitem["ID"].AsUUID(); | ||
704 | mi.Extra = mapitem["Extra"].AsInteger(); | ||
705 | mi.Extra2 = mapitem["Extra2"].AsInteger(); | ||
706 | mi.name = mapitem["Name"].AsString(); | ||
707 | returnitems.Add(mi); | 696 | returnitems.Add(mi); |
708 | } | 697 | } |
709 | av.ControllingClient.SendMapItemReply(returnitems.ToArray(), itemtype, mrs.flags); | 698 | av.ControllingClient.SendMapItemReply(returnitems.ToArray(), itemtype, mrs.flags); |
710 | } | 699 | } |
711 | 700 | ||
712 | // Service 1 (MAP_ITEM_TELEHUB) | 701 | // Service 1 (MAP_ITEM_TELEHUB) |
713 | itemtype = 1; | 702 | itemtype = (uint)GridItemType.Telehub; |
714 | 703 | ||
715 | if (response.ContainsKey(itemtype.ToString())) | 704 | if (response.ContainsKey(itemtype.ToString())) |
716 | { | 705 | { |
@@ -720,12 +709,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
720 | { | 709 | { |
721 | OSDMap mapitem = (OSDMap)itemarray[i]; | 710 | OSDMap mapitem = (OSDMap)itemarray[i]; |
722 | mapItemReply mi = new mapItemReply(); | 711 | mapItemReply mi = new mapItemReply(); |
723 | mi.x = (uint)mapitem["X"].AsInteger(); | 712 | mi.FromOSD(mapitem); |
724 | mi.y = (uint)mapitem["Y"].AsInteger(); | ||
725 | mi.id = mapitem["ID"].AsUUID(); | ||
726 | mi.Extra = mapitem["Extra"].AsInteger(); | ||
727 | mi.Extra2 = mapitem["Extra2"].AsInteger(); | ||
728 | mi.name = mapitem["Name"].AsString(); | ||
729 | returnitems.Add(mi); | 713 | returnitems.Add(mi); |
730 | } | 714 | } |
731 | av.ControllingClient.SendMapItemReply(returnitems.ToArray(), itemtype, mrs.flags); | 715 | av.ControllingClient.SendMapItemReply(returnitems.ToArray(), itemtype, mrs.flags); |
@@ -808,7 +792,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
808 | if (httpserver.Length == 0) | 792 | if (httpserver.Length == 0) |
809 | { | 793 | { |
810 | uint x = 0, y = 0; | 794 | uint x = 0, y = 0; |
811 | Utils.LongToUInts(regionhandle, out x, out y); | 795 | Util.RegionHandleToWorldLoc(regionhandle, out x, out y); |
812 | GridRegion mreg = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y); | 796 | GridRegion mreg = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y); |
813 | 797 | ||
814 | if (mreg != null) | 798 | if (mreg != null) |
@@ -1007,7 +991,6 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1007 | /// <param name="maxY"></param> | 991 | /// <param name="maxY"></param> |
1008 | public virtual void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag) | 992 | public virtual void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag) |
1009 | { | 993 | { |
1010 | //m_log.ErrorFormat("[YYY] RequestMapBlocks {0}={1}={2}={3} {4}", minX, minY, maxX, maxY, flag); | ||
1011 | if ((flag & 0x10000) != 0) // user clicked on qthe map a tile that isn't visible | 994 | if ((flag & 0x10000) != 0) // user clicked on qthe map a tile that isn't visible |
1012 | { | 995 | { |
1013 | List<MapBlockData> response = new List<MapBlockData>(); | 996 | List<MapBlockData> response = new List<MapBlockData>(); |
@@ -1016,22 +999,24 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1016 | // on an unloaded square. | 999 | // on an unloaded square. |
1017 | // But make sure: Look whether the one we requested is in there | 1000 | // But make sure: Look whether the one we requested is in there |
1018 | List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID, | 1001 | List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID, |
1019 | minX * (int)Constants.RegionSize, | 1002 | (int)Util.RegionToWorldLoc((uint)minX), (int)Util.RegionToWorldLoc((uint)maxX), |
1020 | maxX * (int)Constants.RegionSize, | 1003 | (int)Util.RegionToWorldLoc((uint)minY), (int)Util.RegionToWorldLoc((uint)maxY) ); |
1021 | minY * (int)Constants.RegionSize, | ||
1022 | maxY * (int)Constants.RegionSize); | ||
1023 | 1004 | ||
1005 | m_log.DebugFormat("[WORLD MAP MODULE] RequestMapBlocks min=<{0},{1}>, max=<{2},{3}>, flag={4}, cntFound={5}", | ||
1006 | minX, minY, maxX, maxY, flag.ToString("X"), regions.Count); | ||
1024 | if (regions != null) | 1007 | if (regions != null) |
1025 | { | 1008 | { |
1026 | foreach (GridRegion r in regions) | 1009 | foreach (GridRegion r in regions) |
1027 | { | 1010 | { |
1028 | if ((r.RegionLocX == minX * (int)Constants.RegionSize) && | 1011 | if (r.RegionLocX == Util.RegionToWorldLoc((uint)minX) |
1029 | (r.RegionLocY == minY * (int)Constants.RegionSize)) | 1012 | && r.RegionLocY == Util.RegionToWorldLoc((uint)minY) ) |
1030 | { | 1013 | { |
1031 | // found it => add it to response | 1014 | // found it => add it to response |
1032 | MapBlockData block = new MapBlockData(); | 1015 | // Version 2 viewers can handle the larger regions |
1033 | MapBlockFromGridRegion(block, r, flag); | 1016 | if ((flag & 2) == 2) |
1034 | response.Add(block); | 1017 | response.AddRange(Map2BlockFromGridRegion(r, flag)); |
1018 | else | ||
1019 | response.Add(MapBlockFromGridRegion(r, flag)); | ||
1035 | break; | 1020 | break; |
1036 | } | 1021 | } |
1037 | } | 1022 | } |
@@ -1043,7 +1028,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1043 | MapBlockData block = new MapBlockData(); | 1028 | MapBlockData block = new MapBlockData(); |
1044 | block.X = (ushort)minX; | 1029 | block.X = (ushort)minX; |
1045 | block.Y = (ushort)minY; | 1030 | block.Y = (ushort)minY; |
1046 | block.Access = 254; // means 'simulator is offline' | 1031 | block.Access = (byte)SimAccess.Down; // means 'simulator is offline' |
1032 | // block.Access = (byte)SimAccess.NonExistant; | ||
1047 | response.Add(block); | 1033 | response.Add(block); |
1048 | } | 1034 | } |
1049 | // The lower 16 bits are an unsigned int16 | 1035 | // The lower 16 bits are an unsigned int16 |
@@ -1060,41 +1046,112 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1060 | { | 1046 | { |
1061 | List<MapBlockData> mapBlocks = new List<MapBlockData>(); | 1047 | List<MapBlockData> mapBlocks = new List<MapBlockData>(); |
1062 | List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID, | 1048 | List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID, |
1063 | (minX - 4) * (int)Constants.RegionSize, | 1049 | (int)Util.RegionToWorldLoc((uint)(minX - 4)), (int)Util.RegionToWorldLoc((uint)(maxX + 4)), |
1064 | (maxX + 4) * (int)Constants.RegionSize, | 1050 | (int)Util.RegionToWorldLoc((uint)(minY - 4)), (int)Util.RegionToWorldLoc((uint)(maxY + 4)) ); |
1065 | (minY - 4) * (int)Constants.RegionSize, | 1051 | m_log.DebugFormat("{0} GetAndSendBlocks. min=<{1},{2}>, max=<{3},{4}>, cntFound={5}", |
1066 | (maxY + 4) * (int)Constants.RegionSize); | 1052 | LogHeader, minX, minY, maxX, maxY, regions.Count); |
1067 | foreach (GridRegion r in regions) | 1053 | foreach (GridRegion r in regions) |
1068 | { | 1054 | { |
1069 | MapBlockData block = new MapBlockData(); | 1055 | // Version 2 viewers can handle the larger regions |
1070 | MapBlockFromGridRegion(block, r, flag); | 1056 | if ((flag & 2) == 2) |
1071 | mapBlocks.Add(block); | 1057 | mapBlocks.AddRange(Map2BlockFromGridRegion(r, flag)); |
1058 | else | ||
1059 | mapBlocks.Add(MapBlockFromGridRegion(r, flag)); | ||
1072 | } | 1060 | } |
1073 | remoteClient.SendMapBlock(mapBlocks, flag & 0xffff); | 1061 | remoteClient.SendMapBlock(mapBlocks, flag & 0xffff); |
1074 | 1062 | ||
1075 | return mapBlocks; | 1063 | return mapBlocks; |
1076 | } | 1064 | } |
1077 | 1065 | ||
1078 | protected void MapBlockFromGridRegion(MapBlockData block, GridRegion r, uint flag) | 1066 | // Fill a passed MapBlockData from a GridRegion |
1067 | protected MapBlockData MapBlockFromGridRegion(GridRegion r, uint flag) | ||
1079 | { | 1068 | { |
1069 | MapBlockData block = new MapBlockData(); | ||
1070 | |||
1080 | block.Access = r.Access; | 1071 | block.Access = r.Access; |
1081 | switch (flag & 0xffff) | 1072 | switch (flag & 0xffff) |
1082 | { | 1073 | { |
1083 | case 0: | 1074 | case 0: |
1084 | block.MapImageId = r.TerrainImage; | 1075 | block.MapImageId = r.TerrainImage; |
1085 | break; | 1076 | break; |
1086 | case 2: | 1077 | case 2: |
1087 | block.MapImageId = r.ParcelImage; | 1078 | block.MapImageId = r.ParcelImage; |
1088 | break; | 1079 | break; |
1089 | default: | 1080 | default: |
1090 | block.MapImageId = UUID.Zero; | 1081 | block.MapImageId = UUID.Zero; |
1091 | break; | 1082 | break; |
1092 | } | 1083 | } |
1093 | block.Name = r.RegionName; | 1084 | block.Name = r.RegionName; |
1094 | block.X = (ushort)(r.RegionLocX / Constants.RegionSize); | 1085 | block.X = (ushort)Util.WorldToRegionLoc((uint)r.RegionLocX); |
1095 | block.Y = (ushort)(r.RegionLocY / Constants.RegionSize); | 1086 | block.Y = (ushort)Util.WorldToRegionLoc((uint)r.RegionLocY); |
1087 | block.SizeX = (ushort) r.RegionSizeX; | ||
1088 | block.SizeY = (ushort) r.RegionSizeY; | ||
1089 | |||
1090 | return block; | ||
1096 | } | 1091 | } |
1097 | 1092 | ||
1093 | protected List<MapBlockData> Map2BlockFromGridRegion(GridRegion r, uint flag) | ||
1094 | { | ||
1095 | List<MapBlockData> blocks = new List<MapBlockData>(); | ||
1096 | MapBlockData block = new MapBlockData(); | ||
1097 | if (r == null) | ||
1098 | { | ||
1099 | block.Access = (byte)SimAccess.Down; | ||
1100 | block.MapImageId = UUID.Zero; | ||
1101 | blocks.Add(block); | ||
1102 | } | ||
1103 | else | ||
1104 | { | ||
1105 | block.Access = r.Access; | ||
1106 | switch (flag & 0xffff) | ||
1107 | { | ||
1108 | case 0: | ||
1109 | block.MapImageId = r.TerrainImage; | ||
1110 | break; | ||
1111 | case 2: | ||
1112 | block.MapImageId = r.ParcelImage; | ||
1113 | break; | ||
1114 | default: | ||
1115 | block.MapImageId = UUID.Zero; | ||
1116 | break; | ||
1117 | } | ||
1118 | block.Name = r.RegionName; | ||
1119 | block.X = (ushort)(r.RegionLocX / Constants.RegionSize); | ||
1120 | block.Y = (ushort)(r.RegionLocY / Constants.RegionSize); | ||
1121 | block.SizeX = (ushort)r.RegionSizeX; | ||
1122 | block.SizeY = (ushort)r.RegionSizeY; | ||
1123 | blocks.Add(block); | ||
1124 | // If these are larger than legacy regions, create fake map entries for the covered | ||
1125 | // regions. The map system only does legacy sized regions so we have to fake map | ||
1126 | // entries for all the covered regions. | ||
1127 | if (r.RegionSizeX > Constants.RegionSize || r.RegionSizeY > Constants.RegionSize) | ||
1128 | { | ||
1129 | for (int x = 0; x < r.RegionSizeX / Constants.RegionSize; x++) | ||
1130 | { | ||
1131 | for (int y = 0; y < r.RegionSizeY / Constants.RegionSize; y++) | ||
1132 | { | ||
1133 | if (x == 0 && y == 0) | ||
1134 | continue; | ||
1135 | block = new MapBlockData | ||
1136 | { | ||
1137 | Access = r.Access, | ||
1138 | MapImageId = r.TerrainImage, | ||
1139 | Name = r.RegionName, | ||
1140 | X = (ushort)((r.RegionLocX / Constants.RegionSize) + x), | ||
1141 | Y = (ushort)((r.RegionLocY / Constants.RegionSize) + y), | ||
1142 | SizeX = (ushort)r.RegionSizeX, | ||
1143 | SizeY = (ushort)r.RegionSizeY | ||
1144 | }; | ||
1145 | //Child piece, so ignore it | ||
1146 | blocks.Add(block); | ||
1147 | } | ||
1148 | } | ||
1149 | } | ||
1150 | } | ||
1151 | return blocks; | ||
1152 | } | ||
1153 | |||
1154 | |||
1098 | public Hashtable OnHTTPThrottled(Hashtable keysvals) | 1155 | public Hashtable OnHTTPThrottled(Hashtable keysvals) |
1099 | { | 1156 | { |
1100 | Hashtable reply = new Hashtable(); | 1157 | Hashtable reply = new Hashtable(); |
@@ -1223,17 +1280,16 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1223 | 1280 | ||
1224 | List<MapBlockData> mapBlocks = new List<MapBlockData>(); | 1281 | List<MapBlockData> mapBlocks = new List<MapBlockData>(); |
1225 | List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID, | 1282 | List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID, |
1226 | (int)(m_scene.RegionInfo.RegionLocX - 9) * (int)Constants.RegionSize, | 1283 | (int)Util.RegionToWorldLoc(m_scene.RegionInfo.RegionLocX - 9), |
1227 | (int)(m_scene.RegionInfo.RegionLocX + 9) * (int)Constants.RegionSize, | 1284 | (int)Util.RegionToWorldLoc(m_scene.RegionInfo.RegionLocX + 9), |
1228 | (int)(m_scene.RegionInfo.RegionLocY - 9) * (int)Constants.RegionSize, | 1285 | (int)Util.RegionToWorldLoc(m_scene.RegionInfo.RegionLocY - 9), |
1229 | (int)(m_scene.RegionInfo.RegionLocY + 9) * (int)Constants.RegionSize); | 1286 | (int)Util.RegionToWorldLoc(m_scene.RegionInfo.RegionLocY + 9)); |
1230 | List<AssetBase> textures = new List<AssetBase>(); | 1287 | List<AssetBase> textures = new List<AssetBase>(); |
1231 | List<Image> bitImages = new List<Image>(); | 1288 | List<Image> bitImages = new List<Image>(); |
1232 | 1289 | ||
1233 | foreach (GridRegion r in regions) | 1290 | foreach (GridRegion r in regions) |
1234 | { | 1291 | { |
1235 | MapBlockData mapBlock = new MapBlockData(); | 1292 | MapBlockData mapBlock = MapBlockFromGridRegion(r, 0); |
1236 | MapBlockFromGridRegion(mapBlock, r, 0); | ||
1237 | AssetBase texAsset = m_scene.AssetService.Get(mapBlock.MapImageId.ToString()); | 1293 | AssetBase texAsset = m_scene.AssetService.Get(mapBlock.MapImageId.ToString()); |
1238 | 1294 | ||
1239 | if (texAsset != null) | 1295 | if (texAsset != null) |
@@ -1294,7 +1350,9 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1294 | uint xstart = 0; | 1350 | uint xstart = 0; |
1295 | uint ystart = 0; | 1351 | uint ystart = 0; |
1296 | 1352 | ||
1297 | Utils.LongToUInts(m_scene.RegionInfo.RegionHandle,out xstart,out ystart); | 1353 | Util.RegionHandleToWorldLoc(m_scene.RegionInfo.RegionHandle,out xstart,out ystart); |
1354 | // m_log.DebugFormat("{0} HandleRemoteMapItemRequest. loc=<{1},{2}>", | ||
1355 | // LogHeader, Util.WorldToRegionLoc(xstart), Util.WorldToRegionLoc(ystart)); | ||
1298 | 1356 | ||
1299 | // Service 6 (MAP_ITEM_AGENTS_LOCATION; green dots) | 1357 | // Service 6 (MAP_ITEM_AGENTS_LOCATION; green dots) |
1300 | 1358 | ||