diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs index 0b51759f72..8377d8474d 100644 --- a/OpenSim/Region/Application/OpenSimMain.cs +++ b/OpenSim/Region/Application/OpenSimMain.cs @@ -61,6 +61,8 @@ namespace OpenSim public bool user_accounts; public bool m_gridLocalAsset; + protected ModuleLoader m_moduleLoader; + protected string m_storageDLL = "OpenSim.DataStore.NullStorage.dll"; protected string m_startupCommandsFile = ""; @@ -168,6 +170,8 @@ namespace OpenSim configFiles = Directory.GetFiles(regionConfigPath, "*.xml"); } + m_moduleLoader = new ModuleLoader(); + // Load all script engines found OpenSim.Region.Environment.Scenes.Scripting.ScriptEngineLoader ScriptEngineLoader = new OpenSim.Region.Environment.Scenes.Scripting.ScriptEngineLoader(m_log); @@ -225,7 +229,7 @@ namespace OpenSim protected override Scene CreateScene(RegionInfo regionInfo, StorageManager storageManager, AgentCircuitManager circuitManager) { - return new Scene(regionInfo, circuitManager, m_commsManager, m_assetCache, storageManager, m_httpServer); + return new Scene(regionInfo, circuitManager, m_commsManager, m_assetCache, storageManager, m_httpServer, m_moduleLoader); } protected override void Initialize() @@ -491,15 +495,18 @@ namespace OpenSim if (entity is ScenePresence) { ScenePresence scenePrescence = entity as ScenePresence; - m_log.Error( - String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}{6,-16}", - scenePrescence.Firstname, - scenePrescence.Lastname, - scenePrescence.UUID, - scenePrescence.ControllingClient.AgentId, - "Unknown", - "Unknown", - scene.RegionInfo.RegionName)); + if (!scenePrescence.childAgent) + { + m_log.Error( + String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}{6,-16}", + scenePrescence.Firstname, + scenePrescence.Lastname, + scenePrescence.UUID, + scenePrescence.ControllingClient.AgentId, + "Unknown", + "Unknown", + scene.RegionInfo.RegionName)); + } } } } diff --git a/OpenSim/Region/Communications/Local/CommunicationsLocal.cs b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs index c1e9efb324..19c8860acb 100644 --- a/OpenSim/Region/Communications/Local/CommunicationsLocal.cs +++ b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs @@ -85,8 +85,8 @@ namespace OpenSim.Region.Communications.Local uint regX = 1000; uint regY = 1000; - tempfirstname = MainLog.Instance.CmdPrompt("First name", "Hello"); - templastname = MainLog.Instance.CmdPrompt("Last name", "Everyone"); + tempfirstname = MainLog.Instance.CmdPrompt("First name", "Default"); + templastname = MainLog.Instance.CmdPrompt("Last name", "User"); tempMD5Passwd = MainLog.Instance.PasswdPrompt("Password"); regX = Convert.ToUInt32(MainLog.Instance.CmdPrompt("Start Region X", "1000")); regY = Convert.ToUInt32(MainLog.Instance.CmdPrompt("Start Region Y" , "1000")); diff --git a/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs b/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs index 9b97fc6960..24da06c6bb 100644 --- a/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs +++ b/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs @@ -36,7 +36,7 @@ using OpenSim.Region.Environment.LandManagement; using System.Collections.Generic; -namespace OpenSim.Region.Interfaces +namespace OpenSim.Region.Environment.Interfaces { public interface IRegionDataStore { diff --git a/OpenSim/Region/Environment/Interfaces/IRegionModule.cs b/OpenSim/Region/Environment/Interfaces/IRegionModule.cs new file mode 100644 index 0000000000..84e156f8c2 --- /dev/null +++ b/OpenSim/Region/Environment/Interfaces/IRegionModule.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Region.Environment.Interfaces +{ + public interface IRegionModule + { + void Initialise(Scenes.Scene scene); + void PostInitialise(); + void CloseDown(); + string GetName(); + } +} diff --git a/OpenSim/Region/Environment/ModuleLoader.cs b/OpenSim/Region/Environment/ModuleLoader.cs new file mode 100644 index 0000000000..8e42d90835 --- /dev/null +++ b/OpenSim/Region/Environment/ModuleLoader.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Environment.Interfaces; +using OpenSim.Region.Environment.Modules; + +namespace OpenSim.Region.Environment +{ + public class ModuleLoader + { + + public Dictionary LoadedAssemblys = new Dictionary(); + + public ModuleLoader() + { + + } + + /// + /// Really just a test method for loading a set of currently internal modules + /// + /// + public void LoadInternalModules(Scene scene) + { + //Testing IRegionModule ideas + XferModule xferManager = new XferModule(); + xferManager.Initialise(scene); + scene.AddModule(xferManager.GetName(), xferManager); + + ChatModule chatModule = new ChatModule(); + chatModule.Initialise(scene); + scene.AddModule(chatModule.GetName(), chatModule); + + AvatarProfilesModule avatarProfiles = new AvatarProfilesModule(); + avatarProfiles.Initialise(scene); + scene.AddModule(avatarProfiles.GetName(), avatarProfiles); + + // Post Initialise Modules + xferManager.PostInitialise(); + // chatModule.PostInitialise(); //for now leave this disabled as it would start up a partially working irc bot + avatarProfiles.PostInitialise(); + } + + public void LoadModule(string dllName, string moduleName, Scene scene) + { + Assembly pluginAssembly = null; + if (LoadedAssemblys.ContainsKey(dllName)) + { + pluginAssembly = LoadedAssemblys[dllName]; + } + else + { + pluginAssembly = Assembly.LoadFrom(dllName); + this.LoadedAssemblys.Add(dllName, pluginAssembly); + } + + IRegionModule module = null; + foreach (Type pluginType in pluginAssembly.GetTypes()) + { + if (pluginType.IsPublic) + { + if (!pluginType.IsAbstract) + { + Type typeInterface = pluginType.GetInterface("IRegionModule", true); + + if (typeInterface != null) + { + module = (IRegionModule)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + break; + } + typeInterface = null; + } + } + } + pluginAssembly = null; + + if (module.GetName() == moduleName) + { + module.Initialise(scene); + scene.AddModule(moduleName, module); + module.PostInitialise(); //shouldn't be done here + } + + } + + public void ClearCache() + { + this.LoadedAssemblys.Clear(); + } + } +} diff --git a/OpenSim/Region/Environment/Modules/AvatarProfilesModule.cs b/OpenSim/Region/Environment/Modules/AvatarProfilesModule.cs new file mode 100644 index 0000000000..1427c58be2 --- /dev/null +++ b/OpenSim/Region/Environment/Modules/AvatarProfilesModule.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Text; +using libsecondlife; +using OpenSim.Framework.Interfaces; +using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Environment.Interfaces; + +namespace OpenSim.Region.Environment.Modules +{ + public class AvatarProfilesModule :IRegionModule + { + + private Scene m_scene; + + public AvatarProfilesModule() + { + + } + + public void Initialise(Scene scene) + { + m_scene = scene; + m_scene.EventManager.OnNewClient += NewClient; + } + + public void PostInitialise() + { + + } + + public void CloseDown() + { + + } + + public string GetName() + { + return "AvatarProfilesModule"; + } + + public void NewClient(IClientAPI client) + { + client.OnRequestAvatarProperties += RequestAvatarProperty; + } + + /// + /// + /// + /// + /// + public void RequestAvatarProperty(IClientAPI remoteClient, LLUUID avatarID) + { + string about = "OpenSim crash test dummy"; + string bornOn = "Before now"; + string flAbout = "First life? What is one of those? OpenSim is my life!"; + LLUUID partner = new LLUUID("11111111-1111-0000-0000-000100bba000"); + remoteClient.SendAvatarProperties(avatarID, about, bornOn, "", flAbout, 0, LLUUID.Zero, LLUUID.Zero, "", partner); + } + } +} diff --git a/OpenSim/Region/Environment/Modules/ChatModule.cs b/OpenSim/Region/Environment/Modules/ChatModule.cs new file mode 100644 index 0000000000..703fe651aa --- /dev/null +++ b/OpenSim/Region/Environment/Modules/ChatModule.cs @@ -0,0 +1,165 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.IO; +using libsecondlife; +using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Environment.Interfaces; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Region.Environment.Modules +{ + public class ChatModule :IRegionModule + { + private Scene m_scene; + + private string m_server = "irc2.choopa.net"; + + private int m_port = 6668; + private string m_user = "USER OpenSimBot 8 * :I'm a OpenSim to irc bot"; + private string m_nick = "OpenSimBoT"; + private string m_channel = "#opensim"; + + private NetworkStream m_stream; + private TcpClient m_irc; + private StreamWriter m_ircWriter; + private StreamReader m_ircReader; + + private Thread pingSender; + + private bool connected = false; + + public ChatModule() + { + + } + + public void Initialise(Scene scene) + { + m_scene = scene; + m_scene.EventManager.OnNewClient += NewClient; + + //should register a optional API Method, so other modules can send chat messages using this module + } + + public void PostInitialise() + { + try + { + m_irc = new TcpClient(m_server, m_port); + m_stream = m_irc.GetStream(); + m_ircReader = new StreamReader(m_stream); + m_ircWriter = new StreamWriter(m_stream); + + pingSender = new Thread(new ThreadStart(this.PingRun)); + pingSender.Start(); + + m_ircWriter.WriteLine(m_user); + m_ircWriter.Flush(); + m_ircWriter.WriteLine("NICK " + m_nick); + m_ircWriter.Flush(); + m_ircWriter.WriteLine("JOIN " + m_channel); + m_ircWriter.Flush(); + connected = true; + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + + public void CloseDown() + { + m_ircWriter.Close(); + m_ircReader.Close(); + m_irc.Close(); + } + + public string GetName() + { + return "ChatModule"; + } + + public void NewClient(IClientAPI client) + { + client.OnChatFromViewer += SimChat; + } + + public void PingRun() + { + while (true) + { + m_ircWriter.WriteLine("PING :" + m_server); + m_ircWriter.Flush(); + Thread.Sleep(15000); + } + } + + public void SimChat(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID) + { + ScenePresence avatar = null; + avatar = m_scene.RequestAvatar(fromAgentID); + if (avatar != null) + { + fromPos = avatar.AbsolutePosition; + fromName = avatar.Firstname + " " + avatar.Lastname; + avatar = null; + } + + if (connected) + { + m_ircWriter.WriteLine("MSG " + m_channel +" :" + fromName + ", " + Util.FieldToString(message)); + m_ircWriter.Flush(); + } + + m_scene.ForEachScenePresence(delegate(ScenePresence presence) + { + int dis = -1000; + + //err ??? the following code seems to be request a scenePresence when it already has a ref to it + avatar = m_scene.RequestAvatar(presence.ControllingClient.AgentId); + if (avatar != null) + { + dis = (int)avatar.AbsolutePosition.GetDistanceTo(fromPos); + } + + switch (type) + { + case 0: // Whisper + if ((dis < 10) && (dis > -10)) + { + //should change so the message is sent through the avatar rather than direct to the ClientView + presence.ControllingClient.SendChatMessage(message, type, fromPos, fromName, + fromAgentID); + } + break; + case 1: // Say + if ((dis < 30) && (dis > -30)) + { + //Console.WriteLine("sending chat"); + presence.ControllingClient.SendChatMessage(message, type, fromPos, fromName, + fromAgentID); + } + break; + case 2: // Shout + if ((dis < 100) && (dis > -100)) + { + presence.ControllingClient.SendChatMessage(message, type, fromPos, fromName, + fromAgentID); + } + break; + + case 0xff: // Broadcast + presence.ControllingClient.SendChatMessage(message, type, fromPos, fromName, + fromAgentID); + break; + } + }); + } + + } +} diff --git a/OpenSim/Region/Environment/RegionManager.cs b/OpenSim/Region/Environment/RegionManager.cs index 255aa45fa2..0146b52cef 100644 --- a/OpenSim/Region/Environment/RegionManager.cs +++ b/OpenSim/Region/Environment/RegionManager.cs @@ -9,6 +9,8 @@ using OpenSim.Region.Environment.LandManagement; namespace OpenSim.Region.Environment { + public delegate TResult ModuleAPIMethod(TParam0 param0, TParam1 param1); + public class RegionManager { protected AgentCircuitManager authenticateHandler; diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 16cd484a52..d31b5b05e1 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -201,7 +201,10 @@ namespace OpenSim.Region.Environment.Scenes bool fileChange = ((SceneObjectGroup)ent).GetPartInventoryFileName(remoteClient, primLocalID); if (fileChange) { - ((SceneObjectGroup)ent).RequestInventoryFile(primLocalID, xferManager); + if (this.AddXferFile != null) + { + ((SceneObjectGroup)ent).RequestInventoryFile(primLocalID, AddXferFile); + } } break; } diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs index d94a7486c0..dcec289d91 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs @@ -57,60 +57,8 @@ namespace OpenSim.Region.Environment.Scenes if (!PermissionsMngr.CanTerraform(remoteUser.AgentId, new LLVector3(north, west, 0))) return; - // Shiny. - double size = (double)(1 << brushsize); - - switch (action) - { - case 0: - // flatten terrain - Terrain.FlattenTerrain(west, north, size, (double)seconds / 5.0); - break; - case 1: - // raise terrain - Terrain.RaiseTerrain(west, north, size, (double)seconds / 5.0); - break; - case 2: - //lower terrain - Terrain.LowerTerrain(west, north, size, (double)seconds / 5.0); - break; - case 3: - // smooth terrain - Terrain.SmoothTerrain(west, north, size, (double)seconds / 5.0); - break; - case 4: - // noise - Terrain.NoiseTerrain(west, north, size, (double)seconds / 5.0); - break; - case 5: - // revert - Terrain.RevertTerrain(west, north, size, (double)seconds / 5.0); - break; - - // CLIENT EXTENSIONS GO HERE - case 128: - // erode-thermal - break; - case 129: - // erode-aerobic - break; - case 130: - // erode-hydraulic - break; - } - - for (int x = 0; x < 16; x++) - { - for (int y = 0; y < 16; y++) - { - if (Terrain.Tainted(x * 16, y * 16)) - { - remoteUser.SendLayerData(x, y, Terrain.GetHeights1D()); - } - } - } - - return; + //if it wasn't for the permission checking we could have the terrain module directly subscribe to the OnModifyTerrain event + Terrain.ModifyTerrain(height, seconds, brushsize, action, north, west, remoteUser); } /// @@ -146,7 +94,7 @@ namespace OpenSim.Region.Environment.Scenes } /// - /// + /// Should be removed soon as the Chat modules should take over this function /// /// /// @@ -616,40 +564,6 @@ namespace OpenSim.Region.Environment.Scenes } } - /// - /// - /// - /// - /// - public void RequestAvatarProperty(IClientAPI remoteClient, LLUUID avatarID) - { - string about = "OpenSim crash test dummy"; - string bornOn = "Before now"; - string flAbout = "First life? What is one of those? OpenSim is my life!"; - LLUUID partner = new LLUUID("11111111-1111-0000-0000-000100bba000"); - remoteClient.SendAvatarProperties(avatarID, about, bornOn, "", flAbout, 0, LLUUID.Zero, LLUUID.Zero, "", partner); - } - - /// - /// - /// - /// - /// - /// - public void RequestXfer(IClientAPI remoteClient, ulong xferID, string fileName) - { - /* - foreach (EntityBase ent in Entities.Values) - { - if (ent is SceneObjectGroup) - { - ((SceneObjectGroup)ent).RequestInventoryFile(remoteClient, ((SceneObjectGroup)ent).LocalId, xferID); - break; - } - }*/ - } - - public virtual void ProcessObjectGrab(uint localID, LLVector3 offsetPos, IClientAPI remoteClient) { this.EventManager.TriggerObjectGrab(localID, offsetPos, remoteClient); diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 2259a3e269..b2ddb7d652 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -42,6 +42,8 @@ using OpenSim.Framework.Utilities; using OpenSim.Physics.Manager; using OpenSim.Framework.Communications.Caches; using OpenSim.Region.Environment.LandManagement; +using OpenSim.Region.Environment; +using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Scripting; using OpenSim.Region.Terrain; using OpenSim.Framework.Data; @@ -73,15 +75,24 @@ namespace OpenSim.Region.Environment.Scenes private Mutex updateLock; + protected ModuleLoader m_moduleLoader; protected StorageManager storageManager; protected AgentCircuitManager authenticateHandler; protected RegionCommsListener regionCommsHost; protected CommunicationsManager commsManager; - protected XferManager xferManager; + // protected XferManager xferManager; protected Dictionary capsHandlers = new Dictionary(); protected BaseHttpServer httpListener; + protected Dictionary Modules = new Dictionary(); + protected Dictionary APIMethods = new Dictionary(); + + //API method Delegates + + // this most likely shouldn't be handled as a API method like this, but doing it for testing purposes + public ModuleAPIMethodAddXferFile = null; + #region Properties public AgentCircuitManager AuthenticateHandler @@ -146,9 +157,11 @@ namespace OpenSim.Region.Environment.Scenes /// Region Handle for this region /// Region Name for this region public Scene(RegionInfo regInfo, AgentCircuitManager authen, CommunicationsManager commsMan, - AssetCache assetCach, StorageManager storeManager, BaseHttpServer httpServer) + AssetCache assetCach, StorageManager storeManager, BaseHttpServer httpServer, ModuleLoader moduleLoader) { updateLock = new Mutex(false); + + m_moduleLoader = moduleLoader; authenticateHandler = authen; commsManager = commsMan; storageManager = storeManager; @@ -164,8 +177,10 @@ namespace OpenSim.Region.Environment.Scenes m_scriptManager = new ScriptManager(this); m_eventManager = new EventManager(); m_permissionManager = new PermissionManager(this); - xferManager = new XferManager(); + MainLog.Instance.Verbose("Loading Region Modules"); + m_moduleLoader.LoadInternalModules(this); + m_eventManager.OnParcelPrimCountAdd += m_LandManager.addPrimToLandPrimCounts; @@ -182,10 +197,17 @@ namespace OpenSim.Region.Environment.Scenes ScenePresence.LoadAnims(); httpListener = httpServer; + + SetMethodDelegates(); } #endregion + private void SetMethodDelegates() + { + AddXferFile = (ModuleAPIMethod)this.RequestAPIMethod("API_AddXferFile"); + } + #region Script Handling Methods public void SendCommandToScripts(string[] args) @@ -682,7 +704,7 @@ namespace OpenSim.Region.Environment.Scenes client.OnRegionHandShakeReply += SendLayerData; //remoteClient.OnRequestWearables += new GenericCall(this.GetInitialPrims); client.OnModifyTerrain += ModifyTerrain; - client.OnChatFromViewer += SimChat; + //client.OnChatFromViewer += SimChat; client.OnInstantMessage += InstantMessage; client.OnRequestWearables += InformClientOfNeighbours; client.OnAddPrim += AddNewPrim; @@ -725,15 +747,14 @@ namespace OpenSim.Region.Environment.Scenes client.OnUpdateInventoryItem += UDPUpdateInventoryItemAsset; client.OnAssetUploadRequest += commsManager.TransactionsManager.HandleUDPUploadRequest; client.OnXferReceive += commsManager.TransactionsManager.HandleXfer; - // client.OnRequestXfer += RequestXfer; - client.OnRequestXfer += xferManager.RequestXfer; - client.OnConfirmXfer += xferManager.AckPacket; client.OnRezScript += RezScript; client.OnRemoveTaskItem += RemoveTaskInventory; - client.OnRequestAvatarProperties += RequestAvatarProperty; + // client.OnRequestAvatarProperties += RequestAvatarProperty; client.OnGrabObject += ProcessObjectGrab; + + EventManager.TriggerOnNewClient(client); } protected ScenePresence CreateAndAddScenePresence(IClientAPI client) @@ -1093,6 +1114,31 @@ namespace OpenSim.Region.Environment.Scenes #endregion + public void AddModule(string name, IRegionModule module) + { + if (!this.Modules.ContainsKey(name)) + { + Modules.Add(name, module); + } + } + + public void RegisterAPIMethod(string name, object method) + { + if (!this.APIMethods.ContainsKey(name)) + { + this.APIMethods.Add(name, method); + } + } + + public object RequestAPIMethod(string name) + { + if (this.APIMethods.ContainsKey(name)) + { + return APIMethods[name]; + } + return false; + } + public void SetTimePhase(int phase) { m_timePhase = phase; diff --git a/OpenSim/Region/Environment/Scenes/SceneEvents.cs b/OpenSim/Region/Environment/Scenes/SceneEvents.cs index 3c6b277a79..a86a1bc81a 100644 --- a/OpenSim/Region/Environment/Scenes/SceneEvents.cs +++ b/OpenSim/Region/Environment/Scenes/SceneEvents.cs @@ -14,6 +14,9 @@ namespace OpenSim.Region.Environment.Scenes public delegate void OnBackupDelegate(Interfaces.IRegionDataStore datastore); public event OnBackupDelegate OnBackup; + public delegate void OnNewClientDelegate(IClientAPI client); + public event OnNewClientDelegate OnNewClient; + public delegate void OnNewPresenceDelegate(ScenePresence presence); public event OnNewPresenceDelegate OnNewPresence; @@ -63,6 +66,12 @@ namespace OpenSim.Region.Environment.Scenes } } + public void TriggerOnNewClient(IClientAPI client) + { + if (OnNewClient != null) + OnNewClient(client); + } + public void TriggerOnNewPresence(ScenePresence presence) { if (OnNewPresence != null) diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 2fd7b578c8..0fc165694c 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -642,12 +642,12 @@ namespace OpenSim.Region.Environment.Scenes return false; } - public string RequestInventoryFile(uint localID, XferManager xferManager) + public string RequestInventoryFile(uint localID, ModuleAPIMethod addXferFile) { SceneObjectPart part = this.GetChildPart(localID); if (part != null) { - return part.RequestInventoryFile(xferManager); + part.RequestInventoryFile(addXferFile); } return ""; } @@ -967,7 +967,7 @@ namespace OpenSim.Region.Environment.Scenes /// Processes backup /// /// - public void ProcessBackup(OpenSim.Region.Interfaces.IRegionDataStore datastore) + public void ProcessBackup(OpenSim.Region.Environment.Interfaces.IRegionDataStore datastore) { datastore.StoreObject(this, m_scene.RegionInfo.SimUUID); } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index a621632611..cc8e7170c9 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -482,7 +482,7 @@ namespace OpenSim.Region.Environment.Scenes return false; } - public string RequestInventoryFile(XferManager xferManager) + public string RequestInventoryFile(ModuleAPIMethod addXferFile) { byte[] fileData = new byte[0]; InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, this.UUID); @@ -516,7 +516,7 @@ namespace OpenSim.Region.Environment.Scenes fileData = Helpers.StringToField(invString.BuildString); if (fileData.Length > 2) { - xferManager.AddNewFile(m_inventoryFileName, fileData); + addXferFile(m_inventoryFileName, fileData); } return ""; } diff --git a/OpenSim/Region/Environment/StorageManager.cs b/OpenSim/Region/Environment/StorageManager.cs index a7d67d3cfb..a478827b00 100644 --- a/OpenSim/Region/Environment/StorageManager.cs +++ b/OpenSim/Region/Environment/StorageManager.cs @@ -7,7 +7,7 @@ using OpenSim.Framework.Communications; using OpenSim.Framework.Servers; using OpenSim.Region.Capabilities; using OpenSim.Region.Environment.Scenes; -using OpenSim.Region.Interfaces; +using OpenSim.Region.Environment.Interfaces; using System.Reflection; diff --git a/OpenSim/Region/Environment/XferManager.cs b/OpenSim/Region/Environment/XferModule.cs similarity index 80% rename from OpenSim/Region/Environment/XferManager.cs rename to OpenSim/Region/Environment/XferModule.cs index c49601c27e..beb721209a 100644 --- a/OpenSim/Region/Environment/XferManager.cs +++ b/OpenSim/Region/Environment/XferModule.cs @@ -5,19 +5,52 @@ using System.Text; using libsecondlife; using OpenSim.Framework.Interfaces; using OpenSim.Framework.Utilities; +using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Environment.Interfaces; namespace OpenSim.Region.Environment { - public class XferManager + public class XferModule : IRegionModule { public Dictionary NewFiles = new Dictionary(); public Dictionary Transfers = new Dictionary(); - public XferManager() + private Scene m_scene; + + public XferModule() { } + public void Initialise(Scene scene) + { + m_scene = scene; + m_scene.EventManager.OnNewClient += NewClient; + + m_scene.RegisterAPIMethod("API_AddXferFile", new ModuleAPIMethod(this.AddNewFile)); + } + + public void PostInitialise() + { + + } + + public void CloseDown() + { + + } + + public string GetName() + { + return "XferModule"; + } + + public void NewClient(IClientAPI client) + { + client.OnRequestXfer += RequestXfer; + client.OnConfirmXfer += AckPacket; + } + /// /// /// @@ -50,7 +83,7 @@ namespace OpenSim.Region.Environment } } - public void AddNewFile(string fileName, byte[] data) + public bool AddNewFile(string fileName, byte[] data) { lock (NewFiles) { @@ -63,8 +96,10 @@ namespace OpenSim.Region.Environment NewFiles.Add(fileName, data); } } + return true; } + public class XferDownLoad { public byte[] Data = new byte[0]; diff --git a/OpenSim/Region/Examples/SimpleApp/MyWorld.cs b/OpenSim/Region/Examples/SimpleApp/MyWorld.cs index a84af496c1..cf71389d58 100644 --- a/OpenSim/Region/Examples/SimpleApp/MyWorld.cs +++ b/OpenSim/Region/Examples/SimpleApp/MyWorld.cs @@ -19,8 +19,8 @@ namespace SimpleApp { private List m_avatars; - public MyWorld( RegionInfo regionInfo, AgentCircuitManager authen, CommunicationsManager commsMan, AssetCache assetCach, StorageManager storeMan, BaseHttpServer httpServer) - : base( regionInfo, authen, commsMan, assetCach, storeMan, httpServer) + public MyWorld( RegionInfo regionInfo, AgentCircuitManager authen, CommunicationsManager commsMan, AssetCache assetCach, StorageManager storeMan, BaseHttpServer httpServer, ModuleLoader moduleLoader) + : base( regionInfo, authen, commsMan, assetCach, storeMan, httpServer, moduleLoader) { m_avatars = new List(); } diff --git a/OpenSim/Region/Examples/SimpleApp/Program.cs b/OpenSim/Region/Examples/SimpleApp/Program.cs index 23461098e1..3ba1b82c64 100644 --- a/OpenSim/Region/Examples/SimpleApp/Program.cs +++ b/OpenSim/Region/Examples/SimpleApp/Program.cs @@ -104,7 +104,7 @@ namespace SimpleApp protected override Scene CreateScene(RegionInfo regionInfo, StorageManager storageManager, AgentCircuitManager circuitManager) { - return new MyWorld(regionInfo, circuitManager, m_commsManager, m_assetCache, storageManager, m_httpServer); + return new MyWorld(regionInfo, circuitManager, m_commsManager, m_assetCache, storageManager, m_httpServer, new ModuleLoader()); } protected override StorageManager CreateStorageManager(RegionInfo regionInfo) diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs index 86a575a4c4..c4fafde250 100644 --- a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs +++ b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs @@ -8,7 +8,7 @@ using System.IO; using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.LandManagement; using OpenSim.Region.Environment; -using OpenSim.Region.Interfaces; +using OpenSim.Region.Environment.Interfaces; using OpenSim.Framework.Console; using OpenSim.Framework.Types; using OpenSim.Framework.Utilities; diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.NullStorage/NullDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.NullStorage/NullDataStore.cs index 176a534216..645bc96558 100644 --- a/OpenSim/Region/Storage/OpenSim.DataStore.NullStorage/NullDataStore.cs +++ b/OpenSim/Region/Storage/OpenSim.DataStore.NullStorage/NullDataStore.cs @@ -4,7 +4,7 @@ using System.Text; using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.LandManagement; -using OpenSim.Region.Interfaces; +using OpenSim.Region.Environment.Interfaces; using OpenSim.Framework.Console; using libsecondlife; diff --git a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs index af92fe77bf..d5cfb6911d 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs @@ -32,6 +32,7 @@ using System.Drawing.Imaging; using System.IO; using libTerrain; using OpenJPEGNet; +using OpenSim.Framework.Interfaces; namespace OpenSim.Region.Terrain { @@ -128,6 +129,76 @@ namespace OpenSim.Region.Terrain heightmap.diff = new int[w / 16, h / 16]; } + //Testing to see if moving the TerraForming packet handling code into here works well + /// + /// Modifies terrain using the specified information + /// + /// The height at which the user started modifying the terrain + /// The number of seconds the modify button was pressed + /// The size of the brush used + /// The action to be performed + /// Distance from the north border where the cursor is located + /// Distance from the west border where the cursor is located + public void ModifyTerrain(float height, float seconds, byte brushsize, byte action, float north, float west, IClientAPI remoteUser) + { + + // Shiny. + double size = (double)(1 << brushsize); + + switch (action) + { + case 0: + // flatten terrain + this.FlattenTerrain(west, north, size, (double)seconds / 5.0); + break; + case 1: + // raise terrain + this.RaiseTerrain(west, north, size, (double)seconds / 5.0); + break; + case 2: + //lower terrain + this.LowerTerrain(west, north, size, (double)seconds / 5.0); + break; + case 3: + // smooth terrain + this.SmoothTerrain(west, north, size, (double)seconds / 5.0); + break; + case 4: + // noise + this.NoiseTerrain(west, north, size, (double)seconds / 5.0); + break; + case 5: + // revert + this.RevertTerrain(west, north, size, (double)seconds / 5.0); + break; + + // CLIENT EXTENSIONS GO HERE + case 128: + // erode-thermal + break; + case 129: + // erode-aerobic + break; + case 130: + // erode-hydraulic + break; + } + + for (int x = 0; x < 16; x++) + { + for (int y = 0; y < 16; y++) + { + if (this.Tainted(x * 16, y * 16)) + { + remoteUser.SendLayerData(x, y, this.GetHeights1D()); + } + } + } + + return; + } + + /// /// Checks to make sure the terrain is within baked values +/- maxRaise/minLower /// diff --git a/prebuild.xml b/prebuild.xml index 3beb051eea..0dcaabc5be 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -297,6 +297,7 @@ +