diff --git a/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs b/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs
index 4f8b377eda..24b3f506c7 100644
--- a/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs
@@ -49,6 +49,11 @@ namespace OpenSim.Region.Environment.Modules.Terrain
void FloodEffect(ITerrainChannel map, Boolean[,] fillArea, double strength);
}
+ public interface ITerrainEffect
+ {
+ void RunEffect(ITerrainChannel map, double strength);
+ }
+
///
/// A new version of the old Channel class, simplified
///
@@ -103,16 +108,97 @@ namespace OpenSim.Region.Environment.Modules.Terrain
}
}
+ public enum StandardTerrainEffects : byte
+ {
+ Flatten = 0,
+ Raise = 1,
+ Lower = 2,
+ Smooth = 3,
+ Noise = 4,
+ Revert = 5
+ }
+
public class TerrainModule : IRegionModule
{
- Scene m_scene;
+ private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ private Dictionary m_painteffects =
+ new Dictionary();
+ private Dictionary m_floodeffects =
+ new Dictionary();
+ Scene m_scene;
+ ITerrainChannel m_channel;
private IConfigSource m_gConfig;
+ private void InstallDefaultEffects()
+ {
+ m_painteffects[StandardTerrainEffects.Raise] = new PaintBrushes.RaiseSphere();
+ m_floodeffects[StandardTerrainEffects.Raise] = new FloodBrushes.RaiseArea();
+ }
+
public void Initialise(Scene scene, IConfigSource config)
{
m_scene = scene;
m_gConfig = config;
+
+ m_channel = new TerrainChannel();
+ m_scene.EventManager.OnNewClient += EventManager_OnNewClient;
+ }
+
+ void EventManager_OnNewClient(IClientAPI client)
+ {
+ client.OnModifyTerrain += client_OnModifyTerrain;
+ }
+
+ void client_OnModifyTerrain(float height, float seconds, byte size, byte action, float north, float west, float south, float east, IClientAPI remoteClient)
+ {
+ // Not a good permissions check, if in area mode, need to check the entire area.
+ if (m_scene.PermissionsMngr.CanTerraform(remoteClient.AgentId, new LLVector3(north, west, 0)))
+ {
+
+ if (north == south && east == west)
+ {
+ if (m_painteffects.ContainsKey((StandardTerrainEffects)action))
+ {
+ m_painteffects[(StandardTerrainEffects)action].PaintEffect(
+ m_channel, west, south, Math.Pow(size, 2.0));
+ }
+ else
+ {
+ m_log.Debug("Unknown terrain brush type " + action.ToString());
+ }
+ }
+ else
+ {
+ if (m_floodeffects.ContainsKey((StandardTerrainEffects)action))
+ {
+ bool[,] fillArea = new bool[m_channel.Width, m_channel.Height];
+
+ fillArea.Initialize();
+
+ int x, y;
+ for (x = 0; x < m_channel.Width; x++)
+ {
+ for (y = 0; y < m_channel.Height; y++)
+ {
+ fillArea[x, y] = true;
+ }
+ }
+
+ m_floodeffects[(StandardTerrainEffects)action].FloodEffect(
+ m_channel, fillArea, Math.Pow(size, 2.0));
+ }
+ else
+ {
+ m_log.Debug("Unknown terrain flood type " + action.ToString());
+ }
+ }
+ }
+ }
+
+ public void PostInitialise()
+ {
+ InstallDefaultEffects();
}
public void Close()
@@ -128,9 +214,5 @@ namespace OpenSim.Region.Environment.Modules.Terrain
{
get { return false; }
}
-
- public void PostInitialise()
- {
- }
}
}