diff options
author | Adam Frisby | 2008-03-30 09:03:38 +0000 |
---|---|---|
committer | Adam Frisby | 2008-03-30 09:03:38 +0000 |
commit | fadd19f3140107d7c09e7a82a97dfb490146ccb9 (patch) | |
tree | 3ce4581ef1af79d451f0b24ce50128f09482f386 /OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs | |
parent | This update has good news and bad news, first the bad. (diff) | |
download | opensim-SC_OLD-fadd19f3140107d7c09e7a82a97dfb490146ccb9.zip opensim-SC_OLD-fadd19f3140107d7c09e7a82a97dfb490146ccb9.tar.gz opensim-SC_OLD-fadd19f3140107d7c09e7a82a97dfb490146ccb9.tar.bz2 opensim-SC_OLD-fadd19f3140107d7c09e7a82a97dfb490146ccb9.tar.xz |
**Big ass update warning**
* Renamed plugin console message, to send a message to a plugin, use either "plugin <message>", or any unrecognised message will be sent ("plugin" sends explicitly) This replaces the old "script <message>".
* Terrain commands - "terrain <command>" now works again. "Script terrain <command>" 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.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs | 181 |
1 files changed, 143 insertions, 38 deletions
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; | |||
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Region.Environment.Interfaces; | 34 | using OpenSim.Region.Environment.Interfaces; |
35 | using OpenSim.Region.Environment.Scenes; | 35 | using OpenSim.Region.Environment.Scenes; |
36 | using OpenSim.Region.Environment.Modules.ModuleFramework; | ||
36 | 37 | ||
37 | 38 | ||
38 | namespace OpenSim.Region.Environment.Modules.Terrain | 39 | namespace OpenSim.Region.Environment.Modules.Terrain |
39 | { | 40 | { |
40 | public class TerrainModule : IRegionModule , ITerrainTemp | 41 | public class TerrainModule : IRegionModule , ITerrainTemp, ICommandableModule |
41 | { | 42 | { |
42 | public enum StandardTerrainEffects : byte | 43 | public enum StandardTerrainEffects : byte |
43 | { | 44 | { |
@@ -51,6 +52,8 @@ namespace OpenSim.Region.Environment.Modules.Terrain | |||
51 | 52 | ||
52 | private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 53 | private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
53 | 54 | ||
55 | private Commander m_commander = new Commander("Terrain"); | ||
56 | |||
54 | private Dictionary<StandardTerrainEffects, ITerrainPaintableEffect> m_painteffects = | 57 | private Dictionary<StandardTerrainEffects, ITerrainPaintableEffect> m_painteffects = |
55 | new Dictionary<StandardTerrainEffects, ITerrainPaintableEffect>(); | 58 | new Dictionary<StandardTerrainEffects, ITerrainPaintableEffect>(); |
56 | private Dictionary<StandardTerrainEffects, ITerrainFloodEffect> m_floodeffects = | 59 | private Dictionary<StandardTerrainEffects, ITerrainFloodEffect> m_floodeffects = |
@@ -109,7 +112,44 @@ namespace OpenSim.Region.Environment.Modules.Terrain | |||
109 | { | 112 | { |
110 | lock (m_scene) | 113 | lock (m_scene) |
111 | { | 114 | { |
112 | ITerrainChannel channel = loader.Value.LoadFile(filename); | 115 | try |
116 | { | ||
117 | ITerrainChannel channel = loader.Value.LoadFile(filename); | ||
118 | m_scene.Heightmap = channel; | ||
119 | m_channel = channel; | ||
120 | UpdateRevertMap(); | ||
121 | } | ||
122 | catch (NotImplementedException) | ||
123 | { | ||
124 | m_log.Error("[TERRAIN]: Unable to load heightmap, the " + loader.Value.ToString() + " parser does not support file loading. (May be save only)"); | ||
125 | return; | ||
126 | } | ||
127 | catch (System.IO.FileNotFoundException) | ||
128 | { | ||
129 | m_log.Error("[TERRAIN]: Unable to load heightmap, file not found. (A directory permissions error may also cause this)"); | ||
130 | return; | ||
131 | } | ||
132 | } | ||
133 | m_log.Info("[TERRAIN]: File (" + filename + ") loaded successfully"); | ||
134 | return; | ||
135 | } | ||
136 | } | ||
137 | m_log.Error("[TERRAIN]: Unable to load heightmap, no file loader availible for that format."); | ||
138 | } | ||
139 | |||
140 | public void LoadFromFile(string filename, int fileWidth, int fileHeight, int fileStartX, int fileStartY) | ||
141 | { | ||
142 | fileStartX -= (int)m_scene.RegionInfo.RegionLocX; | ||
143 | fileStartY -= (int)m_scene.RegionInfo.RegionLocY; | ||
144 | |||
145 | foreach (KeyValuePair<string, ITerrainLoader> loader in m_loaders) | ||
146 | { | ||
147 | if (filename.EndsWith(loader.Key)) | ||
148 | { | ||
149 | lock (m_scene) | ||
150 | { | ||
151 | ITerrainChannel channel = loader.Value.LoadFile(filename, fileStartX, fileStartY, | ||
152 | fileWidth, fileHeight, (int)Constants.RegionSize, (int)Constants.RegionSize); | ||
113 | m_scene.Heightmap = channel; | 153 | m_scene.Heightmap = channel; |
114 | m_channel = channel; | 154 | m_channel = channel; |
115 | UpdateRevertMap(); | 155 | UpdateRevertMap(); |
@@ -177,46 +217,101 @@ namespace OpenSim.Region.Environment.Modules.Terrain | |||
177 | } | 217 | } |
178 | } | 218 | } |
179 | 219 | ||
180 | void EventManager_OnPluginConsole(string[] args) | 220 | #region Console Commands |
221 | |||
222 | private void InterfaceLoadFile(Object[] args) | ||
181 | { | 223 | { |
182 | if (args[0] == "terrain") | 224 | LoadFromFile((string)args[0]); |
225 | } | ||
226 | |||
227 | private void InterfaceLoadTileFile(Object[] args) | ||
228 | { | ||
229 | LoadFromFile((string)args[0], | ||
230 | (int)args[1], | ||
231 | (int)args[2], | ||
232 | (int)args[3], | ||
233 | (int)args[4]); | ||
234 | } | ||
235 | |||
236 | private void InterfaceSaveFile(Object[] args) | ||
237 | { | ||
238 | SaveToFile((string)args[0]); | ||
239 | } | ||
240 | |||
241 | private void InterfaceFillTerrain(Object[] args) | ||
242 | { | ||
243 | int x, y; | ||
244 | |||
245 | for (x = 0; x < m_channel.Width; x++) | ||
246 | for (y = 0; y < m_channel.Height; y++) | ||
247 | m_channel[x, y] = (double)args[0]; | ||
248 | SendUpdatedLayerData(); | ||
249 | } | ||
250 | |||
251 | private void InterfaceEnableExperimentalBrushes(Object[] args) | ||
252 | { | ||
253 | if ((bool)args[0]) | ||
183 | { | 254 | { |
184 | string command = args[1]; | 255 | m_painteffects[StandardTerrainEffects.Revert] = new PaintBrushes.WeatherSphere(); |
185 | string param = args[2]; | 256 | m_painteffects[StandardTerrainEffects.Flatten] = new PaintBrushes.OlsenSphere(); |
257 | m_painteffects[StandardTerrainEffects.Smooth] = new PaintBrushes.ErodeSphere(); | ||
258 | } | ||
259 | else | ||
260 | { | ||
261 | InstallDefaultEffects(); | ||
262 | } | ||
263 | } | ||
186 | 264 | ||
187 | int x, y; | 265 | private void InstallInterfaces() |
266 | { | ||
267 | // Load / Save | ||
268 | string supportedFileExtensions = ""; | ||
269 | foreach (KeyValuePair<string,ITerrainLoader> loader in m_loaders) | ||
270 | supportedFileExtensions += " " + loader.Key + " (" + loader.Value.ToString() + ")"; | ||
271 | |||
272 | Command loadFromFileCommand = new Command("load", InterfaceLoadFile, "Loads a terrain from a specified file."); | ||
273 | loadFromFileCommand.AddArgument("filename", "The file you wish to load from, the file extension determines the loader to be used. Supported extensions include: " + supportedFileExtensions, "String"); | ||
274 | |||
275 | Command saveToFileCommand = new Command("save", InterfaceSaveFile, "Saves the current heightmap to a specified file."); | ||
276 | saveToFileCommand.AddArgument("filename", "The destination filename for your heightmap, the file extension determines the format to save in. Supported extensions include: " + supportedFileExtensions, "String"); | ||
277 | |||
278 | Command loadFromTileCommand = new Command("load-tile", InterfaceLoadTileFile, "Loads a terrain from a section of a larger file."); | ||
279 | loadFromTileCommand.AddArgument("filename", "The file you wish to load from, the file extension determines the loader to be used. Supported extensions include: " + supportedFileExtensions, "String"); | ||
280 | loadFromTileCommand.AddArgument("file width", "The width of the file in tiles", "Integer"); | ||
281 | loadFromTileCommand.AddArgument("file height", "The height of the file in tiles", "Integer"); | ||
282 | loadFromTileCommand.AddArgument("minimum X tile", "The X region coordinate of the first section on the file", "Integer"); | ||
283 | loadFromTileCommand.AddArgument("minimum Y tile", "The Y region coordinate of the first section on the file", "Integer"); | ||
284 | |||
285 | // Terrain adjustments | ||
286 | Command fillRegionCommand = new Command("fill", InterfaceFillTerrain, "Fills the current heightmap with a specified value."); | ||
287 | fillRegionCommand.AddArgument("value", "The numeric value of the height you wish to set your region to.", "Double"); | ||
288 | |||
289 | // Brushes | ||
290 | 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."); | ||
291 | experimentalBrushesCommand.AddArgument("Enabled?", "true / false - Enable new brushes", "Boolean"); | ||
292 | |||
293 | m_commander.RegisterCommand("load", loadFromFileCommand); | ||
294 | m_commander.RegisterCommand("load-tile", loadFromTileCommand); | ||
295 | m_commander.RegisterCommand("save", saveToFileCommand); | ||
296 | m_commander.RegisterCommand("fill", fillRegionCommand); | ||
297 | m_commander.RegisterCommand("newbrushes", experimentalBrushesCommand); | ||
298 | |||
299 | // Add this to our scene so scripts can call these functions | ||
300 | //TMPm_scene.RegisterModuleCommander("Terrain", m_commander); | ||
301 | } | ||
188 | 302 | ||
189 | switch (command) | 303 | #endregion |
190 | { | 304 | |
191 | case "load": | 305 | void EventManager_OnPluginConsole(string[] args) |
192 | LoadFromFile(param); | 306 | { |
193 | SendUpdatedLayerData(); | 307 | if (args[0] == "terrain") |
194 | break; | 308 | { |
195 | case "save": | 309 | string[] tmpArgs = new string[args.Length - 2]; |
196 | SaveToFile(param); | 310 | int i = 0; |
197 | break; | 311 | for (i = 2; i < args.Length; i++) |
198 | case "fill": | 312 | tmpArgs[i - 2] = args[i]; |
199 | for (x = 0; x < m_channel.Width; x++) | 313 | |
200 | for (y = 0; y < m_channel.Height; y++) | 314 | m_commander.ProcessConsoleCommand(args[1], tmpArgs); |
201 | m_channel[x, y] = Double.Parse(param); | ||
202 | SendUpdatedLayerData(); | ||
203 | break; | ||
204 | case "newbrushes": | ||
205 | if (Boolean.Parse(param)) | ||
206 | { | ||
207 | m_painteffects[StandardTerrainEffects.Revert] = new PaintBrushes.WeatherSphere(); | ||
208 | m_painteffects[StandardTerrainEffects.Flatten] = new PaintBrushes.OlsenSphere(); | ||
209 | m_painteffects[StandardTerrainEffects.Smooth] = new PaintBrushes.ErodeSphere(); | ||
210 | } | ||
211 | else | ||
212 | { | ||
213 | InstallDefaultEffects(); | ||
214 | } | ||
215 | break; | ||
216 | default: | ||
217 | m_log.Warn("Unknown terrain command."); | ||
218 | break; | ||
219 | } | ||
220 | } | 315 | } |
221 | } | 316 | } |
222 | 317 | ||
@@ -363,6 +458,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain | |||
363 | public void PostInitialise() | 458 | public void PostInitialise() |
364 | { | 459 | { |
365 | InstallDefaultEffects(); | 460 | InstallDefaultEffects(); |
461 | InstallInterfaces(); | ||
366 | } | 462 | } |
367 | 463 | ||
368 | public void Close() | 464 | public void Close() |
@@ -378,5 +474,14 @@ namespace OpenSim.Region.Environment.Modules.Terrain | |||
378 | { | 474 | { |
379 | get { return false; } | 475 | get { return false; } |
380 | } | 476 | } |
477 | |||
478 | #region ICommandable Members | ||
479 | |||
480 | public ICommander CommandInterface | ||
481 | { | ||
482 | get { return m_commander; } | ||
483 | } | ||
484 | |||
485 | #endregion | ||
381 | } | 486 | } |
382 | } | 487 | } |