From 7a9922af27658ac570517df530dd7c2cf6d6dded Mon Sep 17 00:00:00 2001 From: MW Date: Wed, 25 Jun 2008 19:33:19 +0000 Subject: Added support for terrain map to be serialised to xml(as base64 binary). useful for places that the terrain map is needed in a serialised form. Also could add console commands to save and load from files, which should be faster than .raw files (these load/save commands are not included/implemented) Add util functions to compress and uncompress strings. Fixed a couple of modules so they use SceneCommunicationService rather than directly call functions on the CommsManager. --- .../Avatar/InstantMessage/InstantMessageModule.cs | 2 +- .../Modules/World/Permissions/PermissionsModule.cs | 2 - .../Modules/World/Terrain/TerrainChannel.cs | 75 ++++++++++++++++++++++ .../Modules/World/WorldMap/WorldMapModule.cs | 4 +- 4 files changed, 78 insertions(+), 5 deletions(-) (limited to 'OpenSim/Region/Environment/Modules') diff --git a/OpenSim/Region/Environment/Modules/Avatar/InstantMessage/InstantMessageModule.cs b/OpenSim/Region/Environment/Modules/Avatar/InstantMessage/InstantMessageModule.cs index b22ca79..0944406 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/InstantMessage/InstantMessageModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/InstantMessage/InstantMessageModule.cs @@ -523,7 +523,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage { if (upd.AgentOnline) { - RegionInfo reginfo = m_scenes[0].CommsManager.GridService.RequestNeighbourInfo(upd.Handle); + RegionInfo reginfo = m_scenes[0].SceneGridService.RequestNeighbouringRegionInfo(upd.Handle); if (reginfo != null) { GridInstantMessage msg = new GridInstantMessage(); diff --git a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs index eccaa78..a851cad 100644 --- a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs @@ -950,8 +950,6 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions return true; } - - } } diff --git a/OpenSim/Region/Environment/Modules/World/Terrain/TerrainChannel.cs b/OpenSim/Region/Environment/Modules/World/Terrain/TerrainChannel.cs index 1399960..53d03fc 100644 --- a/OpenSim/Region/Environment/Modules/World/Terrain/TerrainChannel.cs +++ b/OpenSim/Region/Environment/Modules/World/Terrain/TerrainChannel.cs @@ -27,6 +27,11 @@ using OpenSim.Framework; using OpenSim.Region.Environment.Interfaces; +using System; +using System.Text; +using System.Xml; +using System.IO; +using System.Xml.Serialization; namespace OpenSim.Region.Environment.Modules.World.Terrain { @@ -151,5 +156,75 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain return copy; } + + public string SaveToXmlString() + { + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Encoding = Encoding.UTF8; + using (StringWriter sw = new StringWriter()) + { + using (XmlWriter writer = XmlWriter.Create(sw, settings)) + { + WriteXml(writer); + } + string output = sw.ToString(); + return output; + } + } + + private void WriteXml(XmlWriter writer) + { + writer.WriteStartElement(String.Empty, "TerrainMap", String.Empty); + ToXml(writer); + writer.WriteEndElement(); + } + + public void LoadFromXmlString(string data) + { + StringReader sr = new StringReader(data); + XmlTextReader reader = new XmlTextReader(sr); + reader.Read(); + + ReadXml(reader); + reader.Close(); + sr.Close(); + } + + private void ReadXml(XmlReader reader) + { + reader.ReadStartElement("TerrainMap"); + FromXml(reader); + } + + private void ToXml(XmlWriter xmlWriter) + { + float[] mapData = GetFloatsSerialised(); + byte[] buffer = new byte[mapData.Length * 4]; + for (int i = 0; i < mapData.Length; i++) + { + byte[] value = BitConverter.GetBytes(mapData[i]); + Array.Copy(value, 0, buffer, (i * 4), 4); + } + XmlSerializer serializer = new XmlSerializer(typeof(byte[])); + serializer.Serialize(xmlWriter, buffer); + } + + private void FromXml(XmlReader xmlReader) + { + XmlSerializer serializer = new XmlSerializer(typeof(byte[])); + byte[] dataArray = (byte[])serializer.Deserialize(xmlReader); + int index = 0; + + for (int y = 0; y < Height; y++) + { + for (int x = 0; x < Width; x++) + { + float value; + value = BitConverter.ToSingle(dataArray, index); + index += 4; + this[x, y] = (double)value; + } + } + } } } \ No newline at end of file diff --git a/OpenSim/Region/Environment/Modules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/Environment/Modules/World/WorldMap/WorldMapModule.cs index c8d2ef6..5287517 100644 --- a/OpenSim/Region/Environment/Modules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/Environment/Modules/World/WorldMap/WorldMapModule.cs @@ -166,7 +166,7 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap { List mapBlocks; - mapBlocks = m_scene.CommsManager.GridService.RequestNeighbourMapBlocks((int)m_scene.RegionInfo.RegionLocX - 8, (int)m_scene.RegionInfo.RegionLocY - 8, (int)m_scene.RegionInfo.RegionLocX + 8, (int)m_scene.RegionInfo.RegionLocY + 8); + mapBlocks = m_scene.SceneGridService.RequestNeighbourMapBlocks((int)m_scene.RegionInfo.RegionLocX - 8, (int)m_scene.RegionInfo.RegionLocY - 8, (int)m_scene.RegionInfo.RegionLocX + 8, (int)m_scene.RegionInfo.RegionLocY + 8); avatarPresence.ControllingClient.SendMapBlock(mapBlocks); lock (cachedMapBlocks) @@ -244,7 +244,7 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap public virtual void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY) { List mapBlocks; - mapBlocks = m_scene.CommsManager.GridService.RequestNeighbourMapBlocks(minX - 4, minY - 4, minX + 4, minY + 4); + mapBlocks = m_scene.SceneGridService.RequestNeighbourMapBlocks(minX - 4, minY - 4, minX + 4, minY + 4); remoteClient.SendMapBlock(mapBlocks); } public Hashtable OnHTTPGetMapImage(Hashtable keysvals) -- cgit v1.1