From bfd36e2e836f92539e68bba077104d5016c5bf8b Mon Sep 17 00:00:00 2001 From: MW Date: Tue, 4 Sep 2007 13:43:56 +0000 Subject: Some work on Module loading/management. Some more modules templates classes (hoping that someone will pick some of these and work on implementing them). Early version of the "Dynamic Texture Module", although currently there are no render modules included (so not really functional without them). Added osSetDynamicTextureURL script function, for attaching a dynamic texture to a prim. Some work on the console command handling. Added "change-region " and "exit-region" so that after the use of change-region, the commands entered will apply to that region only. Then use exit-region to return to the top level (so commands then function as they did before and either apply to all regions or to the first region) (Note: this hasn't been tested very much) --- .../Environment/Scenes/Scene.PacketHandlers.cs | 53 +------- OpenSim/Region/Environment/Scenes/Scene.cs | 137 +++++++++++++++++---- 2 files changed, 114 insertions(+), 76 deletions(-) (limited to 'OpenSim/Region/Environment/Scenes') diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs index a9ded3f..90e4a1f 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs @@ -35,6 +35,7 @@ using OpenSim.Framework.Types; using OpenSim.Framework.Communications.Caches; using OpenSim.Framework.Data; using OpenSim.Framework.Utilities; +using OpenSim.Region.Environment.Interfaces; namespace OpenSim.Region.Environment.Scenes { @@ -94,7 +95,7 @@ namespace OpenSim.Region.Environment.Scenes } /// - /// Should be removed soon as the Chat modules should take over this function + /// /// /// /// @@ -103,56 +104,10 @@ namespace OpenSim.Region.Environment.Scenes /// public void SimChat(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID) { - ScenePresence avatar = null; - if (this.Avatars.ContainsKey(fromAgentID)) + if (m_simChatModule != null) { - avatar = this.Avatars[fromAgentID]; - fromPos = avatar.AbsolutePosition; - fromName = avatar.Firstname + " " + avatar.Lastname; - avatar = null; + m_simChatModule.SimChat(message, type, fromPos, fromName, fromAgentID); } - - this.ForEachScenePresence(delegate(ScenePresence presence) - { - int dis = -1000; - if (this.Avatars.ContainsKey(presence.ControllingClient.AgentId)) - { - avatar = this.Avatars[presence.ControllingClient.AgentId]; - 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/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 46fc86b..b92f8c8 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -78,20 +78,23 @@ namespace OpenSim.Region.Environment.Scenes protected StorageManager storageManager; protected AgentCircuitManager authenticateHandler; protected RegionCommsListener regionCommsHost; - protected CommunicationsManager commsManager; - // protected XferManager xferManager; + public CommunicationsManager commsManager; + // protected XferManager xferManager; protected Dictionary capsHandlers = new Dictionary(); protected BaseHttpServer httpListener; protected Dictionary Modules = new Dictionary(); - protected Dictionary APIMethods = new Dictionary(); + public Dictionary ModuleInterfaces = new Dictionary(); + protected Dictionary ModuleAPIMethods = new Dictionary(); - //API method Delegates + //API method Delegates and interfaces // this most likely shouldn't be handled as a API method like this, but doing it for testing purposes - public ModuleAPIMethod2AddXferFile = null; - + public ModuleAPIMethod2 AddXferFile = null; + + private ISimChat m_simChatModule = null; + #region Properties public AgentCircuitManager AuthenticateHandler @@ -152,7 +155,7 @@ namespace OpenSim.Region.Environment.Scenes AssetCache assetCach, StorageManager storeManager, BaseHttpServer httpServer, ModuleLoader moduleLoader) { updateLock = new Mutex(false); - + m_moduleLoader = moduleLoader; authenticateHandler = authen; commsManager = commsMan; @@ -169,9 +172,6 @@ namespace OpenSim.Region.Environment.Scenes m_eventManager = new EventManager(); m_permissionManager = new PermissionManager(this); - MainLog.Instance.Verbose("Loading Region Modules"); - m_moduleLoader.CreateDefaultModules(this); - m_eventManager.OnParcelPrimCountAdd += m_LandManager.addPrimToLandPrimCounts; @@ -189,13 +189,15 @@ namespace OpenSim.Region.Environment.Scenes httpListener = httpServer; - SetMethodDelegates(); } #endregion - private void SetMethodDelegates() + public void SetModuleInterfaces() { + m_simChatModule = this.RequestModuleInterface(); + + //should change so it uses the module interface functions AddXferFile = (ModuleAPIMethod2)this.RequestAPIMethod("API_AddXferFile"); } @@ -526,7 +528,7 @@ namespace OpenSim.Region.Environment.Scenes MainLog.Instance.Verbose("Loaded " + PrimsFromDB.Count.ToString() + " SceneObject(s)"); } - + /// /// Returns a new unallocated primitive ID @@ -635,12 +637,12 @@ namespace OpenSim.Region.Environment.Scenes //obj.RegenerateFullIDs(); AddEntity(obj); - SceneObjectPart rootPart = obj.GetChildPart(obj.UUID); - rootPart.PhysActor = phyScene.AddPrim( - new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y, rootPart.AbsolutePosition.Z), - new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), - new Axiom.Math.Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, - rootPart.RotationOffset.Y, rootPart.RotationOffset.Z)); + SceneObjectPart rootPart = obj.GetChildPart(obj.UUID); + rootPart.PhysActor = phyScene.AddPrim( + new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y, rootPart.AbsolutePosition.Z), + new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), + new Axiom.Math.Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, + rootPart.RotationOffset.Y, rootPart.RotationOffset.Z)); primCount++; } } @@ -692,7 +694,7 @@ namespace OpenSim.Region.Environment.Scenes protected virtual void SubscribeToClientEvents(IClientAPI client) { - // client.OnStartAnim += StartAnimation; + // client.OnStartAnim += StartAnimation; client.OnRegionHandShakeReply += SendLayerData; //remoteClient.OnRequestWearables += new GenericCall(this.GetInitialPrims); client.OnModifyTerrain += ModifyTerrain; @@ -742,7 +744,7 @@ namespace OpenSim.Region.Environment.Scenes client.OnRezScript += RezScript; client.OnRemoveTaskItem += RemoveTaskInventory; - // client.OnRequestAvatarProperties += RequestAvatarProperty; + // client.OnRequestAvatarProperties += RequestAvatarProperty; client.OnGrabObject += ProcessObjectGrab; @@ -1071,13 +1073,12 @@ namespace OpenSim.Region.Environment.Scenes AgentCircuitData agent = remoteClient.RequestClientInfo(); agent.BaseFolder = LLUUID.Zero; agent.InventoryFolder = LLUUID.Zero; - // agent.startpos = new LLVector3(128, 128, 70); + // agent.startpos = new LLVector3(128, 128, 70); agent.startpos = position; agent.child = true; commsManager.InterRegion.InformRegionOfChildAgent(regionHandle, agent); commsManager.InterRegion.ExpectAvatarCrossing(regionHandle, remoteClient.AgentId, position, false); - //TODO: following line is hard coded to port 9000, really need to change this as soon as possible AgentCircuitData circuitdata = remoteClient.RequestClientInfo(); string capsPath = Util.GetCapsURL(remoteClient.AgentId); remoteClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4), capsPath); @@ -1114,23 +1115,45 @@ namespace OpenSim.Region.Environment.Scenes } } + //following delegate methods will be removed, so use the interface methods (below these) public void RegisterAPIMethod(string name, object method) { - if (!this.APIMethods.ContainsKey(name)) + if (!this.ModuleAPIMethods.ContainsKey(name)) { - this.APIMethods.Add(name, method); + this.ModuleAPIMethods.Add(name, method); } } public object RequestAPIMethod(string name) { - if (this.APIMethods.ContainsKey(name)) + if (this.ModuleAPIMethods.ContainsKey(name)) { - return APIMethods[name]; + return ModuleAPIMethods[name]; } return false; } + public void RegisterModuleInterface( M mod) + { + //Console.WriteLine("registering module interface " + typeof(M)); + if (!this.ModuleInterfaces.ContainsKey(typeof(M))) + { + ModuleInterfaces.Add(typeof(M), mod); + } + } + + public T RequestModuleInterface() + { + if (ModuleInterfaces.ContainsKey(typeof(T))) + { + return (T)ModuleInterfaces[typeof(T)]; + } + else + { + return default(T); + } + } + public void SetTimePhase(int phase) { m_timePhase = phase; @@ -1205,6 +1228,49 @@ namespace OpenSim.Region.Environment.Scenes } #endregion + public void ProcessConsoleCmd(string command, string[] cmdparams) + { + switch (command) + { + case "save-xml": + if (cmdparams.Length > 0) + { + SavePrimsToXml(cmdparams[0]); + } + else + { + SavePrimsToXml("test.xml"); + } + break; + + case "load-xml": + if (cmdparams.Length > 0) + { + LoadPrimsFromXml(cmdparams[0]); + } + else + { + LoadPrimsFromXml("test.xml"); + } + break; + + case "set-time": + break; + + case "backup": + Backup(); + break; + + case "alert": + HandleAlertCommand(cmdparams); + break; + + default: + MainLog.Instance.Error("Unknown command: " + command); + break; + } + } + #region Script Engine private List ScriptEngines = new List(); public void AddScriptEngine(OpenSim.Region.Environment.Scenes.Scripting.ScriptEngineInterface ScriptEngine, LogBase m_logger) @@ -1248,5 +1314,22 @@ namespace OpenSim.Region.Environment.Scenes } return null; } + + public SceneObjectPart GetSceneObjectPart(LLUUID fullID) + { + bool hasPrim = false; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObjectGroup) + { + hasPrim = ((SceneObjectGroup)ent).HasChildPrim(fullID); + if (hasPrim != false) + { + return ((SceneObjectGroup)ent).GetChildPart(fullID); + } + } + } + return null; + } } } -- cgit v1.1