From 561f24156476041bdcd2ef2fdccd296a4127d0b0 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Fri, 27 Mar 2009 18:13:34 +0000 Subject: * minor: move RegionSettingsSerializer into OpenSim.Framework.Serialization --- .../External/RegionSettingsSerializer.cs | 254 ++++++++++++++++++++ .../World/Archiver/ArchiveReadRequest.cs | 1 + .../World/Archiver/ArchiveWriteRequestExecution.cs | 1 + .../World/Archiver/RegionSettingsSerializer.cs | 257 --------------------- bin/OpenSim.ini.example | 8 +- 5 files changed, 260 insertions(+), 261 deletions(-) create mode 100644 OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs delete mode 100644 OpenSim/Region/CoreModules/World/Archiver/RegionSettingsSerializer.cs diff --git a/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs new file mode 100644 index 0000000..3ee9e1b --- /dev/null +++ b/OpenSim/Framework/Serialization/External/RegionSettingsSerializer.cs @@ -0,0 +1,254 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System.IO; +using System.Text; +using System.Xml; +using OpenMetaverse; +using OpenSim.Framework; + +namespace OpenSim.Framework.Serialization.External +{ + /// + /// Serialize and deserialize region settings for an archive file format. + /// + /// We didn't simply use automatic .NET serializagion for OpenSim.Framework.RegionSettings since this is really + /// a file format rather than an object serialization. + public class RegionSettingsSerializer + { + protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding(); + + /// + /// Deserialize region settings + /// + /// + /// + /// + public static RegionSettings Deserialize(byte[] serializedSettings) + { + return Deserialize(m_asciiEncoding.GetString(serializedSettings, 0, serializedSettings.Length)); + } + + /// + /// Deserialize region settings + /// + /// + /// + /// + public static RegionSettings Deserialize(string serializedSettings) + { + RegionSettings settings = new RegionSettings(); + + StringReader sr = new StringReader(serializedSettings); + XmlTextReader xtr = new XmlTextReader(sr); + + xtr.ReadStartElement("RegionSettings"); + + xtr.ReadStartElement("General"); + + while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) + { + switch (xtr.Name) + { + case "AllowDamage": + settings.AllowDamage = bool.Parse(xtr.ReadElementContentAsString()); + break; + case "AllowLandResell": + settings.AllowLandResell = bool.Parse(xtr.ReadElementContentAsString()); + break; + case "AllowLandJoinDivide": + settings.AllowLandJoinDivide = bool.Parse(xtr.ReadElementContentAsString()); + break; + case "BlockFly": + settings.BlockFly = bool.Parse(xtr.ReadElementContentAsString()); + break; + case "BlockLandShowInSearch": + settings.BlockShowInSearch = bool.Parse(xtr.ReadElementContentAsString()); + break; + case "BlockTerraform": + settings.BlockTerraform = bool.Parse(xtr.ReadElementContentAsString()); + break; + case "DisableCollisions": + settings.DisableCollisions = bool.Parse(xtr.ReadElementContentAsString()); + break; + case "DisablePhysics": + settings.DisablePhysics = bool.Parse(xtr.ReadElementContentAsString()); + break; + case "DisableScripts": + settings.DisableScripts = bool.Parse(xtr.ReadElementContentAsString()); + break; + case "MaturityRating": + settings.Maturity = int.Parse(xtr.ReadElementContentAsString()); + break; + case "RestrictPushing": + settings.RestrictPushing = bool.Parse(xtr.ReadElementContentAsString()); + break; + case "AgentLimit": + settings.AgentLimit = int.Parse(xtr.ReadElementContentAsString()); + break; + case "ObjectBonus": + settings.ObjectBonus = double.Parse(xtr.ReadElementContentAsString()); + break; + } + } + + xtr.ReadEndElement(); + xtr.ReadStartElement("GroundTextures"); + + while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) + { + switch (xtr.Name) + { + case "Texture1": + settings.TerrainTexture1 = UUID.Parse(xtr.ReadElementContentAsString()); + break; + case "Texture2": + settings.TerrainTexture2 = UUID.Parse(xtr.ReadElementContentAsString()); + break; + case "Texture3": + settings.TerrainTexture3 = UUID.Parse(xtr.ReadElementContentAsString()); + break; + case "Texture4": + settings.TerrainTexture4 = UUID.Parse(xtr.ReadElementContentAsString()); + break; + case "ElevationLowSW": + settings.Elevation1SW = double.Parse(xtr.ReadElementContentAsString()); + break; + case "ElevationLowNW": + settings.Elevation1NW = double.Parse(xtr.ReadElementContentAsString()); + break; + case "ElevationLowSE": + settings.Elevation1SE = double.Parse(xtr.ReadElementContentAsString()); + break; + case "ElevationLowNE": + settings.Elevation1NE = double.Parse(xtr.ReadElementContentAsString()); + break; + case "ElevationHighSW": + settings.Elevation2SW = double.Parse(xtr.ReadElementContentAsString()); + break; + case "ElevationHighNW": + settings.Elevation2NW = double.Parse(xtr.ReadElementContentAsString()); + break; + case "ElevationHighSE": + settings.Elevation2SE = double.Parse(xtr.ReadElementContentAsString()); + break; + case "ElevationHighNE": + settings.Elevation2NE = double.Parse(xtr.ReadElementContentAsString()); + break; + } + } + + xtr.ReadEndElement(); + xtr.ReadStartElement("Terrain"); + + while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) + { + switch (xtr.Name) + { + case "WaterHeight": + settings.WaterHeight = double.Parse(xtr.ReadElementContentAsString()); + break; + case "TerrainRaiseLimit": + settings.TerrainRaiseLimit = double.Parse(xtr.ReadElementContentAsString()); + break; + case "TerrainLowerLimit": + settings.TerrainLowerLimit = double.Parse(xtr.ReadElementContentAsString()); + break; + case "UseEstateSun": + settings.UseEstateSun = bool.Parse(xtr.ReadElementContentAsString()); + break; + case "FixedSun": + settings.FixedSun = bool.Parse(xtr.ReadElementContentAsString()); + break; + } + } + + xtr.Close(); + sr.Close(); + + return settings; + } + + public static string Serialize(RegionSettings settings) + { + StringWriter sw = new StringWriter(); + XmlTextWriter xtw = new XmlTextWriter(sw); + xtw.Formatting = Formatting.Indented; + xtw.WriteStartDocument(); + + xtw.WriteStartElement("RegionSettings"); + + xtw.WriteStartElement("General"); + xtw.WriteElementString("AllowDamage", settings.AllowDamage.ToString()); + xtw.WriteElementString("AllowLandResell", settings.AllowLandResell.ToString()); + xtw.WriteElementString("AllowLandJoinDivide", settings.AllowLandJoinDivide.ToString()); + xtw.WriteElementString("BlockFly", settings.BlockFly.ToString()); + xtw.WriteElementString("BlockLandShowInSearch", settings.BlockShowInSearch.ToString()); + xtw.WriteElementString("BlockTerraform", settings.BlockTerraform.ToString()); + xtw.WriteElementString("DisableCollisions", settings.DisableCollisions.ToString()); + xtw.WriteElementString("DisablePhysics", settings.DisablePhysics.ToString()); + xtw.WriteElementString("DisableScripts", settings.DisableScripts.ToString()); + xtw.WriteElementString("MaturityRating", settings.Maturity.ToString()); + xtw.WriteElementString("RestrictPushing", settings.RestrictPushing.ToString()); + xtw.WriteElementString("AgentLimit", settings.AgentLimit.ToString()); + xtw.WriteElementString("ObjectBonus", settings.ObjectBonus.ToString()); + xtw.WriteEndElement(); + + xtw.WriteStartElement("GroundTextures"); + xtw.WriteElementString("Texture1", settings.TerrainTexture1.ToString()); + xtw.WriteElementString("Texture2", settings.TerrainTexture2.ToString()); + xtw.WriteElementString("Texture3", settings.TerrainTexture3.ToString()); + xtw.WriteElementString("Texture4", settings.TerrainTexture4.ToString()); + xtw.WriteElementString("ElevationLowSW", settings.Elevation1SW.ToString()); + xtw.WriteElementString("ElevationLowNW", settings.Elevation1NW.ToString()); + xtw.WriteElementString("ElevationLowSE", settings.Elevation1SE.ToString()); + xtw.WriteElementString("ElevationLowNE", settings.Elevation1NE.ToString()); + xtw.WriteElementString("ElevationHighSW", settings.Elevation2SW.ToString()); + xtw.WriteElementString("ElevationHighNW", settings.Elevation2NW.ToString()); + xtw.WriteElementString("ElevationHighSE", settings.Elevation2SE.ToString()); + xtw.WriteElementString("ElevationHighNE", settings.Elevation2NE.ToString()); + xtw.WriteEndElement(); + + xtw.WriteStartElement("Terrain"); + xtw.WriteElementString("WaterHeight", settings.WaterHeight.ToString()); + xtw.WriteElementString("TerrainRaiseLimit", settings.TerrainRaiseLimit.ToString()); + xtw.WriteElementString("TerrainLowerLimit", settings.TerrainLowerLimit.ToString()); + xtw.WriteElementString("UseEstateSun", settings.UseEstateSun.ToString()); + xtw.WriteElementString("FixedSun", settings.FixedSun.ToString()); + // XXX: Need to expose interface to get sun phase information from sun module + // xtw.WriteStartElement("SunPhase", + xtw.WriteEndElement(); + + xtw.WriteEndElement(); + + xtw.Close(); + sw.Close(); + + return sw.ToString(); + } + } +} diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 8b603b4..3f6e822 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -36,6 +36,7 @@ using log4net; using OpenMetaverse; using OpenSim.Framework; using OpenSim.Framework.Serialization; +using OpenSim.Framework.Serialization.External; using OpenSim.Framework.Communications.Cache; using OpenSim.Region.CoreModules.World.Terrain; using OpenSim.Region.Framework.Interfaces; diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs index db74564..85391b3 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestExecution.cs @@ -34,6 +34,7 @@ using log4net; using OpenMetaverse; using OpenSim.Framework; using OpenSim.Framework.Serialization; +using OpenSim.Framework.Serialization.External; using OpenSim.Region.CoreModules.World.Terrain; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; diff --git a/OpenSim/Region/CoreModules/World/Archiver/RegionSettingsSerializer.cs b/OpenSim/Region/CoreModules/World/Archiver/RegionSettingsSerializer.cs deleted file mode 100644 index 799dcb9..0000000 --- a/OpenSim/Region/CoreModules/World/Archiver/RegionSettingsSerializer.cs +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSim Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System.IO; -using System.Text; -using System.Xml; -using OpenMetaverse; -using OpenSim.Framework; - -namespace OpenSim.Region.CoreModules.World.Archiver -{ - /// - /// Serialize and deserialize region settings for an archive file format. - /// - /// We didn't simply use automatic .NET serializagion for OpenSim.Framework.RegionSettings since this is really - /// a file format rather than an object serialization. - /// TODO: However, we could still have used separate non-framework classes here to read and write the xml - /// automatically rather than laboriously doing it by hand using XmlTextReader and Writer. Should switch to this - /// in the future. - public class RegionSettingsSerializer - { - protected static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding(); - - /// - /// Deserialize region settings - /// - /// - /// - /// - public static RegionSettings Deserialize(byte[] serializedSettings) - { - return Deserialize(m_asciiEncoding.GetString(serializedSettings, 0, serializedSettings.Length)); - } - - /// - /// Deserialize region settings - /// - /// - /// - /// - public static RegionSettings Deserialize(string serializedSettings) - { - RegionSettings settings = new RegionSettings(); - - StringReader sr = new StringReader(serializedSettings); - XmlTextReader xtr = new XmlTextReader(sr); - - xtr.ReadStartElement("RegionSettings"); - - xtr.ReadStartElement("General"); - - while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) - { - switch (xtr.Name) - { - case "AllowDamage": - settings.AllowDamage = bool.Parse(xtr.ReadElementContentAsString()); - break; - case "AllowLandResell": - settings.AllowLandResell = bool.Parse(xtr.ReadElementContentAsString()); - break; - case "AllowLandJoinDivide": - settings.AllowLandJoinDivide = bool.Parse(xtr.ReadElementContentAsString()); - break; - case "BlockFly": - settings.BlockFly = bool.Parse(xtr.ReadElementContentAsString()); - break; - case "BlockLandShowInSearch": - settings.BlockShowInSearch = bool.Parse(xtr.ReadElementContentAsString()); - break; - case "BlockTerraform": - settings.BlockTerraform = bool.Parse(xtr.ReadElementContentAsString()); - break; - case "DisableCollisions": - settings.DisableCollisions = bool.Parse(xtr.ReadElementContentAsString()); - break; - case "DisablePhysics": - settings.DisablePhysics = bool.Parse(xtr.ReadElementContentAsString()); - break; - case "DisableScripts": - settings.DisableScripts = bool.Parse(xtr.ReadElementContentAsString()); - break; - case "MaturityRating": - settings.Maturity = int.Parse(xtr.ReadElementContentAsString()); - break; - case "RestrictPushing": - settings.RestrictPushing = bool.Parse(xtr.ReadElementContentAsString()); - break; - case "AgentLimit": - settings.AgentLimit = int.Parse(xtr.ReadElementContentAsString()); - break; - case "ObjectBonus": - settings.ObjectBonus = double.Parse(xtr.ReadElementContentAsString()); - break; - } - } - - xtr.ReadEndElement(); - xtr.ReadStartElement("GroundTextures"); - - while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) - { - switch (xtr.Name) - { - case "Texture1": - settings.TerrainTexture1 = UUID.Parse(xtr.ReadElementContentAsString()); - break; - case "Texture2": - settings.TerrainTexture2 = UUID.Parse(xtr.ReadElementContentAsString()); - break; - case "Texture3": - settings.TerrainTexture3 = UUID.Parse(xtr.ReadElementContentAsString()); - break; - case "Texture4": - settings.TerrainTexture4 = UUID.Parse(xtr.ReadElementContentAsString()); - break; - case "ElevationLowSW": - settings.Elevation1SW = double.Parse(xtr.ReadElementContentAsString()); - break; - case "ElevationLowNW": - settings.Elevation1NW = double.Parse(xtr.ReadElementContentAsString()); - break; - case "ElevationLowSE": - settings.Elevation1SE = double.Parse(xtr.ReadElementContentAsString()); - break; - case "ElevationLowNE": - settings.Elevation1NE = double.Parse(xtr.ReadElementContentAsString()); - break; - case "ElevationHighSW": - settings.Elevation2SW = double.Parse(xtr.ReadElementContentAsString()); - break; - case "ElevationHighNW": - settings.Elevation2NW = double.Parse(xtr.ReadElementContentAsString()); - break; - case "ElevationHighSE": - settings.Elevation2SE = double.Parse(xtr.ReadElementContentAsString()); - break; - case "ElevationHighNE": - settings.Elevation2NE = double.Parse(xtr.ReadElementContentAsString()); - break; - } - } - - xtr.ReadEndElement(); - xtr.ReadStartElement("Terrain"); - - while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement) - { - switch (xtr.Name) - { - case "WaterHeight": - settings.WaterHeight = double.Parse(xtr.ReadElementContentAsString()); - break; - case "TerrainRaiseLimit": - settings.TerrainRaiseLimit = double.Parse(xtr.ReadElementContentAsString()); - break; - case "TerrainLowerLimit": - settings.TerrainLowerLimit = double.Parse(xtr.ReadElementContentAsString()); - break; - case "UseEstateSun": - settings.UseEstateSun = bool.Parse(xtr.ReadElementContentAsString()); - break; - case "FixedSun": - settings.FixedSun = bool.Parse(xtr.ReadElementContentAsString()); - break; - } - } - - xtr.Close(); - sr.Close(); - - return settings; - } - - public static string Serialize(RegionSettings settings) - { - StringWriter sw = new StringWriter(); - XmlTextWriter xtw = new XmlTextWriter(sw); - xtw.Formatting = Formatting.Indented; - xtw.WriteStartDocument(); - - xtw.WriteStartElement("RegionSettings"); - - xtw.WriteStartElement("General"); - xtw.WriteElementString("AllowDamage", settings.AllowDamage.ToString()); - xtw.WriteElementString("AllowLandResell", settings.AllowLandResell.ToString()); - xtw.WriteElementString("AllowLandJoinDivide", settings.AllowLandJoinDivide.ToString()); - xtw.WriteElementString("BlockFly", settings.BlockFly.ToString()); - xtw.WriteElementString("BlockLandShowInSearch", settings.BlockShowInSearch.ToString()); - xtw.WriteElementString("BlockTerraform", settings.BlockTerraform.ToString()); - xtw.WriteElementString("DisableCollisions", settings.DisableCollisions.ToString()); - xtw.WriteElementString("DisablePhysics", settings.DisablePhysics.ToString()); - xtw.WriteElementString("DisableScripts", settings.DisableScripts.ToString()); - xtw.WriteElementString("MaturityRating", settings.Maturity.ToString()); - xtw.WriteElementString("RestrictPushing", settings.RestrictPushing.ToString()); - xtw.WriteElementString("AgentLimit", settings.AgentLimit.ToString()); - xtw.WriteElementString("ObjectBonus", settings.ObjectBonus.ToString()); - xtw.WriteEndElement(); - - xtw.WriteStartElement("GroundTextures"); - xtw.WriteElementString("Texture1", settings.TerrainTexture1.ToString()); - xtw.WriteElementString("Texture2", settings.TerrainTexture2.ToString()); - xtw.WriteElementString("Texture3", settings.TerrainTexture3.ToString()); - xtw.WriteElementString("Texture4", settings.TerrainTexture4.ToString()); - xtw.WriteElementString("ElevationLowSW", settings.Elevation1SW.ToString()); - xtw.WriteElementString("ElevationLowNW", settings.Elevation1NW.ToString()); - xtw.WriteElementString("ElevationLowSE", settings.Elevation1SE.ToString()); - xtw.WriteElementString("ElevationLowNE", settings.Elevation1NE.ToString()); - xtw.WriteElementString("ElevationHighSW", settings.Elevation2SW.ToString()); - xtw.WriteElementString("ElevationHighNW", settings.Elevation2NW.ToString()); - xtw.WriteElementString("ElevationHighSE", settings.Elevation2SE.ToString()); - xtw.WriteElementString("ElevationHighNE", settings.Elevation2NE.ToString()); - xtw.WriteEndElement(); - - xtw.WriteStartElement("Terrain"); - xtw.WriteElementString("WaterHeight", settings.WaterHeight.ToString()); - xtw.WriteElementString("TerrainRaiseLimit", settings.TerrainRaiseLimit.ToString()); - xtw.WriteElementString("TerrainLowerLimit", settings.TerrainLowerLimit.ToString()); - xtw.WriteElementString("UseEstateSun", settings.UseEstateSun.ToString()); - xtw.WriteElementString("FixedSun", settings.FixedSun.ToString()); - // XXX: Need to expose interface to get sun phase information from sun module - // xtw.WriteStartElement("SunPhase", - xtw.WriteEndElement(); - - xtw.WriteEndElement(); - - xtw.Close(); - sw.Close(); - - return sw.ToString(); - } - } -} diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index e4fcc9c..9f5932a 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -688,10 +688,10 @@ InterregionComms = "RESTComms" [Wind] - ; Enables the wind module. Default is true - enabled = true - ; Adjusts wind strength. 0.0 = no wind, 1.0 = normal wind. Default is 1.0 - strength = 1.0 + ; Enables the wind module. Default is true + enabled = true + ; Adjusts wind strength. 0.0 = no wind, 1.0 = normal wind. Default is 1.0 + strength = 1.0 [Trees] -- cgit v1.1