diff options
-rw-r--r-- | OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs | 351 |
1 files changed, 186 insertions, 165 deletions
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index fa4378f..d41872fc 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs | |||
@@ -80,7 +80,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
80 | protected Scene m_scene; | 80 | protected Scene m_scene; |
81 | private List<MapBlockData> cachedMapBlocks = new List<MapBlockData>(); | 81 | private List<MapBlockData> cachedMapBlocks = new List<MapBlockData>(); |
82 | private int cachedTime = 0; | 82 | private int cachedTime = 0; |
83 | private int blacklistTimeout = 10*60*1000; // 10 minutes | 83 | private int blacklistTimeout = 10 * 60 * 1000; // 10 minutes |
84 | private byte[] myMapImageJPEG; | 84 | private byte[] myMapImageJPEG; |
85 | protected volatile bool m_Enabled = false; | 85 | protected volatile bool m_Enabled = false; |
86 | private Dictionary<string, int> m_blacklistedurls = new Dictionary<string, int>(); | 86 | private Dictionary<string, int> m_blacklistedurls = new Dictionary<string, int>(); |
@@ -92,15 +92,15 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
92 | //private int CacheRegionsDistance = 256; | 92 | //private int CacheRegionsDistance = 256; |
93 | 93 | ||
94 | #region INonSharedRegionModule Members | 94 | #region INonSharedRegionModule Members |
95 | public virtual void Initialise (IConfigSource config) | 95 | public virtual void Initialise(IConfigSource config) |
96 | { | 96 | { |
97 | string[] configSections = new string[] { "Map", "Startup" }; | 97 | string[] configSections = new string[] { "Map", "Startup" }; |
98 | 98 | ||
99 | if (Util.GetConfigVarFromSections<string>( | 99 | if (Util.GetConfigVarFromSections<string>( |
100 | config, "WorldMapModule", configSections, "WorldMap") == "WorldMap") | 100 | config, "WorldMapModule", configSections, "WorldMap") == "WorldMap") |
101 | m_Enabled = true; | 101 | m_Enabled = true; |
102 | 102 | ||
103 | blacklistTimeout | 103 | blacklistTimeout |
104 | = Util.GetConfigVarFromSections<int>(config, "BlacklistTimeout", configSections, 10 * 60) * 1000; | 104 | = Util.GetConfigVarFromSections<int>(config, "BlacklistTimeout", configSections, 10 * 60) * 1000; |
105 | } | 105 | } |
106 | 106 | ||
@@ -129,7 +129,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
129 | } | 129 | } |
130 | } | 130 | } |
131 | 131 | ||
132 | public virtual void RemoveRegion (Scene scene) | 132 | public virtual void RemoveRegion(Scene scene) |
133 | { | 133 | { |
134 | if (!m_Enabled) | 134 | if (!m_Enabled) |
135 | return; | 135 | return; |
@@ -142,7 +142,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
142 | } | 142 | } |
143 | } | 143 | } |
144 | 144 | ||
145 | public virtual void RegionLoaded (Scene scene) | 145 | public virtual void RegionLoaded(Scene scene) |
146 | { | 146 | { |
147 | if (!m_Enabled) | 147 | if (!m_Enabled) |
148 | return; | 148 | return; |
@@ -178,14 +178,14 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
178 | 178 | ||
179 | MainServer.Instance.AddHTTPHandler(regionimage, | 179 | MainServer.Instance.AddHTTPHandler(regionimage, |
180 | new GenericHTTPDOSProtector(OnHTTPGetMapImage, OnHTTPThrottled, new BasicDosProtectorOptions() | 180 | new GenericHTTPDOSProtector(OnHTTPGetMapImage, OnHTTPThrottled, new BasicDosProtectorOptions() |
181 | { | 181 | { |
182 | AllowXForwardedFor = false, | 182 | AllowXForwardedFor = false, |
183 | ForgetTimeSpan = TimeSpan.FromMinutes(2), | 183 | ForgetTimeSpan = TimeSpan.FromMinutes(2), |
184 | MaxRequestsInTimeframe = 4, | 184 | MaxRequestsInTimeframe = 4, |
185 | ReportingName = "MAPDOSPROTECTOR", | 185 | ReportingName = "MAPDOSPROTECTOR", |
186 | RequestTimeSpan = TimeSpan.FromSeconds(10), | 186 | RequestTimeSpan = TimeSpan.FromSeconds(10), |
187 | ThrottledAction = BasicDOSProtector.ThrottleAction.DoThrottledMethod | 187 | ThrottledAction = BasicDOSProtector.ThrottleAction.DoThrottledMethod |
188 | }).Process); | 188 | }).Process); |
189 | MainServer.Instance.AddLLSDHandler( | 189 | MainServer.Instance.AddLLSDHandler( |
190 | "/MAP/MapItems/" + m_scene.RegionInfo.RegionHandle.ToString(), HandleRemoteMapItemRequest); | 190 | "/MAP/MapItems/" + m_scene.RegionInfo.RegionHandle.ToString(), HandleRemoteMapItemRequest); |
191 | 191 | ||
@@ -383,7 +383,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
383 | if (threadrunning) return; | 383 | if (threadrunning) return; |
384 | threadrunning = true; | 384 | threadrunning = true; |
385 | 385 | ||
386 | // m_log.Debug("[WORLD MAP]: Starting remote MapItem request thread"); | 386 | // m_log.Debug("[WORLD MAP]: Starting remote MapItem request thread"); |
387 | 387 | ||
388 | WorkManager.StartThread( | 388 | WorkManager.StartThread( |
389 | process, | 389 | process, |
@@ -406,11 +406,11 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
406 | { | 406 | { |
407 | MapRequestState st = new MapRequestState(); | 407 | MapRequestState st = new MapRequestState(); |
408 | st.agentID = STOP_UUID; | 408 | st.agentID = STOP_UUID; |
409 | st.EstateID=0; | 409 | st.EstateID = 0; |
410 | st.flags=0; | 410 | st.flags = 0; |
411 | st.godlike=false; | 411 | st.godlike = false; |
412 | st.itemtype=0; | 412 | st.itemtype = 0; |
413 | st.regionhandle=0; | 413 | st.regionhandle = 0; |
414 | 414 | ||
415 | lock (requests) | 415 | lock (requests) |
416 | { | 416 | { |
@@ -500,15 +500,15 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
500 | }); | 500 | }); |
501 | } | 501 | } |
502 | remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags); | 502 | remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags); |
503 | 503 | ||
504 | break; | 504 | break; |
505 | 505 | ||
506 | case (int)GridItemType.AdultLandForSale: | 506 | case (int)GridItemType.AdultLandForSale: |
507 | case (int)GridItemType.LandForSale: | 507 | case (int)GridItemType.LandForSale: |
508 | // Service 7 (MAP_ITEM_LAND_FOR_SALE) | 508 | // Service 7 (MAP_ITEM_LAND_FOR_SALE) |
509 | 509 | ||
510 | adultRegion = m_scene.RegionInfo.RegionSettings.Maturity == 2; | 510 | adultRegion = m_scene.RegionInfo.RegionSettings.Maturity == 2; |
511 | if(adultRegion) | 511 | if (adultRegion) |
512 | { | 512 | { |
513 | if (itemtype == (int)GridItemType.LandForSale) | 513 | if (itemtype == (int)GridItemType.LandForSale) |
514 | break; | 514 | break; |
@@ -555,7 +555,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
555 | } | 555 | } |
556 | remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags); | 556 | remoteClient.SendMapItemReply(mapitems.ToArray(), itemtype, flags); |
557 | break; | 557 | break; |
558 | 558 | ||
559 | case (int)GridItemType.Telehub: | 559 | case (int)GridItemType.Telehub: |
560 | // Service 1 (MAP_ITEM_TELEHUB) | 560 | // Service 1 (MAP_ITEM_TELEHUB) |
561 | 561 | ||
@@ -583,7 +583,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
583 | case (uint)GridItemType.Popular: | 583 | case (uint)GridItemType.Popular: |
584 | // TODO | 584 | // TODO |
585 | // just dont not cry about them | 585 | // just dont not cry about them |
586 | break; | 586 | break; |
587 | 587 | ||
588 | default: | 588 | default: |
589 | // unkown map item type | 589 | // unkown map item type |
@@ -632,7 +632,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
632 | dorequest = false; | 632 | dorequest = false; |
633 | } | 633 | } |
634 | 634 | ||
635 | if (dorequest && !m_blacklistedregions.ContainsKey(st.regionhandle)) | 635 | if (dorequest && !m_blacklistedregions.ContainsKey(st.regionhandle)) |
636 | { | 636 | { |
637 | while (nAsyncRequests >= MAX_ASYNC_REQUESTS) // hit the break | 637 | while (nAsyncRequests >= MAX_ASYNC_REQUESTS) // hit the break |
638 | Thread.Sleep(100); | 638 | Thread.Sleep(100); |
@@ -711,7 +711,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
711 | private void RequestMapItemsAsync(UUID id, uint flags, | 711 | private void RequestMapItemsAsync(UUID id, uint flags, |
712 | uint EstateID, bool godlike, uint itemtype, ulong regionhandle) | 712 | uint EstateID, bool godlike, uint itemtype, ulong regionhandle) |
713 | { | 713 | { |
714 | // m_log.DebugFormat("[WORLDMAP]: RequestMapItemsAsync; region handle: {0} {1}", regionhandle, itemtype); | 714 | // m_log.DebugFormat("[WORLDMAP]: RequestMapItemsAsync; region handle: {0} {1}", regionhandle, itemtype); |
715 | 715 | ||
716 | string httpserver = ""; | 716 | string httpserver = ""; |
717 | bool blacklisted = false; | 717 | bool blacklisted = false; |
@@ -871,7 +871,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
871 | } | 871 | } |
872 | } | 872 | } |
873 | catch (WebException) | 873 | catch (WebException) |
874 | { | 874 | { |
875 | lock (m_blacklistedurls) | 875 | lock (m_blacklistedurls) |
876 | { | 876 | { |
877 | if (!m_blacklistedurls.ContainsKey(httpserver)) | 877 | if (!m_blacklistedurls.ContainsKey(httpserver)) |
@@ -957,51 +957,51 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
957 | av.ControllingClient.SendMapItemReply(returnitems.ToArray(), itemtype, flags); | 957 | av.ControllingClient.SendMapItemReply(returnitems.ToArray(), itemtype, flags); |
958 | } | 958 | } |
959 | 959 | ||
960 | /* send things viewer didn't ask ? | 960 | /* send things viewer didn't ask ? |
961 | // Service 7 (MAP_ITEM_LAND_FOR_SALE) | 961 | // Service 7 (MAP_ITEM_LAND_FOR_SALE) |
962 | itemtype = 7; | 962 | itemtype = 7; |
963 | 963 | ||
964 | if (responseMap.ContainsKey(itemtype.ToString())) | 964 | if (responseMap.ContainsKey(itemtype.ToString())) |
965 | { | 965 | { |
966 | List<mapItemReply> returnitems = new List<mapItemReply>(); | 966 | List<mapItemReply> returnitems = new List<mapItemReply>(); |
967 | OSDArray itemarray = (OSDArray)responseMap[itemtype.ToString()]; | 967 | OSDArray itemarray = (OSDArray)responseMap[itemtype.ToString()]; |
968 | for (int i = 0; i < itemarray.Count; i++) | 968 | for (int i = 0; i < itemarray.Count; i++) |
969 | { | 969 | { |
970 | OSDMap mapitem = (OSDMap)itemarray[i]; | 970 | OSDMap mapitem = (OSDMap)itemarray[i]; |
971 | mapItemReply mi = new mapItemReply(); | 971 | mapItemReply mi = new mapItemReply(); |
972 | mi.x = (uint)mapitem["X"].AsInteger(); | 972 | mi.x = (uint)mapitem["X"].AsInteger(); |
973 | mi.y = (uint)mapitem["Y"].AsInteger(); | 973 | mi.y = (uint)mapitem["Y"].AsInteger(); |
974 | mi.id = mapitem["ID"].AsUUID(); | 974 | mi.id = mapitem["ID"].AsUUID(); |
975 | mi.Extra = mapitem["Extra"].AsInteger(); | 975 | mi.Extra = mapitem["Extra"].AsInteger(); |
976 | mi.Extra2 = mapitem["Extra2"].AsInteger(); | 976 | mi.Extra2 = mapitem["Extra2"].AsInteger(); |
977 | mi.name = mapitem["Name"].AsString(); | 977 | mi.name = mapitem["Name"].AsString(); |
978 | returnitems.Add(mi); | 978 | returnitems.Add(mi); |
979 | } | 979 | } |
980 | av.ControllingClient.SendMapItemReply(returnitems.ToArray(), itemtype, flags); | 980 | av.ControllingClient.SendMapItemReply(returnitems.ToArray(), itemtype, flags); |
981 | } | 981 | } |
982 | 982 | ||
983 | // Service 1 (MAP_ITEM_TELEHUB) | 983 | // Service 1 (MAP_ITEM_TELEHUB) |
984 | itemtype = 1; | 984 | itemtype = 1; |
985 | 985 | ||
986 | if (responseMap.ContainsKey(itemtype.ToString())) | 986 | if (responseMap.ContainsKey(itemtype.ToString())) |
987 | { | 987 | { |
988 | List<mapItemReply> returnitems = new List<mapItemReply>(); | 988 | List<mapItemReply> returnitems = new List<mapItemReply>(); |
989 | OSDArray itemarray = (OSDArray)responseMap[itemtype.ToString()]; | 989 | OSDArray itemarray = (OSDArray)responseMap[itemtype.ToString()]; |
990 | for (int i = 0; i < itemarray.Count; i++) | 990 | for (int i = 0; i < itemarray.Count; i++) |
991 | { | 991 | { |
992 | OSDMap mapitem = (OSDMap)itemarray[i]; | 992 | OSDMap mapitem = (OSDMap)itemarray[i]; |
993 | mapItemReply mi = new mapItemReply(); | 993 | mapItemReply mi = new mapItemReply(); |
994 | mi.x = (uint)mapitem["X"].AsInteger(); | 994 | mi.x = (uint)mapitem["X"].AsInteger(); |
995 | mi.y = (uint)mapitem["Y"].AsInteger(); | 995 | mi.y = (uint)mapitem["Y"].AsInteger(); |
996 | mi.id = mapitem["ID"].AsUUID(); | 996 | mi.id = mapitem["ID"].AsUUID(); |
997 | mi.Extra = mapitem["Extra"].AsInteger(); | 997 | mi.Extra = mapitem["Extra"].AsInteger(); |
998 | mi.Extra2 = mapitem["Extra2"].AsInteger(); | 998 | mi.Extra2 = mapitem["Extra2"].AsInteger(); |
999 | mi.name = mapitem["Name"].AsString(); | 999 | mi.name = mapitem["Name"].AsString(); |
1000 | returnitems.Add(mi); | 1000 | returnitems.Add(mi); |
1001 | } | 1001 | } |
1002 | av.ControllingClient.SendMapItemReply(returnitems.ToArray(), itemtype, flags); | 1002 | av.ControllingClient.SendMapItemReply(returnitems.ToArray(), itemtype, flags); |
1003 | } | 1003 | } |
1004 | */ | 1004 | */ |
1005 | } | 1005 | } |
1006 | } | 1006 | } |
1007 | } | 1007 | } |
@@ -1090,7 +1090,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1090 | // only send a negative answer for a single region request | 1090 | // only send a negative answer for a single region request |
1091 | // corresponding to a click on the map. Current viewers | 1091 | // corresponding to a click on the map. Current viewers |
1092 | // keep displaying "loading.." without this | 1092 | // keep displaying "loading.." without this |
1093 | if(regions.Count == 0 && (flag & 0x10000) != 0 && minX == maxX && minY == maxY) | 1093 | if (regions.Count == 0 && (flag & 0x10000) != 0 && minX == maxX && minY == maxY) |
1094 | { | 1094 | { |
1095 | MapBlockData block = new MapBlockData(); | 1095 | MapBlockData block = new MapBlockData(); |
1096 | block.X = (ushort)minX; | 1096 | block.X = (ushort)minX; |
@@ -1213,7 +1213,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1213 | if (myMapImageJPEG.Length == 0) | 1213 | if (myMapImageJPEG.Length == 0) |
1214 | { | 1214 | { |
1215 | MemoryStream imgstream = null; | 1215 | MemoryStream imgstream = null; |
1216 | Bitmap mapTexture = new Bitmap(1,1); | 1216 | Bitmap mapTexture = new Bitmap(1, 1); |
1217 | ManagedImage managedImage; | 1217 | ManagedImage managedImage; |
1218 | Image image = (Image)mapTexture; | 1218 | Image image = (Image)mapTexture; |
1219 | 1219 | ||
@@ -1328,7 +1328,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1328 | foreach (GridRegion r in regions) | 1328 | foreach (GridRegion r in regions) |
1329 | { | 1329 | { |
1330 | MapBlockData mapBlock = new MapBlockData(); | 1330 | MapBlockData mapBlock = new MapBlockData(); |
1331 | MapBlockFromGridRegion(mapBlock, r , 0); | 1331 | MapBlockFromGridRegion(mapBlock, r, 0); |
1332 | AssetBase texAsset = m_scene.AssetService.Get(mapBlock.MapImageId.ToString()); | 1332 | AssetBase texAsset = m_scene.AssetService.Get(mapBlock.MapImageId.ToString()); |
1333 | 1333 | ||
1334 | if (texAsset != null) | 1334 | if (texAsset != null) |
@@ -1383,21 +1383,21 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1383 | 1383 | ||
1384 | GenerateMaptile(); | 1384 | GenerateMaptile(); |
1385 | } | 1385 | } |
1386 | /* | 1386 | /* |
1387 | if (m_mapImageGenerator == null) | 1387 | if (m_mapImageGenerator == null) |
1388 | { | 1388 | { |
1389 | Console.WriteLine("No map image generator available for {0}", m_scene.Name); | 1389 | Console.WriteLine("No map image generator available for {0}", m_scene.Name); |
1390 | return; | 1390 | return; |
1391 | } | 1391 | } |
1392 | 1392 | ||
1393 | using (Bitmap mapbmp = m_mapImageGenerator.CreateMapTile()) | 1393 | using (Bitmap mapbmp = m_mapImageGenerator.CreateMapTile()) |
1394 | { | 1394 | { |
1395 | GenerateMaptile(mapbmp); | 1395 | GenerateMaptile(mapbmp); |
1396 | if(m_mapImageServiceModule != null) | 1396 | if(m_mapImageServiceModule != null) |
1397 | m_mapImageServiceModule.UploadMapTile(m_scene, mapbmp); | 1397 | m_mapImageServiceModule.UploadMapTile(m_scene, mapbmp); |
1398 | } | 1398 | } |
1399 | } | 1399 | } |
1400 | */ | 1400 | */ |
1401 | public OSD HandleRemoteMapItemRequest(string path, OSD request, string endpoint) | 1401 | public OSD HandleRemoteMapItemRequest(string path, OSD request, string endpoint) |
1402 | { | 1402 | { |
1403 | uint xstart = 0; | 1403 | uint xstart = 0; |
@@ -1426,7 +1426,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1426 | else | 1426 | else |
1427 | { | 1427 | { |
1428 | OSDArray responsearr = new OSDArray(); // Don't preallocate. MT (m_scene.GetRootAgentCount()); | 1428 | OSDArray responsearr = new OSDArray(); // Don't preallocate. MT (m_scene.GetRootAgentCount()); |
1429 | m_scene.ForEachRootScenePresence(delegate(ScenePresence sp) | 1429 | m_scene.ForEachRootScenePresence(delegate (ScenePresence sp) |
1430 | { | 1430 | { |
1431 | OSDMap responsemapdata = new OSDMap(); | 1431 | OSDMap responsemapdata = new OSDMap(); |
1432 | responsemapdata["X"] = OSD.FromInteger((int)(xstart + sp.AbsolutePosition.X)); | 1432 | responsemapdata["X"] = OSD.FromInteger((int)(xstart + sp.AbsolutePosition.X)); |
@@ -1476,8 +1476,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1476 | { | 1476 | { |
1477 | Vector3 min = parcel.AABBMin; | 1477 | Vector3 min = parcel.AABBMin; |
1478 | Vector3 max = parcel.AABBMax; | 1478 | Vector3 max = parcel.AABBMax; |
1479 | float x = (min.X+max.X)/2; | 1479 | float x = (min.X + max.X) / 2; |
1480 | float y = (min.Y+max.Y)/2; | 1480 | float y = (min.Y + max.Y) / 2; |
1481 | 1481 | ||
1482 | OSDMap responsemapdata = new OSDMap(); | 1482 | OSDMap responsemapdata = new OSDMap(); |
1483 | responsemapdata["X"] = OSD.FromInteger((int)(xstart + x)); | 1483 | responsemapdata["X"] = OSD.FromInteger((int)(xstart + x)); |
@@ -1531,54 +1531,79 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1531 | 1531 | ||
1532 | using (Bitmap mapbmp = m_mapImageGenerator.CreateMapTile()) | 1532 | using (Bitmap mapbmp = m_mapImageGenerator.CreateMapTile()) |
1533 | { | 1533 | { |
1534 | // V1 (This Module) | 1534 | GenerateMaptile(mapbmp); |
1535 | // if(m_scene.RegionInfo.RegionSizeX <= Constants.RegionSize && | ||
1536 | // m_scene.RegionInfo.RegionSizeY <= Constants.RegionSize) | ||
1537 | GenerateMaptile(mapbmp); | ||
1538 | 1535 | ||
1539 | // v2/3 (MapImageServiceModule) | 1536 | if (m_mapImageServiceModule != null) |
1540 | if(m_mapImageServiceModule !=null) | ||
1541 | m_mapImageServiceModule.UploadMapTile(m_scene, mapbmp); | 1537 | m_mapImageServiceModule.UploadMapTile(m_scene, mapbmp); |
1542 | } | 1538 | } |
1543 | } | 1539 | } |
1544 | 1540 | ||
1545 | private void GenerateMaptile(Bitmap mapbmp) | 1541 | private void GenerateMaptile(Bitmap mapbmp) |
1546 | { | 1542 | { |
1547 | byte[] data; | 1543 | bool needRegionSave = false; |
1548 | 1544 | ||
1549 | try | 1545 | // remove old assets |
1546 | UUID lastID = m_scene.RegionInfo.RegionSettings.TerrainImageID; | ||
1547 | if (lastID != UUID.Zero) | ||
1550 | { | 1548 | { |
1551 | data = OpenJPEG.EncodeFromImage(mapbmp, true); | 1549 | m_scene.AssetService.Delete(lastID.ToString()); |
1550 | m_scene.RegionInfo.RegionSettings.TerrainImageID = UUID.Zero; | ||
1551 | needRegionSave = true; | ||
1552 | } | 1552 | } |
1553 | catch (Exception e) // LEGIT: Catching problems caused by OpenJPEG p/invoke | 1553 | |
1554 | lastID = m_scene.RegionInfo.RegionSettings.ParcelImageID; | ||
1555 | if (lastID != UUID.Zero) | ||
1554 | { | 1556 | { |
1555 | m_log.Error("[WORLD MAP]: Failed generating terrain map: " + e); | 1557 | m_scene.AssetService.Delete(lastID.ToString()); |
1556 | return; | 1558 | m_scene.RegionInfo.RegionSettings.ParcelImageID = UUID.Zero; |
1559 | needRegionSave = true; | ||
1557 | } | 1560 | } |
1558 | 1561 | ||
1559 | byte[] overlay = GenerateOverlay(); | 1562 | // bypass terrain image for large regions since only V2 viewers work with them |
1563 | if (m_scene.RegionInfo.RegionSizeX <= Constants.RegionSize && | ||
1564 | m_scene.RegionInfo.RegionSizeY <= Constants.RegionSize | ||
1565 | && mapbmp != null) | ||
1566 | { | ||
1567 | try | ||
1568 | { | ||
1569 | byte[] data; | ||
1560 | 1570 | ||
1561 | UUID terrainImageID = UUID.Random(); | 1571 | data = OpenJPEG.EncodeFromImage(mapbmp, true); |
1562 | UUID parcelImageID = UUID.Zero; | 1572 | |
1573 | if (data != null && data.Length > 0) | ||
1574 | { | ||
1575 | UUID terrainImageID = UUID.Random(); | ||
1563 | 1576 | ||
1564 | AssetBase asset = new AssetBase( | 1577 | AssetBase asset = new AssetBase( |
1565 | terrainImageID, | 1578 | terrainImageID, |
1566 | "terrainImage_" + m_scene.RegionInfo.RegionID.ToString(), | 1579 | "terrainImage_" + m_scene.RegionInfo.RegionID.ToString(), |
1567 | (sbyte)AssetType.Texture, | 1580 | (sbyte)AssetType.Texture, |
1568 | m_scene.RegionInfo.RegionID.ToString()); | 1581 | m_scene.RegionInfo.RegionID.ToString()); |
1569 | asset.Data = data; | 1582 | asset.Data = data; |
1570 | asset.Description = m_scene.RegionInfo.RegionName; | 1583 | asset.Description = m_scene.RegionInfo.RegionName; |
1571 | asset.Temporary = false; | 1584 | asset.Temporary = false; |
1572 | asset.Flags = AssetFlags.Maptile; | 1585 | asset.Flags = AssetFlags.Maptile; |
1573 | 1586 | ||
1574 | // Store the new one | 1587 | // Store the new one |
1575 | m_log.DebugFormat("[WORLD MAP]: Storing map tile {0} for {1}", asset.ID, m_scene.RegionInfo.RegionName); | 1588 | m_log.DebugFormat("[WORLD MAP]: Storing map tile {0} for {1}", asset.ID, m_scene.RegionInfo.RegionName); |
1576 | 1589 | ||
1577 | m_scene.AssetService.Store(asset); | 1590 | m_scene.AssetService.Store(asset); |
1591 | |||
1592 | m_scene.RegionInfo.RegionSettings.TerrainImageID = terrainImageID; | ||
1593 | needRegionSave = true; | ||
1594 | } | ||
1595 | } | ||
1596 | catch (Exception e) | ||
1597 | { | ||
1598 | m_log.Error("[WORLD MAP]: Failed generating terrain map: " + e); | ||
1599 | } | ||
1600 | } | ||
1578 | 1601 | ||
1602 | // V2/3 still seem to need this, or we are missing something somewhere | ||
1603 | byte[] overlay = GenerateOverlay(); | ||
1579 | if (overlay != null) | 1604 | if (overlay != null) |
1580 | { | 1605 | { |
1581 | parcelImageID = UUID.Random(); | 1606 | UUID parcelImageID = UUID.Random(); |
1582 | 1607 | ||
1583 | AssetBase parcels = new AssetBase( | 1608 | AssetBase parcels = new AssetBase( |
1584 | parcelImageID, | 1609 | parcelImageID, |
@@ -1591,20 +1616,13 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1591 | parcels.Flags = AssetFlags.Maptile; | 1616 | parcels.Flags = AssetFlags.Maptile; |
1592 | 1617 | ||
1593 | m_scene.AssetService.Store(parcels); | 1618 | m_scene.AssetService.Store(parcels); |
1619 | |||
1620 | m_scene.RegionInfo.RegionSettings.ParcelImageID = parcelImageID; | ||
1621 | needRegionSave = true; | ||
1594 | } | 1622 | } |
1595 | 1623 | ||
1596 | // Switch to the new one | 1624 | if (needRegionSave) |
1597 | UUID lastTerrainImageID = m_scene.RegionInfo.RegionSettings.TerrainImageID; | 1625 | m_scene.RegionInfo.RegionSettings.Save(); |
1598 | UUID lastParcelImageID = m_scene.RegionInfo.RegionSettings.ParcelImageID; | ||
1599 | m_scene.RegionInfo.RegionSettings.TerrainImageID = terrainImageID; | ||
1600 | m_scene.RegionInfo.RegionSettings.ParcelImageID = parcelImageID; | ||
1601 | m_scene.RegionInfo.RegionSettings.Save(); | ||
1602 | |||
1603 | // Delete the old one | ||
1604 | // m_log.DebugFormat("[WORLDMAP]: Deleting old map tile {0}", lastTerrainImageID); | ||
1605 | m_scene.AssetService.Delete(lastTerrainImageID.ToString()); | ||
1606 | if (lastParcelImageID != UUID.Zero) | ||
1607 | m_scene.AssetService.Delete(lastParcelImageID.ToString()); | ||
1608 | } | 1626 | } |
1609 | 1627 | ||
1610 | private void MakeRootAgent(ScenePresence avatar) | 1628 | private void MakeRootAgent(ScenePresence avatar) |
@@ -1658,27 +1676,48 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1658 | 1676 | ||
1659 | private Byte[] GenerateOverlay() | 1677 | private Byte[] GenerateOverlay() |
1660 | { | 1678 | { |
1679 | int landTileSize = LandManagementModule.LandUnit; | ||
1680 | |||
1661 | // These need to be ints for bitmap generation | 1681 | // These need to be ints for bitmap generation |
1662 | int regionSizeX = (int)m_scene.RegionInfo.RegionSizeX; | 1682 | int regionSizeX = (int)m_scene.RegionInfo.RegionSizeX; |
1663 | int regionSizeY = (int)m_scene.RegionInfo.RegionSizeY; | ||
1664 | |||
1665 | int landTileSize = LandManagementModule.LandUnit; | ||
1666 | int regionLandTilesX = regionSizeX / landTileSize; | 1683 | int regionLandTilesX = regionSizeX / landTileSize; |
1684 | |||
1685 | int regionSizeY = (int)m_scene.RegionInfo.RegionSizeY; | ||
1667 | int regionLandTilesY = regionSizeY / landTileSize; | 1686 | int regionLandTilesY = regionSizeY / landTileSize; |
1668 | 1687 | ||
1669 | using (Bitmap overlay = new Bitmap(regionSizeX, regionSizeY)) | 1688 | bool landForSale = false; |
1689 | ILandObject land; | ||
1690 | |||
1691 | // scan terrain avoiding potencial merges of large bitmaps | ||
1692 | //TODO create the sell bitmap at landchannel / landmaster ? | ||
1693 | // and auction also, still not suported | ||
1694 | |||
1695 | bool[,] saleBitmap = new bool[regionLandTilesX, regionLandTilesY]; | ||
1696 | for (int x = 0, xx = 0; x < regionLandTilesX; x++ ,xx += landTileSize) | ||
1670 | { | 1697 | { |
1671 | bool[,] saleBitmap = new bool[regionLandTilesX, regionLandTilesY]; | 1698 | for (int y = 0, yy = 0; y < regionLandTilesY; y++, yy += landTileSize) |
1672 | for (int x = 0; x < regionLandTilesX; x++) | ||
1673 | { | 1699 | { |
1674 | for (int y = 0; y < regionLandTilesY; y++) | 1700 | land = m_scene.LandChannel.GetLandObject(xx, yy); |
1701 | if (land != null && (land.LandData.Flags & (uint)ParcelFlags.ForSale) != 0) | ||
1702 | { | ||
1703 | saleBitmap[x, y] = true; | ||
1704 | landForSale = true; | ||
1705 | } | ||
1706 | else | ||
1675 | saleBitmap[x, y] = false; | 1707 | saleBitmap[x, y] = false; |
1676 | } | 1708 | } |
1709 | } | ||
1677 | 1710 | ||
1678 | bool landForSale = false; | 1711 | if (!landForSale) |
1712 | { | ||
1713 | m_log.DebugFormat("[WORLD MAP]: Region {0} has no parcels for sale, not generating overlay", m_scene.RegionInfo.RegionName); | ||
1714 | return null; | ||
1715 | } | ||
1679 | 1716 | ||
1680 | List<ILandObject> parcels = m_scene.LandChannel.AllParcels(); | 1717 | m_log.DebugFormat("[WORLD MAP]: Region {0} has parcels for sale, generating overlay", m_scene.RegionInfo.RegionName); |
1681 | 1718 | ||
1719 | using (Bitmap overlay = new Bitmap(regionSizeX, regionSizeY)) | ||
1720 | { | ||
1682 | Color background = Color.FromArgb(0, 0, 0, 0); | 1721 | Color background = Color.FromArgb(0, 0, 0, 0); |
1683 | 1722 | ||
1684 | using (Graphics g = Graphics.FromImage(overlay)) | 1723 | using (Graphics g = Graphics.FromImage(overlay)) |
@@ -1686,30 +1725,12 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1686 | using (SolidBrush transparent = new SolidBrush(background)) | 1725 | using (SolidBrush transparent = new SolidBrush(background)) |
1687 | g.FillRectangle(transparent, 0, 0, regionSizeX, regionSizeY); | 1726 | g.FillRectangle(transparent, 0, 0, regionSizeX, regionSizeY); |
1688 | 1727 | ||
1689 | foreach (ILandObject land in parcels) | 1728 | // make it a half transparent |
1690 | { | 1729 | using (SolidBrush yellow = new SolidBrush(Color.FromArgb(100, 249, 223, 9))) |
1691 | // m_log.DebugFormat("[WORLD MAP]: Parcel {0} flags {1}", land.LandData.Name, land.LandData.Flags); | ||
1692 | if ((land.LandData.Flags & (uint)ParcelFlags.ForSale) != 0) | ||
1693 | { | ||
1694 | landForSale = true; | ||
1695 | |||
1696 | saleBitmap = land.MergeLandBitmaps(saleBitmap, land.GetLandBitmap()); | ||
1697 | } | ||
1698 | } | ||
1699 | |||
1700 | if (!landForSale) | ||
1701 | { | ||
1702 | m_log.DebugFormat("[WORLD MAP]: Region {0} has no parcels for sale, not generating overlay", m_scene.RegionInfo.RegionName); | ||
1703 | return null; | ||
1704 | } | ||
1705 | |||
1706 | m_log.DebugFormat("[WORLD MAP]: Region {0} has parcels for sale, generating overlay", m_scene.RegionInfo.RegionName); | ||
1707 | |||
1708 | using (SolidBrush yellow = new SolidBrush(Color.FromArgb(255, 249, 223, 9))) | ||
1709 | { | 1730 | { |
1710 | for (int x = 0; x < regionLandTilesX ; x++) | 1731 | for (int x = 0; x < regionLandTilesX; x++) |
1711 | { | 1732 | { |
1712 | for (int y = 0; y < regionLandTilesY ; y++) | 1733 | for (int y = 0; y < regionLandTilesY; y++) |
1713 | { | 1734 | { |
1714 | if (saleBitmap[x, y]) | 1735 | if (saleBitmap[x, y]) |
1715 | g.FillRectangle( | 1736 | g.FillRectangle( |