From d2dfa4cfe7aadfed0611fb31414d9c8fff420b24 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 31 Jan 2012 03:09:44 +0000 Subject: Make parcel sale overlays work. No auction support. --- OpenSim/Region/Application/OpenSimBase.cs | 6 +- .../CoreModules/World/WorldMap/WorldMapModule.cs | 88 +++++++++++++++++++++- 2 files changed, 87 insertions(+), 7 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index a680a59..f482d8f 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -383,6 +383,9 @@ namespace OpenSim // TODO : Try setting resource for region xstats here on scene MainServer.Instance.AddStreamHandler(new Region.Framework.Scenes.RegionStatsHandler(regionInfo)); + scene.loadAllLandObjectsFromStorage(regionInfo.originRegionID); + scene.EventManager.TriggerParcelPrimCountUpdate(); + try { scene.RegisterRegionWithGrid(); @@ -398,9 +401,6 @@ namespace OpenSim Environment.Exit(1); } - scene.loadAllLandObjectsFromStorage(regionInfo.originRegionID); - scene.EventManager.TriggerParcelPrimCountUpdate(); - // We need to do this after we've initialized the // scripting engines. scene.CreateScriptInstances(); diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index e42c946..6c6aa37 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs @@ -213,7 +213,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap UUID agentID, Caps caps) { //try - //{ + // //m_log.DebugFormat("[MAPLAYER]: path: {0}, param: {1}, agent:{2}", // path, param, agentID.ToString()); @@ -1345,10 +1345,12 @@ namespace OpenSim.Region.CoreModules.World.WorldMap if (data == null) return; + byte[] overlay = GenerateOverlay(); + m_log.Debug("[WORLDMAP]: STORING MAPTILE IMAGE"); UUID terrainImageID = UUID.Random(); - UUID parcelImageID = UUID.Zero; // UUID.Random(); + UUID parcelImageID = UUID.Zero; AssetBase asset = new AssetBase( terrainImageID, @@ -1364,9 +1366,26 @@ namespace OpenSim.Region.CoreModules.World.WorldMap m_log.DebugFormat("[WORLDMAP]: Storing map tile {0}", asset.ID); m_scene.AssetService.Store(asset); + if (overlay != null) + { + parcelImageID = UUID.Random(); + + AssetBase parcels = new AssetBase( + parcelImageID, + "parcelImage_" + m_scene.RegionInfo.RegionID.ToString(), + (sbyte)AssetType.Texture, + m_scene.RegionInfo.RegionID.ToString()); + parcels.Data = overlay; + parcels.Description = m_scene.RegionInfo.RegionName; + parcels.Temporary = false; + parcels.Flags = AssetFlags.Maptile; + + m_scene.AssetService.Store(parcels); + } + // Switch to the new one UUID lastTerrainImageID = m_scene.RegionInfo.RegionSettings.TerrainImageID; - UUID lastParcelImageID = m_scene.RegionInfo.RegionSettings.TerrainImageID; + UUID lastParcelImageID = m_scene.RegionInfo.RegionSettings.ParcelImageID; m_scene.RegionInfo.RegionSettings.TerrainImageID = terrainImageID; m_scene.RegionInfo.RegionSettings.ParcelImageID = parcelImageID; m_scene.RegionInfo.RegionSettings.Save(); @@ -1374,7 +1393,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap // Delete the old one // m_log.DebugFormat("[WORLDMAP]: Deleting old map tile {0}", lastTerrainImageID); m_scene.AssetService.Delete(lastTerrainImageID.ToString()); - m_scene.AssetService.Delete(lastParcelImageID.ToString()); + if (lastParcelImageID != UUID.Zero) + m_scene.AssetService.Delete(lastParcelImageID.ToString()); } private void MakeRootAgent(ScenePresence avatar) @@ -1420,6 +1440,66 @@ namespace OpenSim.Region.CoreModules.World.WorldMap } } + private Byte[] GenerateOverlay() + { + Bitmap overlay = new Bitmap(256, 256); + + bool[,] saleBitmap = new bool[64, 64]; + for (int x = 0 ; x < 64 ; x++) + { + for (int y = 0 ; y < 64 ; y++) + saleBitmap[x, y] = false; + } + + bool landForSale = false; + + List parcels = m_scene.LandChannel.AllParcels(); + + Color background = Color.FromArgb(0, 0, 0, 0); + SolidBrush transparent = new SolidBrush(background); + Graphics g = Graphics.FromImage(overlay); + g.FillRectangle(transparent, 0, 0, 256, 256); + + SolidBrush yellow = new SolidBrush(Color.FromArgb(255, 249, 223, 9)); + + foreach (ILandObject land in parcels) + { + // m_log.DebugFormat("[WORLD MAP]: Parcel {0} flags {1}", land.LandData.Name, land.LandData.Flags); + if ((land.LandData.Flags & (uint)ParcelFlags.ForSale) != 0) + { + landForSale = true; + + saleBitmap = land.MergeLandBitmaps(saleBitmap, land.GetLandBitmap()); + } + } + + if (!landForSale) + { + m_log.DebugFormat("[WORLD MAP]: Region {0} has no parcels for sale, not geenrating overlay", m_scene.RegionInfo.RegionName); + return null; + } + + m_log.DebugFormat("[WORLD MAP]: Region {0} has parcels for sale, genrating overlay", m_scene.RegionInfo.RegionName); + + for (int x = 0 ; x < 64 ; x++) + { + for (int y = 0 ; y < 64 ; y++) + { + if (saleBitmap[x, y]) + g.FillRectangle(yellow, x * 4, 252 - (y * 4), 4, 4); + } + } + + try + { + return OpenJPEG.EncodeFromImage(overlay, true); + } + catch (Exception e) + { + m_log.DebugFormat("[WORLD MAP]: Error creating parcel overlay: " + e.ToString()); + } + return null; + } } public struct MapRequestState -- cgit v1.1