Move scene debug commands into separate module. Command changes from "debug scene <key> <value>" to "debug scene set <key> <value>" to accomodate future settings
							parent
							
								
									73717f2ce7
								
							
						
					
					
						commit
						c6bb0d9662
					
				|  | @ -236,18 +236,6 @@ namespace OpenSim | ||||||
|                                           + "If an avatar name is given then only packets from that avatar are logged", |                                           + "If an avatar name is given then only packets from that avatar are logged", | ||||||
|                                           Debug); |                                           Debug); | ||||||
| 
 | 
 | ||||||
|             m_console.Commands.AddCommand("Debug", false, "debug scene", |  | ||||||
|                                           "debug scene active|collisions|pbackup|physics|scripting|teleport|updates true|false", |  | ||||||
|                                           "Turn on scene debugging options.", |  | ||||||
|                                             "If active     is false then main scene update and maintenance loops are suspended.\n" |  | ||||||
|                                           + "If collisions is false then collisions with other objects are turned off.\n" |  | ||||||
|                                           + "If pbackup    is false then periodic scene backup is turned off.\n" |  | ||||||
|                                           + "If physics    is false then all physics objects are non-physical.\n" |  | ||||||
|                                           + "If scripting  is false then no scripting operations happen.\n" |  | ||||||
|                                           + "If teleport   is true  then some extra teleport debug information is logged.\n" |  | ||||||
|                                           + "If updates    is true  then any frame which exceeds double the maximum desired frame time is logged.", |  | ||||||
|                                           Debug); |  | ||||||
| 
 |  | ||||||
|             m_console.Commands.AddCommand("General", false, "change region", |             m_console.Commands.AddCommand("General", false, "change region", | ||||||
|                                           "change region <region name>", |                                           "change region <region name>", | ||||||
|                                           "Change current console region", ChangeSelectedRegion); |                                           "Change current console region", ChangeSelectedRegion); | ||||||
|  | @ -762,31 +750,6 @@ namespace OpenSim | ||||||
| 
 | 
 | ||||||
|                     break; |                     break; | ||||||
| 
 | 
 | ||||||
