mirror of
https://github.com/opensim/opensim.git
synced 2026-08-07 01:35:46 +08:00
Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6bd57f2455 | ||
|
|
af5a3f2d73 | ||
|
|
0ba01ce699 | ||
|
|
70e1dd54fa | ||
|
|
c42bff5388 | ||
|
|
10b3c6b5aa | ||
|
|
8ecf6ed08e | ||
|
|
09450448b0 | ||
|
|
e2823bfefe | ||
|
|
795009cae2 | ||
|
|
cc8fbf76e6 | ||
|
|
af27180131 | ||
|
|
c182157d4d | ||
|
|
1cda887d9b | ||
|
|
0ba0ac4669 | ||
|
|
ce8b30d868 | ||
|
|
d4c4cb3e67 | ||
|
|
ac4300664e | ||
|
|
069e2d6443 | ||
|
|
30eded2bda | ||
|
|
2563553f80 | ||
|
|
9ddddde42e | ||
|
|
99a5ea9f90 | ||
|
|
880b2361f5 | ||
|
|
f47f3dd8b9 | ||
|
|
8ee078c86b | ||
|
|
17d54a7c37 |
@@ -110,10 +110,11 @@ namespace OpenSim.Framework.Console
|
||||
// Remove initial help keyword
|
||||
helpParts.RemoveAt(0);
|
||||
|
||||
help.Add(""); // Will become a newline.
|
||||
|
||||
// General help
|
||||
if (helpParts.Count == 0)
|
||||
{
|
||||
help.Add(""); // Will become a newline.
|
||||
help.Add(GeneralHelpText);
|
||||
help.Add(ItemHelpText);
|
||||
help.AddRange(CollectModulesHelp(tree));
|
||||
@@ -127,6 +128,8 @@ namespace OpenSim.Framework.Console
|
||||
help.AddRange(CollectHelp(helpParts));
|
||||
}
|
||||
|
||||
help.Add(""); // Will become a newline.
|
||||
|
||||
return help;
|
||||
}
|
||||
|
||||
@@ -194,14 +197,11 @@ namespace OpenSim.Framework.Console
|
||||
|
||||
string descriptiveHelp = commandInfo.descriptive_help;
|
||||
|
||||
// If we do have some descriptive help then insert a spacing line before and after for readability.
|
||||
// If we do have some descriptive help then insert a spacing line before for readability.
|
||||
if (descriptiveHelp != string.Empty)
|
||||
help.Add(string.Empty);
|
||||
|
||||
help.Add(commandInfo.descriptive_help);
|
||||
|
||||
if (descriptiveHelp != string.Empty)
|
||||
help.Add(string.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace OpenSim
|
||||
public class VersionInfo
|
||||
{
|
||||
private const string VERSION_NUMBER = "0.7.5";
|
||||
private const Flavour VERSION_FLAVOUR = Flavour.RC1;
|
||||
private const Flavour VERSION_FLAVOUR = Flavour.RC2;
|
||||
|
||||
public enum Flavour
|
||||
{
|
||||
|
||||
@@ -299,6 +299,18 @@ namespace OpenSim.Framework
|
||||
x;
|
||||
}
|
||||
|
||||
// Clamp the maximum magnitude of a vector
|
||||
public static Vector3 ClampV(Vector3 x, float max)
|
||||
{
|
||||
Vector3 ret = x;
|
||||
float lenSq = x.LengthSquared();
|
||||
if (lenSq > (max * max))
|
||||
{
|
||||
x = x / x.Length() * max;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
// Inclusive, within range test (true if equal to the endpoints)
|
||||
public static bool InRange<T>(T x, T min, T max)
|
||||
where T : IComparable<T>
|
||||
|
||||
@@ -236,18 +236,6 @@ namespace OpenSim
|
||||
+ "If an avatar name is given then only packets from that avatar are logged",
|
||||
Debug);
|
||||
|
||||
m_console.Commands.AddCommand("Debug", false, "debug teleport", "debug teleport", "Toggle teleport route debugging", Debug);
|
||||
|
||||
m_console.Commands.AddCommand("Debug", false, "debug scene",
|
||||
"debug scene active|collisions|physics|scripting|teleport true|false",
|
||||
"Turn on scene debugging.",
|
||||
"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 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.",
|
||||
Debug);
|
||||
|
||||
m_console.Commands.AddCommand("General", false, "change region",
|
||||
"change region <region name>",
|
||||
"Change current console region", ChangeSelectedRegion);
|
||||
@@ -744,31 +732,6 @@ namespace OpenSim
|
||||
|
||||
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|scripting|collisions|physics|teleport true|false");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
MainConsole.Instance.Output("Unknown debug command");
|
||||
break;
|
||||
|
||||
@@ -96,8 +96,8 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
// private static readonly string m_fetchInventoryPath = "0006/";
|
||||
private static readonly string m_copyFromNotecardPath = "0007/";
|
||||
// private static readonly string m_remoteParcelRequestPath = "0009/";// This is in the LandManagementModule.
|
||||
|
||||
|
||||
private static readonly string m_UpdateAgentInformationPath = "0500/";
|
||||
|
||||
// These are callbacks which will be setup by the scene so that we can update scene data when we
|
||||
// receive capability calls
|
||||
public NewInventoryItem AddNewInventoryItem = null;
|
||||
@@ -204,6 +204,8 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req);
|
||||
m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req);
|
||||
m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req);
|
||||
IRequestHandler UpdateAgentInformationHandler = new RestStreamHandler("POST", capsBase + m_UpdateAgentInformationPath, UpdateAgentInformation);
|
||||
m_HostCapsObj.RegisterHandler("UpdateAgentInformation", UpdateAgentInformationHandler);
|
||||
|
||||
m_HostCapsObj.RegisterHandler(
|
||||
"CopyInventoryFromNotecard",
|
||||
@@ -855,6 +857,22 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
response["int_response_code"] = 200;
|
||||
return LLSDHelpers.SerialiseLLSDReply(response);
|
||||
}
|
||||
|
||||
public string UpdateAgentInformation(string request, string path,
|
||||
string param, IOSHttpRequest httpRequest,
|
||||
IOSHttpResponse httpResponse)
|
||||
{
|
||||
OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request);
|
||||
OSDMap resp = new OSDMap();
|
||||
|
||||
OSDMap accessPrefs = new OSDMap();
|
||||
accessPrefs["max"] = "A";
|
||||
|
||||
resp["access_prefs"] = accessPrefs;
|
||||
|
||||
string response = OSDParser.SerializeLLSDXmlString(resp);
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
||||
public class AssetUploader
|
||||
|
||||
@@ -6427,6 +6427,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
#endregion
|
||||
|
||||
AgentRequestSit handlerAgentRequestSit = OnAgentRequestSit;
|
||||
|
||||
if (handlerAgentRequestSit != null)
|
||||
handlerAgentRequestSit(this, agentRequestSit.AgentData.AgentID,
|
||||
agentRequestSit.TargetObject.TargetID, agentRequestSit.TargetObject.Offset);
|
||||
|
||||
@@ -212,11 +212,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
protected override GridRegion GetFinalDestination(GridRegion region)
|
||||
{
|
||||
int flags = Scene.GridService.GetRegionFlags(Scene.RegionInfo.ScopeID, region.RegionID);
|
||||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: region {0} flags: {1}", region.RegionID, flags);
|
||||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: region {0} flags: {1}", region.RegionName, flags);
|
||||
|
||||
if ((flags & (int)OpenSim.Framework.RegionFlags.Hyperlink) != 0)
|
||||
{
|
||||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Destination region {0} is hyperlink", region.RegionID);
|
||||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Destination region is hyperlink");
|
||||
GridRegion real_destination = m_GatekeeperConnector.GetHyperlinkRegion(region, region.RegionID);
|
||||
if (real_destination != null)
|
||||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: GetFinalDestination serveruri -> {0}", real_destination.ServerURI);
|
||||
|
||||
@@ -753,13 +753,18 @@ namespace OpenSim.Region.CoreModules.World.Estate
|
||||
Scene.RegionInfo.RegionSettings.Save();
|
||||
TriggerRegionInfoChange();
|
||||
|
||||
Scene.SetSceneCoreDebug(
|
||||
new Dictionary<string, string>() {
|
||||
{ "scripting", (!disableScripts).ToString() },
|
||||
{ "collisions", (!disableCollisions).ToString() },
|
||||
{ "physics", (!disablePhysics).ToString() }
|
||||
}
|
||||
);
|
||||
ISceneCommandsModule scm = Scene.RequestModuleInterface<ISceneCommandsModule>();
|
||||
|
||||
if (scm != null)
|
||||
{
|
||||
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)
|
||||
|
||||
43
OpenSim/Region/Framework/Interfaces/ISceneCommandsModule.cs
Normal file
43
OpenSim/Region/Framework/Interfaces/ISceneCommandsModule.cs
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -87,13 +87,24 @@ namespace OpenSim.Region.Framework.Scenes.Animation
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool Remove(UUID animID)
|
||||
/// <summary>
|
||||
/// Remove the specified animation
|
||||
/// </summary>
|
||||
/// <param name='animID'></param>
|
||||
/// <param name='allowNoDefault'>
|
||||
/// If true, then the default animation can be entirely removed.
|
||||
/// If false, then removing the default animation will reset it to the simulator default (currently STAND).
|
||||
/// </param>
|
||||
public bool Remove(UUID animID, bool allowNoDefault)
|
||||
{
|
||||
lock (m_animations)
|
||||
{
|
||||
if (m_defaultAnimation.AnimID == animID)
|
||||
{
|
||||
m_defaultAnimation = new OpenSim.Framework.Animation(UUID.Zero, 1, UUID.Zero);
|
||||
if (allowNoDefault)
|
||||
m_defaultAnimation = new OpenSim.Framework.Animation(UUID.Zero, 1, UUID.Zero);
|
||||
else
|
||||
ResetDefaultAnimation();
|
||||
}
|
||||
else if (HasAnimation(animID))
|
||||
{
|
||||
|
||||
@@ -86,7 +86,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation
|
||||
if (m_scenePresence.IsChildAgent)
|
||||
return;
|
||||
|
||||
// m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Adding animation {0} for {1}", animID, m_scenePresence.Name);
|
||||
if (m_scenePresence.Scene.DebugAnimations)
|
||||
m_log.DebugFormat(
|
||||
"[SCENE PRESENCE ANIMATOR]: Adding animation {0} {1} for {2}",
|
||||
GetAnimName(animID), animID, m_scenePresence.Name);
|
||||
|
||||
if (m_animations.Add(animID, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, objectID))
|
||||
SendAnimPack();
|
||||
@@ -109,14 +112,25 @@ namespace OpenSim.Region.Framework.Scenes.Animation
|
||||
AddAnimation(animID, objectID);
|
||||
}
|
||||
|
||||
public void RemoveAnimation(UUID animID)
|
||||
/// <summary>
|
||||
/// Remove the specified animation
|
||||
/// </summary>
|
||||
/// <param name='animID'></param>
|
||||
/// <param name='allowNoDefault'>
|
||||
/// If true, then the default animation can be entirely removed.
|
||||
/// If false, then removing the default animation will reset it to the simulator default (currently STAND).
|
||||
/// </param>
|
||||
public void RemoveAnimation(UUID animID, bool allowNoDefault)
|
||||
{
|
||||
if (m_scenePresence.IsChildAgent)
|
||||
return;
|
||||
|
||||
// m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Removing animation {0} for {1}", animID, m_scenePresence.Name);
|
||||
if (m_scenePresence.Scene.DebugAnimations)
|
||||
m_log.DebugFormat(
|
||||
"[SCENE PRESENCE ANIMATOR]: Removing animation {0} {1} for {2}",
|
||||
GetAnimName(animID), animID, m_scenePresence.Name);
|
||||
|
||||
if (m_animations.Remove(animID))
|
||||
if (m_animations.Remove(animID, allowNoDefault))
|
||||
SendAnimPack();
|
||||
}
|
||||
|
||||
@@ -132,14 +146,15 @@ namespace OpenSim.Region.Framework.Scenes.Animation
|
||||
if (animID == UUID.Zero)
|
||||
return;
|
||||
|
||||
RemoveAnimation(animID);
|
||||
RemoveAnimation(animID, true);
|
||||
}
|
||||
|
||||
public void ResetAnimations()
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE PRESENCE ANIMATOR]: Resetting animations for {0} in {1}",
|
||||
// m_scenePresence.Name, m_scenePresence.Scene.RegionInfo.RegionName);
|
||||
if (m_scenePresence.Scene.DebugAnimations)
|
||||
m_log.DebugFormat(
|
||||
"[SCENE PRESENCE ANIMATOR]: Resetting animations for {0} in {1}",
|
||||
m_scenePresence.Name, m_scenePresence.Scene.RegionInfo.RegionName);
|
||||
|
||||
m_animations.Clear();
|
||||
}
|
||||
@@ -550,5 +565,21 @@ namespace OpenSim.Region.Framework.Scenes.Animation
|
||||
|
||||
SendAnimPack(animIDs, sequenceNums, objectIDs);
|
||||
}
|
||||
|
||||
public string GetAnimName(UUID animId)
|
||||
{
|
||||
string animName;
|
||||
|
||||
if (!DefaultAvatarAnimations.AnimsNames.TryGetValue(animId, out animName))
|
||||
{
|
||||
AssetMetadata amd = m_scenePresence.Scene.AssetService.GetMetadata(animId.ToString());
|
||||
if (amd != null)
|
||||
animName = amd.Name;
|
||||
else
|
||||
animName = "Unknown";
|
||||
}
|
||||
|
||||
return animName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,15 +67,85 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
public bool EmergencyMonitoring = false;
|
||||
|
||||
/// <summary>
|
||||
/// Show debug information about animations.
|
||||
/// </summary>
|
||||
public bool DebugAnimations { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Show debug information about teleports.
|
||||
/// </summary>
|
||||
public bool DebugTeleporting { get; private set; }
|
||||
public bool DebugTeleporting { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Show debug information about the scene loop.
|
||||
/// </summary>
|
||||
public bool DebugUpdates { get; private set; }
|
||||
public bool DebugUpdates { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// If true then the scene is saved to persistent storage periodically, every m_update_backup frames and
|
||||
/// if objects meet required conditions (m_dontPersistBefore and m_dontPersistAfter).
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Even if false, the scene will still be saved on clean shutdown.
|
||||
/// FIXME: Currently, setting this to false will mean that objects are not periodically returned from parcels.
|
||||
/// This needs to be fixed.
|
||||
/// </remarks>
|
||||
public bool PeriodicBackup { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
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;
|
||||
|
||||
@@ -282,8 +352,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>();
|
||||
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;
|
||||
|
||||
/// <summary>
|
||||
@@ -341,7 +409,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
private Timer m_mapGenerationTimer = new Timer();
|
||||
private bool m_generateMaptiles;
|
||||
private bool m_useBackup = true;
|
||||
|
||||
#endregion Fields
|
||||
|
||||
@@ -594,11 +661,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
get { return m_authenticateHandler; }
|
||||
}
|
||||
|
||||
public bool UseBackup
|
||||
{
|
||||
get { return m_useBackup; }
|
||||
}
|
||||
|
||||
// an instance to the physics plugin's Scene object.
|
||||
public PhysicsScene PhysicsScene
|
||||
{
|
||||
@@ -751,9 +813,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
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_physics_enabled = !RegionInfo.RegionSettings.DisablePhysics;
|
||||
PhysicsEnabled = !RegionInfo.RegionSettings.DisablePhysics;
|
||||
|
||||
m_simulatorVersion = simulatorVersion + " (" + Util.GetRuntimeInformation() + ")";
|
||||
|
||||
@@ -768,8 +832,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
StartDisabled = startupConfig.GetBoolean("StartDisabled", false);
|
||||
|
||||
m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance);
|
||||
m_useBackup = startupConfig.GetBoolean("UseSceneBackup", m_useBackup);
|
||||
if (!m_useBackup)
|
||||
UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup);
|
||||
if (!UseBackup)
|
||||
m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
|
||||
|
||||
//Animation states
|
||||
@@ -937,6 +1001,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
PhysicalPrims = true;
|
||||
CollidablePrims = true;
|
||||
PhysicsEnabled = true;
|
||||
|
||||
PeriodicBackup = true;
|
||||
UseBackup = true;
|
||||
|
||||
BordersLocked = true;
|
||||
Border northBorder = new Border();
|
||||
@@ -1179,83 +1247,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("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()
|
||||
{
|
||||
return m_neighbours.Count;
|
||||
@@ -1514,7 +1505,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
}
|
||||
|
||||
tmpMS = Util.EnvironmentTickCount();
|
||||
if ((Frame % m_update_physics == 0) && m_physics_enabled)
|
||||
if (PhysicsEnabled && Frame % m_update_physics == 0)
|
||||
m_sceneGraph.UpdatePreparePhysics();
|
||||
physicsMS2 = Util.EnvironmentTickCountSubtract(tmpMS);
|
||||
|
||||
@@ -1529,7 +1520,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
tmpMS = Util.EnvironmentTickCount();
|
||||
if (Frame % m_update_physics == 0)
|
||||
{
|
||||
if (m_physics_enabled)
|
||||
if (PhysicsEnabled)
|
||||
physicsFPS = m_sceneGraph.UpdatePhysics(MinFrameTime);
|
||||
|
||||
if (SynchronizeScene != null)
|
||||
@@ -1570,7 +1561,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
eventMS = Util.EnvironmentTickCountSubtract(tmpMS);
|
||||
}
|
||||
|
||||
if (Frame % m_update_backup == 0)
|
||||
if (PeriodicBackup && Frame % m_update_backup == 0)
|
||||
{
|
||||
tmpMS = Util.EnvironmentTickCount();
|
||||
UpdateStorageBackup();
|
||||
|
||||
@@ -4050,9 +4050,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
rigidBody,
|
||||
m_localId);
|
||||
}
|
||||
catch
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[SCENE]: caught exception meshing object {0}. Object set to phantom.", m_uuid);
|
||||
m_log.ErrorFormat("[SCENE]: caught exception meshing object {0}. Object set to phantom. e={1}", m_uuid, e);
|
||||
pa = null;
|
||||
}
|
||||
|
||||
|
||||
@@ -1954,6 +1954,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
if (ParentID != 0)
|
||||
{
|
||||
if (ParentPart.UUID == targetID)
|
||||
return; // already sitting here, ignore
|
||||
|
||||
StandUp();
|
||||
}
|
||||
|
||||
@@ -2256,7 +2259,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
public void HandleStopAnim(IClientAPI remoteClient, UUID animID)
|
||||
{
|
||||
Animator.RemoveAnimation(animID);
|
||||
Animator.RemoveAnimation(animID, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -161,12 +161,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Animations
|
||||
UUID defaultAnimId = anims.DefaultAnimation.AnimID;
|
||||
cdl.AddRow(
|
||||
"Default anim",
|
||||
string.Format("{0}, {1}", defaultAnimId, GetAnimName(sp.Scene.AssetService, defaultAnimId)));
|
||||
string.Format("{0}, {1}", defaultAnimId, sp.Animator.GetAnimName(defaultAnimId)));
|
||||
|
||||
UUID implicitDefaultAnimId = anims.ImplicitDefaultAnimation.AnimID;
|
||||
cdl.AddRow(
|
||||
"Implicit default anim",
|
||||
string.Format("{0}, {1}", implicitDefaultAnimId, GetAnimName(sp.Scene.AssetService, implicitDefaultAnimId)));
|
||||
string.Format("{0}, {1}",
|
||||
implicitDefaultAnimId, sp.Animator.GetAnimName(implicitDefaultAnimId)));
|
||||
|
||||
cdl.AddToStringBuilder(sb);
|
||||
|
||||
@@ -185,7 +186,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Animations
|
||||
for (int i = 0; i < animIds.Length; i++)
|
||||
{
|
||||
UUID animId = animIds[i];
|
||||
string animName = GetAnimName(sp.Scene.AssetService, animId);
|
||||
string animName = sp.Animator.GetAnimName(animId);
|
||||
int seq = sequenceNumbers[i];
|
||||
UUID objectId = objectIds[i];
|
||||
|
||||
@@ -195,21 +196,5 @@ namespace OpenSim.Region.OptionalModules.Avatar.Animations
|
||||
cdt.AddToStringBuilder(sb);
|
||||
sb.Append("\n");
|
||||
}
|
||||
|
||||
private string GetAnimName(IAssetService assetService, UUID animId)
|
||||
{
|
||||
string animName;
|
||||
|
||||
if (!DefaultAvatarAnimations.AnimsNames.TryGetValue(animId, out animName))
|
||||
{
|
||||
AssetMetadata amd = assetService.GetMetadata(animId.ToString());
|
||||
if (amd != null)
|
||||
animName = amd.Name;
|
||||
else
|
||||
animName = "Unknown";
|
||||
}
|
||||
|
||||
return animName;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -126,7 +126,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||
{
|
||||
scene.RegisterModuleInterface<IGroupsModule>(this);
|
||||
scene.AddCommand(
|
||||
"debug",
|
||||
"Debug",
|
||||
this,
|
||||
"debug groups verbose",
|
||||
"debug groups verbose <true|false>",
|
||||
|
||||
@@ -0,0 +1,235 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
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;
|
||||
|
||||
m_scene.RegisterModuleInterface<ISceneCommandsModule>(this);
|
||||
}
|
||||
|
||||
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 get",
|
||||
"debug scene get",
|
||||
"List current scene options.",
|
||||
"If active is false then main scene update and maintenance loops are suspended.\n"
|
||||
+ "If animations is true then extra animations debug information is logged.\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.",
|
||||
HandleDebugSceneGetCommand);
|
||||
|
||||
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 animations is true then extra animations debug information is logged.\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.",
|
||||
HandleDebugSceneSetCommand);
|
||||
}
|
||||
|
||||
private void HandleDebugSceneGetCommand(string module, string[] args)
|
||||
{
|
||||
if (args.Length == 3)
|
||||
{
|
||||
if (MainConsole.Instance.ConsoleScene != m_scene && MainConsole.Instance.ConsoleScene != null)
|
||||
return;
|
||||
|
||||
OutputSceneDebugOptions();
|
||||
}
|
||||
else
|
||||
{
|
||||
MainConsole.Instance.Output("Usage: debug scene get");
|
||||
}
|
||||
}
|
||||
|
||||
private void OutputSceneDebugOptions()
|
||||
{
|
||||
ConsoleDisplayList cdl = new ConsoleDisplayList();
|
||||
cdl.AddRow("active", m_scene.Active);
|
||||
cdl.AddRow("animations", m_scene.DebugAnimations);
|
||||
cdl.AddRow("pbackup", m_scene.PeriodicBackup);
|
||||
cdl.AddRow("physics", m_scene.PhysicsEnabled);
|
||||
cdl.AddRow("scripting", m_scene.ScriptsEnabled);
|
||||
cdl.AddRow("teleport", m_scene.DebugTeleporting);
|
||||
cdl.AddRow("updates", m_scene.DebugUpdates);
|
||||
|
||||
MainConsole.Instance.OutputFormat("Scene {0} options:", m_scene.Name);
|
||||
MainConsole.Instance.Output(cdl.ToString());
|
||||
}
|
||||
|
||||
private void HandleDebugSceneSetCommand(string module, string[] args)
|
||||
{
|
||||
if (args.Length == 5)
|
||||
{
|
||||
if (MainConsole.Instance.ConsoleScene != m_scene && MainConsole.Instance.ConsoleScene != null)
|
||||
return;
|
||||
|
||||
string key = args[3];
|
||||
string value = args[4];
|
||||
SetSceneDebugOptions(new Dictionary<string, string>() { { key, value } });
|
||||
|
||||
MainConsole.Instance.OutputFormat("Set {0} debug scene {1} = {2}", m_scene.Name, 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("animations"))
|
||||
{
|
||||
bool active;
|
||||
|
||||
if (bool.TryParse(options["animations"], out active))
|
||||
m_scene.DebugAnimations = 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3341,7 +3341,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
if (animID == UUID.Zero)
|
||||
presence.Animator.RemoveAnimation(anim);
|
||||
else
|
||||
presence.Animator.RemoveAnimation(animID);
|
||||
presence.Animator.RemoveAnimation(animID, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10567,6 +10567,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
case ScriptBaseClass.OBJECT_PHYSICS_COST:
|
||||
ret.Add(new LSL_Float(0));
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_CHARACTER_TIME: // Pathfinding
|
||||
ret.Add(new LSL_Float(0));
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_ROOT:
|
||||
SceneObjectPart p = av.ParentPart;
|
||||
if (p != null)
|
||||
{
|
||||
ret.Add(new LSL_String(p.ParentGroup.RootPart.UUID.ToString()));
|
||||
}
|
||||
else
|
||||
{
|
||||
ret.Add(new LSL_String(id));
|
||||
}
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_ATTACHED_POINT:
|
||||
ret.Add(new LSL_Integer(0));
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_PATHFINDING_TYPE: // Pathfinding
|
||||
ret.Add(new LSL_Integer(ScriptBaseClass.OPT_AVATAR));
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_PHYSICS:
|
||||
ret.Add(new LSL_Integer(0));
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_PHANTOM:
|
||||
ret.Add(new LSL_Integer(0));
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_TEMP_ON_REZ:
|
||||
ret.Add(new LSL_Integer(0));
|
||||
break;
|
||||
default:
|
||||
// Invalid or unhandled constant.
|
||||
ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL));
|
||||
@@ -10662,6 +10691,52 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
// The value returned in SL for normal prims looks like the prim count
|
||||
ret.Add(new LSL_Float(0));
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_CHARACTER_TIME: // Pathfinding
|
||||
ret.Add(new LSL_Float(0));
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_ROOT:
|
||||
ret.Add(new LSL_String(obj.ParentGroup.RootPart.UUID.ToString()));
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_ATTACHED_POINT:
|
||||
ret.Add(new LSL_Integer(obj.ParentGroup.AttachmentPoint));
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_PATHFINDING_TYPE:
|
||||
byte pcode = obj.Shape.PCode;
|
||||
if (obj.ParentGroup.AttachmentPoint != 0
|
||||
|| pcode == (byte)PCode.Grass
|
||||
|| pcode == (byte)PCode.Tree
|
||||
|| pcode == (byte)PCode.NewTree)
|
||||
{
|
||||
ret.Add(new LSL_Integer(ScriptBaseClass.OPT_OTHER));
|
||||
}
|
||||
else
|
||||
{
|
||||
ret.Add(new LSL_Integer(ScriptBaseClass.OPT_LEGACY_LINKSET));
|
||||
}
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_PHYSICS:
|
||||
if (obj.ParentGroup.AttachmentPoint != 0)
|
||||
{
|
||||
ret.Add(new LSL_Integer(0)); // Always false if attached
|
||||
}
|
||||
else
|
||||
{
|
||||
ret.Add(new LSL_Integer(obj.ParentGroup.UsesPhysics ? 1 : 0));
|
||||
}
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_PHANTOM:
|
||||
if (obj.ParentGroup.AttachmentPoint != 0)
|
||||
{
|
||||
ret.Add(new LSL_Integer(0)); // Always false if attached
|
||||
}
|
||||
else
|
||||
{
|
||||
ret.Add(new LSL_Integer(obj.ParentGroup.IsPhantom ? 1 : 0));
|
||||
}
|
||||
break;
|
||||
case ScriptBaseClass.OBJECT_TEMP_ON_REZ:
|
||||
ret.Add(new LSL_Integer(obj.ParentGroup.IsTemporary ? 1 : 0));
|
||||
break;
|
||||
default:
|
||||
// Invalid or unhandled constant.
|
||||
ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL));
|
||||
|
||||
@@ -974,7 +974,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
if (animID == UUID.Zero)
|
||||
target.Animator.RemoveAnimation(animation);
|
||||
else
|
||||
target.Animator.RemoveAnimation(animID);
|
||||
target.Animator.RemoveAnimation(animID, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/// <summary>
|
||||
/// Used by one-off and repeated sensors
|
||||
/// </summary>
|
||||
public class SensorInfo
|
||||
{
|
||||
public uint localID;
|
||||
public UUID itemID;
|
||||
public double interval;
|
||||
public DateTime next;
|
||||
|
||||
public string name;
|
||||
public UUID keyID;
|
||||
public int type;
|
||||
public double range;
|
||||
public double arc;
|
||||
public SceneObjectPart host;
|
||||
|
||||
public SensorInfo Clone()
|
||||
{
|
||||
return (SensorInfo)this.MemberwiseClone();
|
||||
}
|
||||
}
|
||||
|
||||
public AsyncCommandManager m_CmdManager;
|
||||
|
||||
/// <summary>
|
||||
@@ -78,24 +101,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
private double maximumRange = 96.0;
|
||||
private int maximumToReturn = 16;
|
||||
|
||||
//
|
||||
// SenseRepeater and Sensors
|
||||
//
|
||||
private class SenseRepeatClass
|
||||
{
|
||||
public uint localID;
|
||||
public UUID itemID;
|
||||
public double interval;
|
||||
public DateTime next;
|
||||
|
||||
public string name;
|
||||
public UUID keyID;
|
||||
public int type;
|
||||
public double range;
|
||||
public double arc;
|
||||
public SceneObjectPart host;
|
||||
}
|
||||
|
||||
//
|
||||
// Sensed entity
|
||||
//
|
||||
@@ -128,7 +133,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
///
|
||||
/// Always lock SenseRepeatListLock when updating this list.
|
||||
/// </remarks>
|
||||
private List<SenseRepeatClass> SenseRepeaters = new List<SenseRepeatClass>();
|
||||
private List<SensorInfo> SenseRepeaters = new List<SensorInfo>();
|
||||
private object SenseRepeatListLock = new object();
|
||||
|
||||
public void SetSenseRepeatEvent(uint m_localID, UUID m_itemID,
|
||||
@@ -142,7 +147,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
return;
|
||||
|
||||
// Add to timer
|
||||
SenseRepeatClass ts = new SenseRepeatClass();
|
||||
SensorInfo ts = new SensorInfo();
|
||||
ts.localID = m_localID;
|
||||
ts.itemID = m_itemID;
|
||||
ts.interval = sec;
|
||||
@@ -161,11 +166,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
AddSenseRepeater(ts);
|
||||
}
|
||||
|
||||
private void AddSenseRepeater(SenseRepeatClass senseRepeater)
|
||||
private void AddSenseRepeater(SensorInfo senseRepeater)
|
||||
{
|
||||
lock (SenseRepeatListLock)
|
||||
{
|
||||
List<SenseRepeatClass> newSenseRepeaters = new List<SenseRepeatClass>(SenseRepeaters);
|
||||
List<SensorInfo> newSenseRepeaters = new List<SensorInfo>(SenseRepeaters);
|
||||
newSenseRepeaters.Add(senseRepeater);
|
||||
SenseRepeaters = newSenseRepeaters;
|
||||
}
|
||||
@@ -176,8 +181,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
// Remove from timer
|
||||
lock (SenseRepeatListLock)
|
||||
{
|
||||
List<SenseRepeatClass> newSenseRepeaters = new List<SenseRepeatClass>();
|
||||
foreach (SenseRepeatClass ts in SenseRepeaters)
|
||||
List<SensorInfo> newSenseRepeaters = new List<SensorInfo>();
|
||||
foreach (SensorInfo ts in SenseRepeaters)
|
||||
{
|
||||
if (ts.localID != m_localID || ts.itemID != m_itemID)
|
||||
{
|
||||
@@ -192,7 +197,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
public void CheckSenseRepeaterEvents()
|
||||
{
|
||||
// Go through all timers
|
||||
foreach (SenseRepeatClass ts in SenseRepeaters)
|
||||
foreach (SensorInfo ts in SenseRepeaters)
|
||||
{
|
||||
// Time has passed?
|
||||
if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime())
|
||||
@@ -209,7 +214,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
double range, double arc, SceneObjectPart host)
|
||||
{
|
||||
// Add to timer
|
||||
SenseRepeatClass ts = new SenseRepeatClass();
|
||||
SensorInfo ts = new SensorInfo();
|
||||
ts.localID = m_localID;
|
||||
ts.itemID = m_itemID;
|
||||
ts.interval = 0;
|
||||
@@ -225,7 +230,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
SensorSweep(ts);
|
||||
}
|
||||
|
||||
private void SensorSweep(SenseRepeatClass ts)
|
||||
private void SensorSweep(SensorInfo ts)
|
||||
{
|
||||
if (ts.host == null)
|
||||
{
|
||||
@@ -301,7 +306,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
}
|
||||
}
|
||||
|
||||
private List<SensedEntity> doObjectSensor(SenseRepeatClass ts)
|
||||
private List<SensedEntity> doObjectSensor(SensorInfo ts)
|
||||
{
|
||||
List<EntityBase> Entities;
|
||||
List<SensedEntity> sensedEntities = new List<SensedEntity>();
|
||||
@@ -450,7 +455,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
return sensedEntities;
|
||||
}
|
||||
|
||||
private List<SensedEntity> doAgentSensor(SenseRepeatClass ts)
|
||||
private List<SensedEntity> doAgentSensor(SensorInfo ts)
|
||||
{
|
||||
List<SensedEntity> sensedEntities = new List<SensedEntity>();
|
||||
|
||||
@@ -626,7 +631,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
{
|
||||
List<Object> data = new List<Object>();
|
||||
|
||||
foreach (SenseRepeatClass ts in SenseRepeaters)
|
||||
foreach (SensorInfo ts in SenseRepeaters)
|
||||
{
|
||||
if (ts.itemID == itemID)
|
||||
{
|
||||
@@ -656,7 +661,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
|
||||
while (idx < data.Length)
|
||||
{
|
||||
SenseRepeatClass ts = new SenseRepeatClass();
|
||||
SensorInfo ts = new SensorInfo();
|
||||
|
||||
ts.localID = localID;
|
||||
ts.itemID = itemID;
|
||||
@@ -677,5 +682,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
idx += 6;
|
||||
}
|
||||
}
|
||||
|
||||
public List<SensorInfo> GetSensorInfo()
|
||||
{
|
||||
List<SensorInfo> retList = new List<SensorInfo>();
|
||||
|
||||
lock (SenseRepeatListLock)
|
||||
{
|
||||
foreach (SensorInfo i in SenseRepeaters)
|
||||
retList.Add(i.Clone());
|
||||
}
|
||||
|
||||
return retList;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,6 +35,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
{
|
||||
public class Timer
|
||||
{
|
||||
public class TimerInfo
|
||||
{
|
||||
public uint localID;
|
||||
public UUID itemID;
|
||||
//public double interval;
|
||||
public long interval;
|
||||
//public DateTime next;
|
||||
public long next;
|
||||
|
||||
public TimerInfo Clone()
|
||||
{
|
||||
return (TimerInfo)this.MemberwiseClone();
|
||||
}
|
||||
}
|
||||
|
||||
public AsyncCommandManager m_CmdManager;
|
||||
|
||||
public int TimersCount
|
||||
@@ -59,17 +74,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
return localID.ToString() + itemID.ToString();
|
||||
}
|
||||
|
||||
private class TimerClass
|
||||
{
|
||||
public uint localID;
|
||||
public UUID itemID;
|
||||
//public double interval;
|
||||
public long interval;
|
||||
//public DateTime next;
|
||||
public long next;
|
||||
}
|
||||
|
||||
private Dictionary<string,TimerClass> Timers = new Dictionary<string,TimerClass>();
|
||||
private Dictionary<string,TimerInfo> Timers = new Dictionary<string,TimerInfo>();
|
||||
private object TimerListLock = new object();
|
||||
|
||||
public void SetTimerEvent(uint m_localID, UUID m_itemID, double sec)
|
||||
@@ -81,7 +86,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
}
|
||||
|
||||
// Add to timer
|
||||
TimerClass ts = new TimerClass();
|
||||
TimerInfo ts = new TimerInfo();
|
||||
ts.localID = m_localID;
|
||||
ts.itemID = m_itemID;
|
||||
ts.interval = Convert.ToInt64(sec * 10000000); // How many 100 nanoseconds (ticks) should we wait
|
||||
@@ -121,8 +126,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
lock (TimerListLock)
|
||||
{
|
||||
// Go through all timers
|
||||
Dictionary<string, TimerClass>.ValueCollection tvals = Timers.Values;
|
||||
foreach (TimerClass ts in tvals)
|
||||
Dictionary<string, TimerInfo>.ValueCollection tvals = Timers.Values;
|
||||
foreach (TimerInfo ts in tvals)
|
||||
{
|
||||
// Time has passed?
|
||||
if (ts.next < DateTime.Now.Ticks)
|
||||
@@ -147,8 +152,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
|
||||
lock (TimerListLock)
|
||||
{
|
||||
Dictionary<string, TimerClass>.ValueCollection tvals = Timers.Values;
|
||||
foreach (TimerClass ts in tvals)
|
||||
Dictionary<string, TimerInfo>.ValueCollection tvals = Timers.Values;
|
||||
foreach (TimerInfo ts in tvals)
|
||||
{
|
||||
if (ts.itemID == itemID)
|
||||
{
|
||||
@@ -167,7 +172,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
|
||||
while (idx < data.Length)
|
||||
{
|
||||
TimerClass ts = new TimerClass();
|
||||
TimerInfo ts = new TimerInfo();
|
||||
|
||||
ts.localID = localID;
|
||||
ts.itemID = itemID;
|
||||
@@ -181,5 +186,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<TimerInfo> GetTimersInfo()
|
||||
{
|
||||
List<TimerInfo> retList = new List<TimerInfo>();
|
||||
|
||||
lock (TimerListLock)
|
||||
{
|
||||
foreach (TimerInfo i in Timers.Values)
|
||||
retList.Add(i.Clone());
|
||||
}
|
||||
|
||||
return retList;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -556,6 +556,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
public const int OBJECT_SERVER_COST = 14;
|
||||
public const int OBJECT_STREAMING_COST = 15;
|
||||
public const int OBJECT_PHYSICS_COST = 16;
|
||||
public const int OBJECT_CHARACTER_TIME = 17;
|
||||
public const int OBJECT_ROOT = 18;
|
||||
public const int OBJECT_ATTACHED_POINT = 19;
|
||||
public const int OBJECT_PATHFINDING_TYPE = 20;
|
||||
public const int OBJECT_PHYSICS = 21;
|
||||
public const int OBJECT_PHANTOM = 22;
|
||||
public const int OBJECT_TEMP_ON_REZ = 23;
|
||||
|
||||
// Pathfinding types
|
||||
public const int OPT_OTHER = -1;
|
||||
public const int OPT_LEGACY_LINKSET = 0;
|
||||
public const int OPT_AVATAR = 1;
|
||||
public const int OPT_CHARACTER = 2;
|
||||
public const int OPT_WALKABLE = 3;
|
||||
public const int OPT_STATIC_OBSTACLE = 4;
|
||||
public const int OPT_MATERIAL_VOLUME = 5;
|
||||
public const int OPT_EXCLUSION_VOLUME = 6;
|
||||
|
||||
// for llGetAgentList
|
||||
public const int AGENT_LIST_PARCEL = 1;
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* 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 OpenSim.Framework;
|
||||
using OpenSim.Framework.Console;
|
||||
using OpenSim.Region.ScriptEngine.Interfaces;
|
||||
using OpenSim.Region.ScriptEngine.Shared.Api;
|
||||
using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
|
||||
|
||||
namespace OpenSim.Region.ScriptEngine.XEngine
|
||||
{
|
||||
public class ScriptEngineConsoleCommands
|
||||
{
|
||||
IScriptEngine m_engine;
|
||||
|
||||
public ScriptEngineConsoleCommands(IScriptEngine engine)
|
||||
{
|
||||
m_engine = engine;
|
||||
}
|
||||
|
||||
public void RegisterCommands()
|
||||
{
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Scripts", false, "show script sensors", "show script sensors", "Show script sensors information",
|
||||
HandleShowSensors);
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Scripts", false, "show script timers", "show script timers", "Show script sensors information",
|
||||
HandleShowTimers);
|
||||
}
|
||||
|
||||
private bool IsSceneSelected()
|
||||
{
|
||||
return MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_engine.World;
|
||||
}
|
||||
|
||||
private void HandleShowSensors(string module, string[] cmdparams)
|
||||
{
|
||||
if (!IsSceneSelected())
|
||||
return;
|
||||
|
||||
SensorRepeat sr = AsyncCommandManager.GetSensorRepeatPlugin(m_engine);
|
||||
|
||||
if (sr == null)
|
||||
{
|
||||
MainConsole.Instance.Output("Plugin not yet initialized");
|
||||
return;
|
||||
}
|
||||
|
||||
List<SensorRepeat.SensorInfo> sensorInfo = sr.GetSensorInfo();
|
||||
|
||||
ConsoleDisplayTable cdt = new ConsoleDisplayTable();
|
||||
cdt.AddColumn("Part name", 40);
|
||||
cdt.AddColumn("Script item ID", 36);
|
||||
cdt.AddColumn("Type", 4);
|
||||
cdt.AddColumn("Interval", 8);
|
||||
cdt.AddColumn("Range", 8);
|
||||
cdt.AddColumn("Arc", 8);
|
||||
|
||||
foreach (SensorRepeat.SensorInfo s in sensorInfo)
|
||||
{
|
||||
cdt.AddRow(s.host.Name, s.itemID, s.type, s.interval, s.range, s.arc);
|
||||
}
|
||||
|
||||
MainConsole.Instance.Output(cdt.ToString());
|
||||
MainConsole.Instance.OutputFormat("Total: {0}", sensorInfo.Count);
|
||||
}
|
||||
|
||||
private void HandleShowTimers(string module, string[] cmdparams)
|
||||
{
|
||||
if (!IsSceneSelected())
|
||||
return;
|
||||
|
||||
Timer timerPlugin = AsyncCommandManager.GetTimerPlugin(m_engine);
|
||||
|
||||
if (timerPlugin == null)
|
||||
{
|
||||
MainConsole.Instance.Output("Plugin not yet initialized");
|
||||
return;
|
||||
}
|
||||
|
||||
List<Timer.TimerInfo> timersInfo = timerPlugin.GetTimersInfo();
|
||||
|
||||
ConsoleDisplayTable cdt = new ConsoleDisplayTable();
|
||||
cdt.AddColumn("Part local ID", 13);
|
||||
cdt.AddColumn("Script item ID", 36);
|
||||
cdt.AddColumn("Interval", 10);
|
||||
cdt.AddColumn("Next", 8);
|
||||
|
||||
foreach (Timer.TimerInfo t in timersInfo)
|
||||
{
|
||||
// Convert from 100 ns ticks back to seconds
|
||||
cdt.AddRow(t.localID, t.itemID, (double)t.interval / 10000000, t.next);
|
||||
}
|
||||
|
||||
MainConsole.Instance.Output(cdt.ToString());
|
||||
MainConsole.Instance.OutputFormat("Total: {0}", timersInfo.Count);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -169,6 +169,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||
IWorkItemResult m_CurrentCompile = null;
|
||||
private Dictionary<UUID, int> m_CompileDict = new Dictionary<UUID, int>();
|
||||
|
||||
private ScriptEngineConsoleCommands m_consoleCommands;
|
||||
|
||||
public string ScriptEngineName
|
||||
{
|
||||
get { return "XEngine"; }
|
||||
@@ -318,50 +320,53 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||
OnObjectRemoved += m_XmlRpcRouter.ObjectRemoved;
|
||||
}
|
||||
|
||||
m_consoleCommands = new ScriptEngineConsoleCommands(this);
|
||||
m_consoleCommands.RegisterCommands();
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Scripts", false, "xengine status", "xengine status", "Show status information",
|
||||
"Show status information on the script engine.",
|
||||
HandleShowStatus);
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Scripts", false, "scripts show", "scripts show [<script-item-uuid>]", "Show script information",
|
||||
"Scripts", false, "scripts show", "scripts show [<script-item-uuid>+]", "Show script information",
|
||||
"Show information on all scripts known to the script engine.\n"
|
||||
+ "If a <script-item-uuid> is given then only information on that script will be shown.",
|
||||
+ "If one or more <script-item-uuid>s are given then only information on that script will be shown.",
|
||||
HandleShowScripts);
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Scripts", false, "show scripts", "show scripts [<script-item-uuid>]", "Show script information",
|
||||
"Scripts", false, "show scripts", "show scripts [<script-item-uuid>+]", "Show script information",
|
||||
"Synonym for scripts show command", HandleShowScripts);
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Scripts", false, "scripts suspend", "scripts suspend [<script-item-uuid>]", "Suspends all running scripts",
|
||||
"Scripts", false, "scripts suspend", "scripts suspend [<script-item-uuid>+]", "Suspends all running scripts",
|
||||
"Suspends all currently running scripts. This only suspends event delivery, it will not suspend a"
|
||||
+ " script that is currently processing an event.\n"
|
||||
+ "Suspended scripts will continue to accumulate events but won't process them.\n"
|
||||
+ "If a <script-item-uuid> is given then only that script will be suspended. Otherwise, all suitable scripts are suspended.",
|
||||
+ "If one or more <script-item-uuid>s are given then only that script will be suspended. Otherwise, all suitable scripts are suspended.",
|
||||
(module, cmdparams) => HandleScriptsAction(cmdparams, HandleSuspendScript));
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Scripts", false, "scripts resume", "scripts resume [<script-item-uuid>]", "Resumes all suspended scripts",
|
||||
"Scripts", false, "scripts resume", "scripts resume [<script-item-uuid>+]", "Resumes all suspended scripts",
|
||||
"Resumes all currently suspended scripts.\n"
|
||||
+ "Resumed scripts will process all events accumulated whilst suspended.\n"
|
||||
+ "If a <script-item-uuid> is given then only that script will be resumed. Otherwise, all suitable scripts are resumed.",
|
||||
+ "If one or more <script-item-uuid>s are given then only that script will be resumed. Otherwise, all suitable scripts are resumed.",
|
||||
(module, cmdparams) => HandleScriptsAction(cmdparams, HandleResumeScript));
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Scripts", false, "scripts stop", "scripts stop [<script-item-uuid>]", "Stops all running scripts",
|
||||
"Scripts", false, "scripts stop", "scripts stop [<script-item-uuid>+]", "Stops all running scripts",
|
||||
"Stops all running scripts.\n"
|
||||
+ "If a <script-item-uuid> is given then only that script will be stopped. Otherwise, all suitable scripts are stopped.",
|
||||
+ "If one or more <script-item-uuid>s are given then only that script will be stopped. Otherwise, all suitable scripts are stopped.",
|
||||
(module, cmdparams) => HandleScriptsAction(cmdparams, HandleStopScript));
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Scripts", false, "scripts start", "scripts start [<script-item-uuid>]", "Starts all stopped scripts",
|
||||
"Scripts", false, "scripts start", "scripts start [<script-item-uuid>+]", "Starts all stopped scripts",
|
||||
"Starts all stopped scripts.\n"
|
||||
+ "If a <script-item-uuid> is given then only that script will be started. Otherwise, all suitable scripts are started.",
|
||||
+ "If one or more <script-item-uuid>s are given then only that script will be started. Otherwise, all suitable scripts are started.",
|
||||
(module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript));
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand(
|
||||
"Scripts", false, "debug script log", "debug scripts log <item-id> <log-level>", "Extra debug logging for a script",
|
||||
"Scripts", false, "debug scripts log", "debug scripts log <item-id> <log-level>", "Extra debug logging for a script",
|
||||
"Activates or deactivates extra debug logging for the given script.\n"
|
||||
+ "Level == 0, deactivate extra debug logging.\n"
|
||||
+ "Level >= 1, log state changes.\n"
|
||||
@@ -478,29 +483,31 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||
return;
|
||||
}
|
||||
|
||||
rawItemId = cmdparams[2];
|
||||
|
||||
if (!UUID.TryParse(rawItemId, out itemId))
|
||||
for (int i = 2; i < cmdparams.Length; i++)
|
||||
{
|
||||
MainConsole.Instance.OutputFormat("ERROR: {0} is not a valid UUID", rawItemId);
|
||||
return;
|
||||
}
|
||||
|
||||
if (itemId != UUID.Zero)
|
||||
{
|
||||
IScriptInstance instance = GetInstance(itemId);
|
||||
if (instance == null)
|
||||
rawItemId = cmdparams[i];
|
||||
|
||||
if (!UUID.TryParse(rawItemId, out itemId))
|
||||
{
|
||||
// Commented out for now since this will cause false reports on simulators with more than
|
||||
// one scene where the current command line set region is 'root' (which causes commands to
|
||||
// go to both regions... (sigh)
|
||||
// MainConsole.Instance.OutputFormat("Error - No item found with id {0}", itemId);
|
||||
return;
|
||||
MainConsole.Instance.OutputFormat("ERROR: {0} is not a valid UUID", rawItemId);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
|
||||
if (itemId != UUID.Zero)
|
||||
{
|
||||
action(instance);
|
||||
return;
|
||||
IScriptInstance instance = GetInstance(itemId);
|
||||
if (instance == null)
|
||||
{
|
||||
// Commented out for now since this will cause false reports on simulators with more than
|
||||
// one scene where the current command line set region is 'root' (which causes commands to
|
||||
// go to both regions... (sigh)
|
||||
// MainConsole.Instance.OutputFormat("Error - No item found with id {0}", itemId);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
action(instance);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,8 +280,11 @@ namespace OpenSim.Server.Base
|
||||
{
|
||||
if (!(e is System.MissingMethodException))
|
||||
{
|
||||
m_log.ErrorFormat("Error loading plugin {0} from {1}. Exception: {2}",
|
||||
interfaceName, dllName, e.InnerException == null ? e.Message : e.InnerException.Message);
|
||||
m_log.ErrorFormat("Error loading plugin {0} from {1}. Exception: {2}, {3}",
|
||||
interfaceName,
|
||||
dllName,
|
||||
e.InnerException == null ? e.Message : e.InnerException.Message,
|
||||
e.StackTrace);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user