From fadd19f3140107d7c09e7a82a97dfb490146ccb9 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Sun, 30 Mar 2008 09:03:38 +0000 Subject: **Big ass update warning** * Renamed plugin console message, to send a message to a plugin, use either "plugin ", or any unrecognised message will be sent ("plugin" sends explicitly) This replaces the old "script ". * Terrain commands - "terrain " now works again. "Script terrain " does not. Many of the commands have now been reimplemented, eg load-tile. However some have new syntax. * New console command handler, you can now use things like "terrain help" or "terrain save help". See TerrainModule.cs for an example of how to use the new "Commander" class. * Commander class - advanced processing of console input and also enables a script API to be generated from registered console commands. --- .../Modules/Terrain/FileLoaders/JPEG.cs | 10 ++ .../Modules/Terrain/FileLoaders/LLRAW.cs | 10 ++ .../Modules/Terrain/FileLoaders/RAW32.cs | 37 +++++ .../Modules/Terrain/FileLoaders/Terragen.cs | 10 ++ .../Environment/Modules/Terrain/ITerrainLoader.cs | 1 + .../Environment/Modules/Terrain/TerrainModule.cs | 181 ++++++++++++++++----- 6 files changed, 211 insertions(+), 38 deletions(-) (limited to 'OpenSim/Region/Environment/Modules/Terrain') diff --git a/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/JPEG.cs b/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/JPEG.cs index f2bdde7..d6430cd 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/JPEG.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/JPEG.cs @@ -41,6 +41,16 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FileLoaders throw new NotImplementedException(); } + public ITerrainChannel LoadFile(string filename, int x, int y, int fileWidth, int fileHeight, int w, int h) + { + throw new NotImplementedException(); + } + + public override string ToString() + { + return "JPEG"; + } + private Bitmap CreateBitmapFromMap(ITerrainChannel map) { Bitmap gradientmapLd = new Bitmap("defaultstripe.png"); diff --git a/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/LLRAW.cs b/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/LLRAW.cs index 2d7d94f..7436dc5 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/LLRAW.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/LLRAW.cs @@ -58,6 +58,16 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FileLoaders return retval; } + public override string ToString() + { + return "LL/SL RAW"; + } + + public ITerrainChannel LoadFile(string filename, int x, int y, int fileWidth, int fileHeight, int w, int h) + { + throw new NotImplementedException(); + } + public void SaveFile(string filename, ITerrainChannel map) { FileInfo file = new FileInfo(filename); diff --git a/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/RAW32.cs b/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/RAW32.cs index ba430b7..fc81376 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/RAW32.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/RAW32.cs @@ -57,6 +57,43 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FileLoaders return retval; } + public override string ToString() + { + return "RAW32"; + } + + public ITerrainChannel LoadFile(string filename, int fileStartX, int fileStartY, int fileWidth, int fileHeight, int sectionWidth, int sectionHeight) + { + TerrainChannel retval = new TerrainChannel(sectionWidth, sectionHeight); + + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.Open, FileAccess.Read); + BinaryReader bs = new BinaryReader(s); + + // Advance to our section of the file + if (fileStartY * sectionHeight > 0) + bs.ReadBytes(fileStartY * sectionHeight); + + int x, y; + for (y = 0; y < retval.Height; y++) + { + // Advance the stream if we aren't at the start of the section in the file + if (fileStartX * sectionWidth > 0) + bs.ReadBytes(fileStartX * sectionHeight); + + for (x = 0; x < retval.Width; x++) + { + // Read a strip and continue + retval[x, y] = bs.ReadSingle(); + } + } + + bs.Close(); + s.Close(); + + return retval; + } + public void SaveFile(string filename, ITerrainChannel map) { FileInfo file = new FileInfo(filename); diff --git a/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/Terragen.cs b/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/Terragen.cs index e136397..6a3c354 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/Terragen.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/FileLoaders/Terragen.cs @@ -107,6 +107,16 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FileLoaders throw new NotImplementedException(); } + public override string ToString() + { + return "Terragen"; + } + + public ITerrainChannel LoadFile(string filename, int x, int y, int fileWidth, int fileHeight, int w, int h) + { + throw new NotImplementedException(); + } + #endregion } } diff --git a/OpenSim/Region/Environment/Modules/Terrain/ITerrainLoader.cs b/OpenSim/Region/Environment/Modules/Terrain/ITerrainLoader.cs index 9b713f5..2c391df 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/ITerrainLoader.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/ITerrainLoader.cs @@ -32,6 +32,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain public interface ITerrainLoader { ITerrainChannel LoadFile(string filename); + ITerrainChannel LoadFile(string filename, int fileStartX, int fileStartY, int fileWidth, int fileHeight, int sectionWidth, int sectionHeight); void SaveFile(string filename, ITerrainChannel map); } } diff --git a/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs b/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs index 742ea5b..745118b 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs @@ -33,11 +33,12 @@ using Nini.Config; using OpenSim.Framework; using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Environment.Modules.ModuleFramework; namespace OpenSim.Region.Environment.Modules.Terrain { - public class TerrainModule : IRegionModule , ITerrainTemp + public class TerrainModule : IRegionModule , ITerrainTemp, ICommandableModule { public enum StandardTerrainEffects : byte { @@ -51,6 +52,8 @@ namespace OpenSim.Region.Environment.Modules.Terrain private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + private Commander m_commander = new Commander("Terrain"); + private Dictionary m_painteffects = new Dictionary(); private Dictionary m_floodeffects = @@ -109,7 +112,44 @@ namespace OpenSim.Region.Environment.Modules.Terrain { lock (m_scene) { - ITerrainChannel channel = loader.Value.LoadFile(filename); + try + { + ITerrainChannel channel = loader.Value.LoadFile(filename); + m_scene.Heightmap = channel; + m_channel = channel; + UpdateRevertMap(); + } + catch (NotImplementedException) + { + m_log.Error("[TERRAIN]: Unable to load heightmap, the " + loader.Value.ToString() + " parser does not support file loading. (May be save only)"); + return; + } + catch (System.IO.FileNotFoundException) + { + m_log.Error("[TERRAIN]: Unable to load heightmap, file not found. (A directory permissions error may also cause this)"); + return; + } + } + m_log.Info("[TERRAIN]: File (" + filename + ") loaded successfully"); + return; + } + } + m_log.Error("[TERRAIN]: Unable to load heightmap, no file loader availible for that format."); + } + + public void LoadFromFile(string filename, int fileWidth, int fileHeight, int fileStartX, int fileStartY) + { + fileStartX -= (int)m_scene.RegionInfo.RegionLocX; + fileStartY -= (int)m_scene.RegionInfo.RegionLocY; + + foreach (KeyValuePair loader in m_loaders) + { + if (filename.EndsWith(loader.Key)) + { + lock (m_scene) + { + ITerrainChannel channel = loader.Value.LoadFile(filename, fileStartX, fileStartY, + fileWidth, fileHeight, (int)Constants.RegionSize, (int)Constants.RegionSize); m_scene.Heightmap = channel; m_channel = channel; UpdateRevertMap(); @@ -177,46 +217,101 @@ namespace OpenSim.Region.Environment.Modules.Terrain } } - void EventManager_OnPluginConsole(string[] args) + #region Console Commands + + private void InterfaceLoadFile(Object[] args) { - if (args[0] == "terrain") + LoadFromFile((string)args[0]); + } + + private void InterfaceLoadTileFile(Object[] args) + { + LoadFromFile((string)args[0], + (int)args[1], + (int)args[2], + (int)args[3], + (int)args[4]); + } + + private void InterfaceSaveFile(Object[] args) + { + SaveToFile((string)args[0]); + } + + private void InterfaceFillTerrain(Object[] args) + { + int x, y; + + for (x = 0; x < m_channel.Width; x++) + for (y = 0; y < m_channel.Height; y++) + m_channel[x, y] = (double)args[0]; + SendUpdatedLayerData(); + } + + private void InterfaceEnableExperimentalBrushes(Object[] args) + { + if ((bool)args[0]) { - string command = args[1]; - string param = args[2]; + m_painteffects[StandardTerrainEffects.Revert] = new PaintBrushes.WeatherSphere(); + m_painteffects[StandardTerrainEffects.Flatten] = new PaintBrushes.OlsenSphere(); + m_painteffects[StandardTerrainEffects.Smooth] = new PaintBrushes.ErodeSphere(); + } + else + { + InstallDefaultEffects(); + } + } - int x, y; + private void InstallInterfaces() + { + // Load / Save + string supportedFileExtensions = ""; + foreach (KeyValuePair loader in m_loaders) + supportedFileExtensions += " " + loader.Key + " (" + loader.Value.ToString() + ")"; + + Command loadFromFileCommand = new Command("load", InterfaceLoadFile, "Loads a terrain from a specified file."); + loadFromFileCommand.AddArgument("filename", "The file you wish to load from, the file extension determines the loader to be used. Supported extensions include: " + supportedFileExtensions, "String"); + + Command saveToFileCommand = new Command("save", InterfaceSaveFile, "Saves the current heightmap to a specified file."); + saveToFileCommand.AddArgument("filename", "The destination filename for your heightmap, the file extension determines the format to save in. Supported extensions include: " + supportedFileExtensions, "String"); + + Command loadFromTileCommand = new Command("load-tile", InterfaceLoadTileFile, "Loads a terrain from a section of a larger file."); + loadFromTileCommand.AddArgument("filename", "The file you wish to load from, the file extension determines the loader to be used. Supported extensions include: " + supportedFileExtensions, "String"); + loadFromTileCommand.AddArgument("file width", "The width of the file in tiles", "Integer"); + loadFromTileCommand.AddArgument("file height", "The height of the file in tiles", "Integer"); + loadFromTileCommand.AddArgument("minimum X tile", "The X region coordinate of the first section on the file", "Integer"); + loadFromTileCommand.AddArgument("minimum Y tile", "The Y region coordinate of the first section on the file", "Integer"); + + // Terrain adjustments + Command fillRegionCommand = new Command("fill", InterfaceFillTerrain, "Fills the current heightmap with a specified value."); + fillRegionCommand.AddArgument("value", "The numeric value of the height you wish to set your region to.", "Double"); + + // Brushes + Command experimentalBrushesCommand = new Command("newbrushes", InterfaceEnableExperimentalBrushes, "Enables experimental brushes which replace the standard terrain brushes. WARNING: This is a debug setting and may be removed at any time."); + experimentalBrushesCommand.AddArgument("Enabled?", "true / false - Enable new brushes", "Boolean"); + + m_commander.RegisterCommand("load", loadFromFileCommand); + m_commander.RegisterCommand("load-tile", loadFromTileCommand); + m_commander.RegisterCommand("save", saveToFileCommand); + m_commander.RegisterCommand("fill", fillRegionCommand); + m_commander.RegisterCommand("newbrushes", experimentalBrushesCommand); + + // Add this to our scene so scripts can call these functions + //TMPm_scene.RegisterModuleCommander("Terrain", m_commander); + } - switch (command) - { - case "load": - LoadFromFile(param); - SendUpdatedLayerData(); - break; - case "save": - SaveToFile(param); - break; - case "fill": - for (x = 0; x < m_channel.Width; x++) - for (y = 0; y < m_channel.Height; y++) - m_channel[x, y] = Double.Parse(param); - SendUpdatedLayerData(); - break; - case "newbrushes": - if (Boolean.Parse(param)) - { - m_painteffects[StandardTerrainEffects.Revert] = new PaintBrushes.WeatherSphere(); - m_painteffects[StandardTerrainEffects.Flatten] = new PaintBrushes.OlsenSphere(); - m_painteffects[StandardTerrainEffects.Smooth] = new PaintBrushes.ErodeSphere(); - } - else - { - InstallDefaultEffects(); - } - break; - default: - m_log.Warn("Unknown terrain command."); - break; - } + #endregion + + void EventManager_OnPluginConsole(string[] args) + { + if (args[0] == "terrain") + { + string[] tmpArgs = new string[args.Length - 2]; + int i = 0; + for (i = 2; i < args.Length; i++) + tmpArgs[i - 2] = args[i]; + + m_commander.ProcessConsoleCommand(args[1], tmpArgs); } } @@ -363,6 +458,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain public void PostInitialise() { InstallDefaultEffects(); + InstallInterfaces(); } public void Close() @@ -378,5 +474,14 @@ namespace OpenSim.Region.Environment.Modules.Terrain { get { return false; } } + + #region ICommandable Members + + public ICommander CommandInterface + { + get { return m_commander; } + } + + #endregion } } -- cgit v1.1