|                 case "scene": |  | ||||||
|                     if (args.Length == 4) |  | ||||||
|                     { |  | ||||||
|                         if (SceneManager.CurrentScene == null) |  | ||||||
|                         { |  | ||||||
|                             MainConsole.Instance.Output("Please use 'change region <regioname>' first"); |  | ||||||
|                         } |  | ||||||
|                         else |  | ||||||
|                         { |  | ||||||
|                             string key = args[2]; |  | ||||||
|                             string value = args[3]; |  | ||||||
|                             SceneManager.CurrentScene.SetSceneCoreDebug( |  | ||||||
|                                 new Dictionary<string, string>() { { key, value } }); |  | ||||||
| 
 |  | ||||||
|                             MainConsole.Instance.OutputFormat("Set debug scene {0} = {1}", key, value); |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                     else |  | ||||||
|                     { |  | ||||||
|                         MainConsole.Instance.Output( |  | ||||||
|                             "Usage: debug scene active|collisions|pbackup|physics|scripting|teleport|updates true|false"); |  | ||||||
|                     } |  | ||||||
| 
 |  | ||||||
|                     break; |  | ||||||
| 
 |  | ||||||
|                 default: |                 default: | ||||||
|                     MainConsole.Instance.Output("Unknown debug command"); |                     MainConsole.Instance.Output("Unknown debug command"); | ||||||
|                     break; |                     break; | ||||||
|  |  | ||||||
|  | @ -752,13 +752,18 @@ namespace OpenSim.Region.CoreModules.World.Estate | ||||||
|             Scene.RegionInfo.RegionSettings.Save(); |             Scene.RegionInfo.RegionSettings.Save(); | ||||||
|             TriggerRegionInfoChange(); |             TriggerRegionInfoChange(); | ||||||
| 
 | 
 | ||||||
|             Scene.SetSceneCoreDebug( |             ISceneCommandsModule scm = Scene.RequestModuleInterface<ISceneCommandsModule>(); | ||||||
|                 new Dictionary<string, string>() { | 
 | ||||||
|                     { "scripting", (!disableScripts).ToString() }, |             if (scm != null) | ||||||
|                     { "collisions", (!disableCollisions).ToString() }, |             { | ||||||
|                     { "physics", (!disablePhysics).ToString() } |                 scm.SetSceneDebugOptions( | ||||||
|                 } |                     new Dictionary<string, string>() { | ||||||
|             ); |                         { "scripting", (!disableScripts).ToString() }, | ||||||
|  |                         { "collisions", (!disableCollisions).ToString() }, | ||||||
|  |                         { "physics", (!disablePhysics).ToString() } | ||||||
|  |                     } | ||||||
|  |                 ); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private void handleEstateTeleportOneUserHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID, UUID prey) |         private void handleEstateTeleportOneUserHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID, UUID prey) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,43 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright (c) Contributors, http://opensimulator.org/ | ||||||
|  |  * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  *     * Redistributions of source code must retain the above copyright | ||||||
|  |  *       notice, this list of conditions and the following disclaimer. | ||||||
|  |  *     * Redistributions in binary form must reproduce the above copyright | ||||||
|  |  *       notice, this list of conditions and the following disclaimer in the | ||||||
|  |  *       documentation and/or other materials provided with the distribution. | ||||||
|  |  *     * Neither the name of the OpenSim Project nor the | ||||||
|  |  *       names of its contributors may be used to endorse or promote products | ||||||
|  |  *       derived from this software without specific prior written permission. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||||
|  |  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||||
|  |  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  |  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||||
|  |  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||||
|  |  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  |  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||||
|  |  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  |  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||||
|  |  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using OpenMetaverse; | ||||||
|  | using OpenSim.Framework; | ||||||
|  | using OpenSim.Region.Framework.Scenes; | ||||||
|  | 
 | ||||||
|  | namespace OpenSim.Region.Framework.Interfaces | ||||||
|  | { | ||||||
|  |     public interface ISceneCommandsModule | ||||||
|  |     { | ||||||
|  |         /// <summary> | ||||||
|  |         /// Sets the scene debug options. | ||||||
|  |         /// </summary> | ||||||
|  |         void SetSceneDebugOptions(Dictionary<string, string> options); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -70,12 +70,12 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Show debug information about teleports. |         /// Show debug information about teleports. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         public bool DebugTeleporting { get; private set; } |         public bool DebugTeleporting { get; set; } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Show debug information about the scene loop. |         /// Show debug information about the scene loop. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         public bool DebugUpdates { get; private set; } |         public bool DebugUpdates { get; set; } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// If true then the scene is saved to persistent storage periodically, every m_update_backup frames and |         /// If true then the scene is saved to persistent storage periodically, every m_update_backup frames and | ||||||
|  | @ -86,13 +86,61 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         /// FIXME: Currently, setting this to false will mean that objects are not periodically returned from parcels.   |         /// FIXME: Currently, setting this to false will mean that objects are not periodically returned from parcels.   | ||||||
|         /// This needs to be fixed. |         /// This needs to be fixed. | ||||||
|         /// </remarks> |         /// </remarks> | ||||||
|         public bool PeriodicBackup { get; private set; } |         public bool PeriodicBackup { get; set; } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// If false then the scene is never saved to persistence storage even if PeriodicBackup == true and even |         /// If false then the scene is never saved to persistence storage even if PeriodicBackup == true and even | ||||||
|         /// if the scene is being shut down for the final time. |         /// if the scene is being shut down for the final time. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         public bool UseBackup { get; private set; } |         public bool UseBackup { get; set; } | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// If false then physical objects are disabled, though collisions will continue as normal. | ||||||
|  |         /// </summary> | ||||||
|  |         public bool PhysicsEnabled { get; set; } | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// If false then scripts are not enabled on the smiulator | ||||||
|  |         /// </summary> | ||||||
|  |         public bool ScriptsEnabled  | ||||||
|  |         {  | ||||||
|  |             get { return m_scripts_enabled; } | ||||||
|  |             set  | ||||||
|  |             { | ||||||
|  |                 if (m_scripts_enabled != value) | ||||||
|  |                 { | ||||||
|  |                     if (!value) | ||||||
|  |                     { | ||||||
|  |                         m_log.Info("Stopping all Scripts in Scene"); | ||||||
|  | 
 | ||||||
|  |                         EntityBase[] entities = Entities.GetEntities(); | ||||||
|  |                         foreach (EntityBase ent in entities) | ||||||
|  |                         { | ||||||
|  |                             if (ent is SceneObjectGroup) | ||||||
|  |                                 ((SceneObjectGroup)ent).RemoveScriptInstances(false); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                         m_log.Info("Starting all Scripts in Scene"); | ||||||
|  |      | ||||||
|  |                         EntityBase[] entities = Entities.GetEntities(); | ||||||
|  |                         foreach (EntityBase ent in entities) | ||||||
|  |                         { | ||||||
|  |                             if (ent is SceneObjectGroup) | ||||||
|  |                             { | ||||||
|  |                                 SceneObjectGroup sog = (SceneObjectGroup)ent; | ||||||
|  |                                 sog.CreateScriptInstances(0, false, DefaultScriptEngine, 0); | ||||||
|  |                                 sog.ResumeScripts(); | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     m_scripts_enabled = value; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         private bool m_scripts_enabled; | ||||||
| 
 | 
 | ||||||
|         public SynchronizeSceneHandler SynchronizeScene; |         public SynchronizeSceneHandler SynchronizeScene; | ||||||
| 
 | 
 | ||||||
|  | @ -275,8 +323,6 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>(); |         private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>(); | ||||||
|         private Dictionary<UUID, SceneObjectGroup> m_groupsWithTargets = new Dictionary<UUID, SceneObjectGroup>(); |         private Dictionary<UUID, SceneObjectGroup> m_groupsWithTargets = new Dictionary<UUID, SceneObjectGroup>(); | ||||||
| 
 | 
 | ||||||
|         private bool m_physics_enabled = true; |  | ||||||
|         private bool m_scripts_enabled = true; |  | ||||||
|         private string m_defaultScriptEngine; |         private string m_defaultScriptEngine; | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|  | @ -737,9 +783,11 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
| 
 | 
 | ||||||
|             DumpAssetsToFile = dumpAssetsToFile; |             DumpAssetsToFile = dumpAssetsToFile; | ||||||
| 
 | 
 | ||||||
|  |             // XXX: Don't set the public property since we don't want to activate here.  This needs to be handled  | ||||||
|  |             // better in the future. | ||||||
|             m_scripts_enabled = !RegionInfo.RegionSettings.DisableScripts; |             m_scripts_enabled = !RegionInfo.RegionSettings.DisableScripts; | ||||||
| 
 | 
 | ||||||
|             m_physics_enabled = !RegionInfo.RegionSettings.DisablePhysics; |             PhysicsEnabled = !RegionInfo.RegionSettings.DisablePhysics; | ||||||
| 
 | 
 | ||||||
|             m_simulatorVersion = simulatorVersion + " (" + Util.GetRuntimeInformation() + ")"; |             m_simulatorVersion = simulatorVersion + " (" + Util.GetRuntimeInformation() + ")"; | ||||||
| 
 | 
 | ||||||
|  | @ -906,6 +954,8 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         { |         { | ||||||
|             PhysicalPrims = true; |             PhysicalPrims = true; | ||||||
|             CollidablePrims = true; |             CollidablePrims = true; | ||||||
|  |             PhysicsEnabled = true; | ||||||
|  | 
 | ||||||
|             PeriodicBackup = true; |             PeriodicBackup = true; | ||||||
|             UseBackup = true; |             UseBackup = true; | ||||||
| 
 | 
 | ||||||
|  | @ -1150,91 +1200,6 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void SetSceneCoreDebug(Dictionary<string, string> options) |  | ||||||
|         { |  | ||||||
|             if (options.ContainsKey("active")) |  | ||||||
|             { |  | ||||||
|                 bool active; |  | ||||||
| 
 |  | ||||||
|                 if (bool.TryParse(options["active"], out active)) |  | ||||||
|                     Active = active; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             if (options.ContainsKey("pbackup")) |  | ||||||
|             { |  | ||||||
|                 bool active; |  | ||||||
| 
 |  | ||||||
|                 if (bool.TryParse(options["pbackup"], out active)) |  | ||||||
|                     PeriodicBackup = active; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             if (options.ContainsKey("scripting")) |  | ||||||
|             { |  | ||||||
|                 bool enableScripts = true; |  | ||||||
|                 if (bool.TryParse(options["scripting"], out enableScripts) && m_scripts_enabled != enableScripts) |  | ||||||
|                 { |  | ||||||
|                     if (!enableScripts) |  | ||||||
|                     { |  | ||||||
|                         m_log.Info("Stopping all Scripts in Scene"); |  | ||||||
|                          |  | ||||||
|                         EntityBase[] entities = Entities.GetEntities(); |  | ||||||
|                         foreach (EntityBase ent in entities) |  | ||||||
|                         { |  | ||||||
|                             if (ent is SceneObjectGroup) |  | ||||||
|                                 ((SceneObjectGroup)ent).RemoveScriptInstances(false); |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                     else |  | ||||||
|                     { |  | ||||||
|                         m_log.Info("Starting all Scripts in Scene"); |  | ||||||
|      |  | ||||||
|                         EntityBase[] entities = Entities.GetEntities(); |  | ||||||
|                         foreach (EntityBase ent in entities) |  | ||||||
|                         { |  | ||||||
|                             if (ent is SceneObjectGroup) |  | ||||||
|                             { |  | ||||||
|                                 SceneObjectGroup sog = (SceneObjectGroup)ent; |  | ||||||
|                                 sog.CreateScriptInstances(0, false, DefaultScriptEngine, 0); |  | ||||||
|                                 sog.ResumeScripts(); |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
| 
 |  | ||||||
|                     m_scripts_enabled = enableScripts; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             if (options.ContainsKey("physics")) |  | ||||||
|             { |  | ||||||
|                 bool enablePhysics; |  | ||||||
|                 if (bool.TryParse(options["physics"], out enablePhysics)) |  | ||||||
|                     m_physics_enabled = enablePhysics; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
| //            if (options.ContainsKey("collisions")) |  | ||||||
| //            { |  | ||||||
| //                // TODO: Implement.  If false, should stop objects colliding, though possibly should still allow |  | ||||||
| //                // the avatar themselves to collide with the ground. |  | ||||||
| //            } |  | ||||||
| 
 |  | ||||||
|             if (options.ContainsKey("teleport")) |  | ||||||
|             { |  | ||||||
|                 bool enableTeleportDebugging; |  | ||||||
|                 if (bool.TryParse(options["teleport"], out enableTeleportDebugging)) |  | ||||||
|                     DebugTeleporting = enableTeleportDebugging; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             if (options.ContainsKey("updates")) |  | ||||||
|             { |  | ||||||
|                 bool enableUpdateDebugging; |  | ||||||
|                 if (bool.TryParse(options["updates"], out enableUpdateDebugging)) |  | ||||||
|                 { |  | ||||||
|                     DebugUpdates = enableUpdateDebugging; |  | ||||||
|                     GcNotify.Enabled = DebugUpdates; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public int GetInaccurateNeighborCount() |         public int GetInaccurateNeighborCount() | ||||||
|         { |         { | ||||||
|             return m_neighbours.Count; |             return m_neighbours.Count; | ||||||
|  | @ -1484,7 +1449,7 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     tmpMS = Util.EnvironmentTickCount(); |                     tmpMS = Util.EnvironmentTickCount(); | ||||||
|                     if ((Frame % m_update_physics == 0) && m_physics_enabled) |                     if (PhysicsEnabled && Frame % m_update_physics == 0) | ||||||
|                         m_sceneGraph.UpdatePreparePhysics(); |                         m_sceneGraph.UpdatePreparePhysics(); | ||||||
|                     physicsMS2 = Util.EnvironmentTickCountSubtract(tmpMS); |                     physicsMS2 = Util.EnvironmentTickCountSubtract(tmpMS); | ||||||
|      |      | ||||||
|  | @ -1499,7 +1464,7 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                     tmpMS = Util.EnvironmentTickCount(); |                     tmpMS = Util.EnvironmentTickCount(); | ||||||
|                     if (Frame % m_update_physics == 0) |                     if (Frame % m_update_physics == 0) | ||||||
|                     { |                     { | ||||||
|                         if (m_physics_enabled) |                         if (PhysicsEnabled) | ||||||
|                             physicsFPS = m_sceneGraph.UpdatePhysics(MinFrameTime); |                             physicsFPS = m_sceneGraph.UpdatePhysics(MinFrameTime); | ||||||
|      |      | ||||||
|                         if (SynchronizeScene != null) |                         if (SynchronizeScene != null) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,236 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright (c) Contributors, http://opensimulator.org/ | ||||||
|  |  * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  *     * Redistributions of source code must retain the above copyright | ||||||
|  |  *       notice, this list of conditions and the following disclaimer. | ||||||
|  |  *     * Redistributions in binary form must reproduce the above copyright | ||||||
|  |  *       notice, this list of conditions and the following disclaimer in the | ||||||
|  |  *       documentation and/or other materials provided with the distribution. | ||||||
|  |  *     * Neither the name of the OpenSimulator Project nor the | ||||||
|  |  *       names of its contributors may be used to endorse or promote products | ||||||
|  |  *       derived from this software without specific prior written permission. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||||
|  |  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||||
|  |  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  |  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||||
|  |  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||||
|  |  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  |  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||||
|  |  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  |  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||||
|  |  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Reflection; | ||||||
|  | using System.Text; | ||||||
|  | using log4net; | ||||||
|  | using Mono.Addins; | ||||||
|  | using Nini.Config; | ||||||
|  | using OpenMetaverse; | ||||||
|  | using OpenSim.Framework; | ||||||
|  | using OpenSim.Framework.Console; | ||||||
|  | using OpenSim.Framework.Monitoring; | ||||||
|  | using OpenSim.Region.Framework.Interfaces; | ||||||
|  | using OpenSim.Region.Framework.Scenes; | ||||||
|  | 
 | ||||||
|  | namespace OpenSim.Region.OptionalModules.Avatar.Attachments | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// A module that just holds commands for inspecting avatar appearance. | ||||||
|  |     /// </summary> | ||||||
|  |     [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "SceneCommandsModule")] | ||||||
|  |     public class SceneCommandsModule : ISceneCommandsModule, INonSharedRegionModule | ||||||
|  |     { | ||||||
|  |         private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||||||
|  | 
 | ||||||
|  |         private Scene m_scene; | ||||||
|  | //        private IAvatarFactoryModule m_avatarFactory; | ||||||
|  | 
 | ||||||
|  |         public string Name { get { return "Scene Commands Module"; } } | ||||||
|  |          | ||||||
|  |         public Type ReplaceableInterface { get { return null; } } | ||||||
|  |          | ||||||
|  |         public void Initialise(IConfigSource source) | ||||||
|  |         { | ||||||
|  | //            m_log.DebugFormat("[SCENE COMMANDS MODULE]: INITIALIZED MODULE"); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         public void PostInitialise() | ||||||
|  |         { | ||||||
|  | //            m_log.DebugFormat("[SCENE COMMANDS MODULE]: POST INITIALIZED MODULE"); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         public void Close() | ||||||
|  |         { | ||||||
|  | //            m_log.DebugFormat("[SCENE COMMANDS MODULE]: CLOSED MODULE"); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         public void AddRegion(Scene scene) | ||||||
|  |         { | ||||||
|  | //            m_log.DebugFormat("[SCENE COMMANDS MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); | ||||||
|  | 
 | ||||||
|  |             m_scene = scene; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         public void RemoveRegion(Scene scene) | ||||||
|  |         { | ||||||
|  | //            m_log.DebugFormat("[SCENE COMMANDS MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); | ||||||
|  |         }         | ||||||
|  |          | ||||||
|  |         public void RegionLoaded(Scene scene) | ||||||
|  |         { | ||||||
|  | //            m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); | ||||||
|  | 
 | ||||||
|  |             scene.AddCommand( | ||||||
|  |                 "Debug", this, "debug scene set", | ||||||
|  |                 "debug scene set active|collisions|pbackup|physics|scripting|teleport|updates true|false", | ||||||
|  |                 "Turn on scene debugging options.", | ||||||
|  |                 "If active     is false then main scene update and maintenance loops are suspended.\n" | ||||||
|  |                     + "If collisions is false then collisions with other objects are turned off.\n" | ||||||
|  |                     + "If pbackup    is false then periodic scene backup is turned off.\n" | ||||||
|  |                     + "If physics    is false then all physics objects are non-physical.\n" | ||||||
|  |                     + "If scripting  is false then no scripting operations happen.\n" | ||||||
|  |                     + "If teleport   is true  then some extra teleport debug information is logged.\n" | ||||||
|  |                     + "If updates    is true  then any frame which exceeds double the maximum desired frame time is logged.", | ||||||
|  |                 HandleDebugSceneCommand); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private void HandleDebugSceneCommand(string module, string[] args) | ||||||
|  |         { | ||||||
|  |             if (args.Length == 5) | ||||||
|  |             { | ||||||
|  |                 if (MainConsole.Instance.ConsoleScene == null) | ||||||
|  |                 { | ||||||
|  |                     MainConsole.Instance.Output("Please use 'change region <regioname>' first"); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     string key = args[3]; | ||||||
|  |                     string value = args[4]; | ||||||
|  |                     SetSceneDebugOptions(new Dictionary<string, string>() { { key, value } }); | ||||||
|  | 
 | ||||||
|  |                     MainConsole.Instance.OutputFormat("Set debug scene {0} = {1}", key, value); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 MainConsole.Instance.Output( | ||||||
|  |                     "Usage: debug scene set active|collisions|pbackup|physics|scripting|teleport|updates true|false"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public void SetSceneDebugOptions(Dictionary<string, string> options) | ||||||
|  |         { | ||||||
|  |             if (options.ContainsKey("active")) | ||||||
|  |             { | ||||||
|  |                 bool active; | ||||||
|  | 
 | ||||||
|  |                 if (bool.TryParse(options["active"], out active)) | ||||||
|  |                     m_scene.Active = active; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (options.ContainsKey("pbackup")) | ||||||
|  |             { | ||||||
|  |                 bool active; | ||||||
|  | 
 | ||||||
|  |                 if (bool.TryParse(options["pbackup"], out active)) | ||||||
|  |                     m_scene.PeriodicBackup = active; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (options.ContainsKey("scripting")) | ||||||
|  |             { | ||||||
|  |                 bool enableScripts = true; | ||||||
|  |                 if (bool.TryParse(options["scripting"], out enableScripts)) | ||||||
|  |                     m_scene.ScriptsEnabled = enableScripts; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (options.ContainsKey("physics")) | ||||||
|  |             { | ||||||
|  |                 bool enablePhysics; | ||||||
|  |                 if (bool.TryParse(options["physics"], out enablePhysics)) | ||||||
|  |                     m_scene.PhysicsEnabled = enablePhysics; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  | //            if (options.ContainsKey("collisions")) | ||||||
|  | //            { | ||||||
|  | //                // TODO: Implement.  If false, should stop objects colliding, though possibly should still allow | ||||||
|  | //                // the avatar themselves to collide with the ground. | ||||||
|  | //            } | ||||||
|  | 
 | ||||||
|  |             if (options.ContainsKey("teleport")) | ||||||
|  |             { | ||||||
|  |                 bool enableTeleportDebugging; | ||||||
|  |                 if (bool.TryParse(options["teleport"], out enableTeleportDebugging)) | ||||||
|  |                     m_scene.DebugTeleporting = enableTeleportDebugging; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (options.ContainsKey("updates")) | ||||||
|  |             { | ||||||
|  |                 bool enableUpdateDebugging; | ||||||
|  |                 if (bool.TryParse(options["updates"], out enableUpdateDebugging)) | ||||||
|  |                 { | ||||||
|  |                     m_scene.DebugUpdates = enableUpdateDebugging; | ||||||
|  |                     GcNotify.Enabled = enableUpdateDebugging; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private void GetAttachmentsReport(ScenePresence sp, StringBuilder sb) | ||||||
|  |         { | ||||||
|  |             sb.AppendFormat("Attachments for {0}\n", sp.Name); | ||||||
|  | 
 | ||||||
|  |             ConsoleDisplayTable ct = new ConsoleDisplayTable() { Indent = 2 }; | ||||||
|  |             ct.Columns.Add(new ConsoleDisplayTableColumn("Attachment Name", 50)); | ||||||
|  |             ct.Columns.Add(new ConsoleDisplayTableColumn("Local ID", 10)); | ||||||
|  |             ct.Columns.Add(new ConsoleDisplayTableColumn("Item ID", 36)); | ||||||
|  |             ct.Columns.Add(new ConsoleDisplayTableColumn("Attach Point", 14)); | ||||||
|  |             ct.Columns.Add(new ConsoleDisplayTableColumn("Position", 15)); | ||||||
|  | 
 | ||||||
|  | //            sb.AppendFormat( | ||||||
|  | //                "  {0,-36}  {1,-10}  {2,-36}  {3,-14}  {4,-15}\n", | ||||||
|  | //                "Attachment Name", "Local ID", "Item ID", "Attach Point", "Position"); | ||||||
|  | 
 | ||||||
|  |             List<SceneObjectGroup> attachmentObjects = sp.GetAttachments(); | ||||||
|  |             foreach (SceneObjectGroup attachmentObject in attachmentObjects) | ||||||
|  |             { | ||||||
|  | //                InventoryItemBase attachmentItem | ||||||
|  | //                    = m_scenes[0].InventoryService.GetItem(new InventoryItemBase(attachmentObject.FromItemID)); | ||||||
|  | 
 | ||||||
|  | //                if (attachmentItem == null) | ||||||
|  | //                { | ||||||
|  | //                    sb.AppendFormat( | ||||||
|  | //                        "WARNING: Couldn't find attachment for item {0} at point {1}\n", | ||||||
|  | //                        attachmentData.ItemID, (AttachmentPoint)attachmentData.AttachPoint); | ||||||
|  | //                        continue; | ||||||
|  | //                } | ||||||
|  | //                else | ||||||
|  | //                { | ||||||
|  | //                    sb.AppendFormat( | ||||||
|  | //                        "  {0,-36}  {1,-10}  {2,-36}  {3,-14}  {4,-15}\n", | ||||||
|  | //                        attachmentObject.Name, attachmentObject.LocalId, attachmentObject.FromItemID, | ||||||
|  | //                        (AttachmentPoint)attachmentObject.AttachmentPoint, attachmentObject.RootPart.AttachedPos); | ||||||
|  |                     ct.Rows.Add( | ||||||
|  |                         new ConsoleDisplayTableRow( | ||||||
|  |                             new List<string>() | ||||||
|  |                             { | ||||||
|  |                                 attachmentObject.Name, | ||||||
|  |                                 attachmentObject.LocalId.ToString(), | ||||||
|  |                                 attachmentObject.FromItemID.ToString(), | ||||||
|  |                                 ((AttachmentPoint)attachmentObject.AttachmentPoint).ToString(), | ||||||
|  |                                 attachmentObject.RootPart.AttachedPos.ToString() | ||||||
|  |                             })); | ||||||
|  | //                } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             ct.AddToStringBuilder(sb); | ||||||
|  |             sb.Append("\n"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	 Justin Clark-Casey (justincc)
						Justin Clark-Casey (justincc)