mirror of
https://github.com/opensim/opensim.git
synced 2026-08-07 17:55:48 +08:00
Merge branch 'master' into careminster
Conflicts: OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
This commit is contained in:
@@ -197,6 +197,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
|
||||
string fromName = c.From;
|
||||
string fromNamePrefix = "";
|
||||
UUID fromID = UUID.Zero;
|
||||
UUID ownerID = UUID.Zero;
|
||||
string message = c.Message;
|
||||
IScene scene = c.Scene;
|
||||
UUID destination = c.Destination;
|
||||
@@ -224,11 +225,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
|
||||
fromNamePrefix = m_adminPrefix;
|
||||
}
|
||||
destination = UUID.Zero; // Avatars cant "SayTo"
|
||||
ownerID = c.Sender.AgentId;
|
||||
|
||||
break;
|
||||
|
||||
case ChatSourceType.Object:
|
||||
fromID = c.SenderUUID;
|
||||
|
||||
if (c.SenderObject != null && c.SenderObject is SceneObjectPart)
|
||||
ownerID = ((SceneObjectPart)c.SenderObject).OwnerID;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -262,8 +268,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
|
||||
// objects on a parcel with access restrictions
|
||||
if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true)
|
||||
{
|
||||
if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix + fromName, c.Type, message, sourceType))
|
||||
receiverIDs.Add(presence.UUID);
|
||||
if (destination != UUID.Zero)
|
||||
{
|
||||
if (TrySendChatMessage(presence, fromPos, regionPos, fromID, ownerID, fromNamePrefix + fromName, c.Type, message, sourceType, true))
|
||||
receiverIDs.Add(presence.UUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (TrySendChatMessage(presence, fromPos, regionPos, fromID, ownerID, fromNamePrefix + fromName, c.Type, message, sourceType, false))
|
||||
receiverIDs.Add(presence.UUID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -324,7 +338,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
|
||||
(((SceneObjectPart)c.SenderObject).OwnerID != client.AgentId))
|
||||
return;
|
||||
|
||||
client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID,
|
||||
client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID, fromID,
|
||||
(byte)sourceType, (byte)ChatAudibleLevel.Fully);
|
||||
receiverIDs.Add(client.AgentId);
|
||||
}
|
||||
@@ -341,15 +355,20 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
|
||||
/// <param name="fromPos"></param>
|
||||
/// <param name="regionPos">/param>
|
||||
/// <param name="fromAgentID"></param>
|
||||
/// <param name='ownerID'>
|
||||
/// Owner of the message. For at least some messages from objects, this has to be correctly filled with the owner's UUID.
|
||||
/// This is the case for script error messages in viewer 3 since LLViewer change EXT-7762
|
||||
/// </param>
|
||||
/// <param name="fromName"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="message"></param>
|
||||
/// <param name="src"></param>
|
||||
/// <returns>true if the message was sent to the receiver, false if it was not sent due to failing a
|
||||
/// precondition</returns>
|
||||
protected virtual bool TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos,
|
||||
UUID fromAgentID, string fromName, ChatTypeEnum type,
|
||||
string message, ChatSourceType src)
|
||||
protected virtual bool TrySendChatMessage(
|
||||
ScenePresence presence, Vector3 fromPos, Vector3 regionPos,
|
||||
UUID fromAgentID, UUID ownerID, string fromName, ChatTypeEnum type,
|
||||
string message, ChatSourceType src, bool ignoreDistance)
|
||||
{
|
||||
// don't send chat to child agents
|
||||
if (presence.IsChildAgent) return false;
|
||||
@@ -369,8 +388,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
|
||||
}
|
||||
|
||||
// TODO: should change so the message is sent through the avatar rather than direct to the ClientView
|
||||
presence.ControllingClient.SendChatMessage(message, (byte) type, fromPos, fromName,
|
||||
fromAgentID, (byte)src, (byte)ChatAudibleLevel.Fully);
|
||||
presence.ControllingClient.SendChatMessage(
|
||||
message, (byte) type, fromPos, fromName,
|
||||
fromAgentID, ownerID, (byte)src, (byte)ChatAudibleLevel.Fully);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Communications;
|
||||
using OpenSim.Framework.Console;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
@@ -209,6 +210,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||
Guid id, string firstName, string lastName, string invPath, string pass, string savePath,
|
||||
Dictionary<string, object> options)
|
||||
{
|
||||
if (!ConsoleUtil.CheckFileDoesNotExist(MainConsole.Instance, savePath))
|
||||
return false;
|
||||
|
||||
if (m_scenes.Count > 0)
|
||||
{
|
||||
UserAccount userInfo = GetUserInfo(firstName, lastName, pass);
|
||||
|
||||
@@ -38,15 +38,15 @@ using OpenSim.Services.Interfaces;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||
{
|
||||
public class InventoryTransferModule : IInventoryTransferModule, ISharedRegionModule
|
||||
public class InventoryTransferModule : ISharedRegionModule
|
||||
{
|
||||
private static readonly ILog m_log
|
||||
= LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/// <summary>
|
||||
private List<Scene> m_Scenelist = new List<Scene>();
|
||||
private Dictionary<UUID, Scene> m_AgentRegions =
|
||||
new Dictionary<UUID, Scene>();
|
||||
// private Dictionary<UUID, Scene> m_AgentRegions =
|
||||
// new Dictionary<UUID, Scene>();
|
||||
|
||||
private IMessageTransferModule m_TransferModule = null;
|
||||
private bool m_Enabled = true;
|
||||
@@ -76,12 +76,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||
|
||||
m_Scenelist.Add(scene);
|
||||
|
||||
scene.RegisterModuleInterface<IInventoryTransferModule>(this);
|
||||
// scene.RegisterModuleInterface<IInventoryTransferModule>(this);
|
||||
|
||||
scene.EventManager.OnNewClient += OnNewClient;
|
||||
scene.EventManager.OnClientClosed += ClientLoggedOut;
|
||||
// scene.EventManager.OnClientClosed += ClientLoggedOut;
|
||||
scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage;
|
||||
scene.EventManager.OnSetRootAgentScene += OnSetRootAgentScene;
|
||||
// scene.EventManager.OnSetRootAgentScene += OnSetRootAgentScene;
|
||||
}
|
||||
|
||||
public void RegionLoaded(Scene scene)
|
||||
@@ -96,9 +96,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||
|
||||
m_Scenelist.Clear();
|
||||
scene.EventManager.OnNewClient -= OnNewClient;
|
||||
scene.EventManager.OnClientClosed -= ClientLoggedOut;
|
||||
// scene.EventManager.OnClientClosed -= ClientLoggedOut;
|
||||
scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage;
|
||||
scene.EventManager.OnSetRootAgentScene -= OnSetRootAgentScene;
|
||||
// scene.EventManager.OnSetRootAgentScene -= OnSetRootAgentScene;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -106,9 +106,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||
public void RemoveRegion(Scene scene)
|
||||
{
|
||||
scene.EventManager.OnNewClient -= OnNewClient;
|
||||
scene.EventManager.OnClientClosed -= ClientLoggedOut;
|
||||
// scene.EventManager.OnClientClosed -= ClientLoggedOut;
|
||||
scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage;
|
||||
scene.EventManager.OnSetRootAgentScene -= OnSetRootAgentScene;
|
||||
// scene.EventManager.OnSetRootAgentScene -= OnSetRootAgentScene;
|
||||
m_Scenelist.Remove(scene);
|
||||
}
|
||||
|
||||
@@ -138,10 +138,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||
client.OnInstantMessage += OnInstantMessage;
|
||||
}
|
||||
|
||||
protected void OnSetRootAgentScene(UUID id, Scene scene)
|
||||
{
|
||||
m_AgentRegions[id] = scene;
|
||||
}
|
||||
// protected void OnSetRootAgentScene(UUID id, Scene scene)
|
||||
// {
|
||||
// m_AgentRegions[id] = scene;
|
||||
// }
|
||||
|
||||
private Scene FindClientScene(UUID agentId)
|
||||
{
|
||||
@@ -465,69 +465,69 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||
}
|
||||
}
|
||||
|
||||
public bool NeedSceneCacheClear(UUID agentID, Scene scene)
|
||||
{
|
||||
if (!m_AgentRegions.ContainsKey(agentID))
|
||||
{
|
||||
// Since we can get here two ways, we need to scan
|
||||
// the scenes here. This is somewhat more expensive
|
||||
// but helps avoid a nasty bug
|
||||
//
|
||||
|
||||
foreach (Scene s in m_Scenelist)
|
||||
{
|
||||
ScenePresence presence;
|
||||
|
||||
if (s.TryGetScenePresence(agentID, out presence))
|
||||
{
|
||||
// If the agent is in this scene, then we
|
||||
// are being called twice in a single
|
||||
// teleport. This is wasteful of cycles
|
||||
// but harmless due to this 2nd level check
|
||||
//
|
||||
// If the agent is found in another scene
|
||||
// then the list wasn't current
|
||||
//
|
||||
// If the agent is totally unknown, then what
|
||||
// are we even doing here??
|
||||
//
|
||||
if (s == scene)
|
||||
{
|
||||
//m_log.Debug("[INVTRANSFERMOD]: s == scene. Returning true in " + scene.RegionInfo.RegionName);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
//m_log.Debug("[INVTRANSFERMOD]: s != scene. Returning false in " + scene.RegionInfo.RegionName);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
//m_log.Debug("[INVTRANSFERMOD]: agent not in scene. Returning true in " + scene.RegionInfo.RegionName);
|
||||
return true;
|
||||
}
|
||||
|
||||
// The agent is left in current Scene, so we must be
|
||||
// going to another instance
|
||||
//
|
||||
if (m_AgentRegions[agentID] == scene)
|
||||
{
|
||||
//m_log.Debug("[INVTRANSFERMOD]: m_AgentRegions[agentID] == scene. Returning true in " + scene.RegionInfo.RegionName);
|
||||
m_AgentRegions.Remove(agentID);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Another region has claimed the agent
|
||||
//
|
||||
//m_log.Debug("[INVTRANSFERMOD]: last resort. Returning false in " + scene.RegionInfo.RegionName);
|
||||
return false;
|
||||
}
|
||||
|
||||
public void ClientLoggedOut(UUID agentID, Scene scene)
|
||||
{
|
||||
if (m_AgentRegions.ContainsKey(agentID))
|
||||
m_AgentRegions.Remove(agentID);
|
||||
}
|
||||
// public bool NeedSceneCacheClear(UUID agentID, Scene scene)
|
||||
// {
|
||||
// if (!m_AgentRegions.ContainsKey(agentID))
|
||||
// {
|
||||
// // Since we can get here two ways, we need to scan
|
||||
// // the scenes here. This is somewhat more expensive
|
||||
// // but helps avoid a nasty bug
|
||||
// //
|
||||
//
|
||||
// foreach (Scene s in m_Scenelist)
|
||||
// {
|
||||
// ScenePresence presence;
|
||||
//
|
||||
// if (s.TryGetScenePresence(agentID, out presence))
|
||||
// {
|
||||
// // If the agent is in this scene, then we
|
||||
// // are being called twice in a single
|
||||
// // teleport. This is wasteful of cycles
|
||||
// // but harmless due to this 2nd level check
|
||||
// //
|
||||
// // If the agent is found in another scene
|
||||
// // then the list wasn't current
|
||||
// //
|
||||
// // If the agent is totally unknown, then what
|
||||
// // are we even doing here??
|
||||
// //
|
||||
// if (s == scene)
|
||||
// {
|
||||
// //m_log.Debug("[INVTRANSFERMOD]: s == scene. Returning true in " + scene.RegionInfo.RegionName);
|
||||
// return true;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// //m_log.Debug("[INVTRANSFERMOD]: s != scene. Returning false in " + scene.RegionInfo.RegionName);
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// //m_log.Debug("[INVTRANSFERMOD]: agent not in scene. Returning true in " + scene.RegionInfo.RegionName);
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// // The agent is left in current Scene, so we must be
|
||||
// // going to another instance
|
||||
// //
|
||||
// if (m_AgentRegions[agentID] == scene)
|
||||
// {
|
||||
// //m_log.Debug("[INVTRANSFERMOD]: m_AgentRegions[agentID] == scene. Returning true in " + scene.RegionInfo.RegionName);
|
||||
// m_AgentRegions.Remove(agentID);
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// // Another region has claimed the agent
|
||||
// //
|
||||
// //m_log.Debug("[INVTRANSFERMOD]: last resort. Returning false in " + scene.RegionInfo.RegionName);
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// public void ClientLoggedOut(UUID agentID, Scene scene)
|
||||
// {
|
||||
// if (m_AgentRegions.ContainsKey(agentID))
|
||||
// m_AgentRegions.Remove(agentID);
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
|
||||
@@ -677,13 +677,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
sp.Reset();
|
||||
}
|
||||
|
||||
// REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE!
|
||||
if (sp.Scene.NeedSceneCacheClear(sp.UUID))
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"[ENTITY TRANSFER MODULE]: User {0} is going to another region, profile cache removed",
|
||||
sp.UUID);
|
||||
}
|
||||
// Commented pending deletion since this method no longer appears to do anything at all
|
||||
// // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE!
|
||||
// if (sp.Scene.NeedSceneCacheClear(sp.UUID))
|
||||
// {
|
||||
// m_log.DebugFormat(
|
||||
// "[ENTITY TRANSFER MODULE]: User {0} is going to another region, profile cache removed",
|
||||
// sp.UUID);
|
||||
// }
|
||||
|
||||
m_entityTransferStateMachine.ResetFromTransit(sp.UUID);
|
||||
}
|
||||
@@ -1222,11 +1223,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||
// the user may change their profile information in other region,
|
||||
// so the userinfo in UserProfileCache is not reliable any more, delete it
|
||||
// REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE!
|
||||
if (agent.Scene.NeedSceneCacheClear(agent.UUID))
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID);
|
||||
}
|
||||
// if (agent.Scene.NeedSceneCacheClear(agent.UUID))
|
||||
// {
|
||||
// m_log.DebugFormat(
|
||||
// "[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID);
|
||||
// }
|
||||
|
||||
//m_log.Debug("AFTER CROSS");
|
||||
//Scene.DumpChildrenSeeds(UUID);
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
@@ -172,12 +173,42 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
/// <param name="hostID">UUID of the SceneObjectPart</param>
|
||||
/// <param name="channel">channel to listen on</param>
|
||||
/// <param name="name">name to filter on</param>
|
||||
/// <param name="id">key to filter on (user given, could be totally faked)</param>
|
||||
/// <param name="id">
|
||||
/// key to filter on (user given, could be totally faked)
|
||||
/// </param>
|
||||
/// <param name="msg">msg to filter on</param>
|
||||
/// <returns>number of the scripts handle</returns>
|
||||
public int Listen(uint localID, UUID itemID, UUID hostID, int channel, string name, UUID id, string msg)
|
||||
public int Listen(uint localID, UUID itemID, UUID hostID, int channel,
|
||||
string name, UUID id, string msg)
|
||||
{
|
||||
return m_listenerManager.AddListener(localID, itemID, hostID, channel, name, id, msg);
|
||||
return m_listenerManager.AddListener(localID, itemID, hostID,
|
||||
channel, name, id, msg);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a listen event callback with the specified filters.
|
||||
/// The parameters localID,itemID are needed to uniquely identify
|
||||
/// the script during 'peek' time. Parameter hostID is needed to
|
||||
/// determine the position of the script.
|
||||
/// </summary>
|
||||
/// <param name="localID">localID of the script engine</param>
|
||||
/// <param name="itemID">UUID of the script engine</param>
|
||||
/// <param name="hostID">UUID of the SceneObjectPart</param>
|
||||
/// <param name="channel">channel to listen on</param>
|
||||
/// <param name="name">name to filter on</param>
|
||||
/// <param name="id">
|
||||
/// key to filter on (user given, could be totally faked)
|
||||
/// </param>
|
||||
/// <param name="msg">msg to filter on</param>
|
||||
/// <param name="regexBitfield">
|
||||
/// Bitfield indicating which strings should be processed as regex.
|
||||
/// </param>
|
||||
/// <returns>number of the scripts handle</returns>
|
||||
public int Listen(uint localID, UUID itemID, UUID hostID, int channel,
|
||||
string name, UUID id, string msg, int regexBitfield)
|
||||
{
|
||||
return m_listenerManager.AddListener(localID, itemID, hostID,
|
||||
channel, name, id, msg, regexBitfield);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -326,7 +357,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
if (channel == 0)
|
||||
{
|
||||
// Channel 0 goes to viewer ONLY
|
||||
m_scene.SimChat(Utils.StringToBytes(msg), ChatTypeEnum.Broadcast, 0, pos, name, id, false, false, target);
|
||||
m_scene.SimChat(Utils.StringToBytes(msg), ChatTypeEnum.Broadcast, 0, pos, name, id, target, false, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -470,15 +501,25 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
m_curlisteners = 0;
|
||||
}
|
||||
|
||||
public int AddListener(uint localID, UUID itemID, UUID hostID, int channel, string name, UUID id, string msg)
|
||||
public int AddListener(uint localID, UUID itemID, UUID hostID,
|
||||
int channel, string name, UUID id, string msg)
|
||||
{
|
||||
return AddListener(localID, itemID, hostID, channel, name, id,
|
||||
msg, 0);
|
||||
}
|
||||
|
||||
public int AddListener(uint localID, UUID itemID, UUID hostID,
|
||||
int channel, string name, UUID id, string msg,
|
||||
int regexBitfield)
|
||||
{
|
||||
// do we already have a match on this particular filter event?
|
||||
List<ListenerInfo> coll = GetListeners(itemID, channel, name, id, msg);
|
||||
List<ListenerInfo> coll = GetListeners(itemID, channel, name, id,
|
||||
msg);
|
||||
|
||||
if (coll.Count > 0)
|
||||
{
|
||||
// special case, called with same filter settings, return same handle
|
||||
// (2008-05-02, tested on 1.21.1 server, still holds)
|
||||
// special case, called with same filter settings, return same
|
||||
// handle (2008-05-02, tested on 1.21.1 server, still holds)
|
||||
return coll[0].GetHandle();
|
||||
}
|
||||
|
||||
@@ -490,7 +531,9 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
|
||||
if (newHandle > 0)
|
||||
{
|
||||
ListenerInfo li = new ListenerInfo(newHandle, localID, itemID, hostID, channel, name, id, msg);
|
||||
ListenerInfo li = new ListenerInfo(newHandle, localID,
|
||||
itemID, hostID, channel, name, id, msg,
|
||||
regexBitfield);
|
||||
|
||||
List<ListenerInfo> listeners;
|
||||
if (!m_listeners.TryGetValue(channel,out listeners))
|
||||
@@ -631,6 +674,22 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
return -1;
|
||||
}
|
||||
|
||||
/// These are duplicated from ScriptBaseClass
|
||||
/// http://opensimulator.org/mantis/view.php?id=6106#c21945
|
||||
#region Constants for the bitfield parameter of osListenRegex
|
||||
|
||||
/// <summary>
|
||||
/// process name parameter as regex
|
||||
/// </summary>
|
||||
public const int OS_LISTEN_REGEX_NAME = 0x1;
|
||||
|
||||
/// <summary>
|
||||
/// process message parameter as regex
|
||||
/// </summary>
|
||||
public const int OS_LISTEN_REGEX_MESSAGE = 0x2;
|
||||
|
||||
#endregion
|
||||
|
||||
// Theres probably a more clever and efficient way to
|
||||
// do this, maybe with regex.
|
||||
// PM2008: Ha, one could even be smart and define a specialized Enumerator.
|
||||
@@ -656,7 +715,10 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (li.GetName().Length > 0 && !li.GetName().Equals(name))
|
||||
if (li.GetName().Length > 0 && (
|
||||
((li.RegexBitfield & OS_LISTEN_REGEX_NAME) != OS_LISTEN_REGEX_NAME && !li.GetName().Equals(name)) ||
|
||||
((li.RegexBitfield & OS_LISTEN_REGEX_NAME) == OS_LISTEN_REGEX_NAME && !Regex.IsMatch(name, li.GetName()))
|
||||
))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -664,7 +726,10 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (li.GetMessage().Length > 0 && !li.GetMessage().Equals(msg))
|
||||
if (li.GetMessage().Length > 0 && (
|
||||
((li.RegexBitfield & OS_LISTEN_REGEX_MESSAGE) != OS_LISTEN_REGEX_MESSAGE && !li.GetMessage().Equals(msg)) ||
|
||||
((li.RegexBitfield & OS_LISTEN_REGEX_MESSAGE) == OS_LISTEN_REGEX_MESSAGE && !Regex.IsMatch(msg, li.GetMessage()))
|
||||
))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -697,10 +762,13 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
{
|
||||
int idx = 0;
|
||||
Object[] item = new Object[6];
|
||||
int dataItemLength = 6;
|
||||
|
||||
while (idx < data.Length)
|
||||
{
|
||||
Array.Copy(data, idx, item, 0, 6);
|
||||
dataItemLength = (idx + 7 == data.Length || (idx + 7 < data.Length && data[idx + 7] is bool)) ? 7 : 6;
|
||||
item = new Object[dataItemLength];
|
||||
Array.Copy(data, idx, item, 0, dataItemLength);
|
||||
|
||||
ListenerInfo info =
|
||||
ListenerInfo.FromData(localID, itemID, hostID, item);
|
||||
@@ -712,12 +780,12 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
m_listeners[(int)item[2]].Add(info);
|
||||
}
|
||||
|
||||
idx+=6;
|
||||
idx+=dataItemLength;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class ListenerInfo: IWorldCommListenerInfo
|
||||
public class ListenerInfo : IWorldCommListenerInfo
|
||||
{
|
||||
private bool m_active; // Listener is active or not
|
||||
private int m_handle; // Assigned handle of this listener
|
||||
@@ -731,16 +799,29 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
|
||||
public ListenerInfo(int handle, uint localID, UUID ItemID, UUID hostID, int channel, string name, UUID id, string message)
|
||||
{
|
||||
Initialise(handle, localID, ItemID, hostID, channel, name, id, message);
|
||||
Initialise(handle, localID, ItemID, hostID, channel, name, id,
|
||||
message, 0);
|
||||
}
|
||||
|
||||
public ListenerInfo(int handle, uint localID, UUID ItemID,
|
||||
UUID hostID, int channel, string name, UUID id,
|
||||
string message, int regexBitfield)
|
||||
{
|
||||
Initialise(handle, localID, ItemID, hostID, channel, name, id,
|
||||
message, regexBitfield);
|
||||
}
|
||||
|
||||
public ListenerInfo(ListenerInfo li, string name, UUID id, string message)
|
||||
{
|
||||
Initialise(li.m_handle, li.m_localID, li.m_itemID, li.m_hostID, li.m_channel, name, id, message);
|
||||
Initialise(li.m_handle, li.m_localID, li.m_itemID, li.m_hostID, li.m_channel, name, id, message, 0);
|
||||
}
|
||||
|
||||
private void Initialise(int handle, uint localID, UUID ItemID, UUID hostID, int channel, string name,
|
||||
UUID id, string message)
|
||||
public ListenerInfo(ListenerInfo li, string name, UUID id, string message, int regexBitfield)
|
||||
{
|
||||
Initialise(li.m_handle, li.m_localID, li.m_itemID, li.m_hostID, li.m_channel, name, id, message, regexBitfield);
|
||||
}
|
||||
|
||||
private void Initialise(int handle, uint localID, UUID ItemID, UUID hostID, int channel, string name, UUID id, string message, int regexBitfield)
|
||||
{
|
||||
m_active = true;
|
||||
m_handle = handle;
|
||||
@@ -751,11 +832,12 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
m_name = name;
|
||||
m_id = id;
|
||||
m_message = message;
|
||||
RegexBitfield = regexBitfield;
|
||||
}
|
||||
|
||||
public Object[] GetSerializationData()
|
||||
{
|
||||
Object[] data = new Object[6];
|
||||
Object[] data = new Object[7];
|
||||
|
||||
data[0] = m_active;
|
||||
data[1] = m_handle;
|
||||
@@ -763,16 +845,19 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
data[3] = m_name;
|
||||
data[4] = m_id;
|
||||
data[5] = m_message;
|
||||
data[6] = RegexBitfield;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
public static ListenerInfo FromData(uint localID, UUID ItemID, UUID hostID, Object[] data)
|
||||
{
|
||||
ListenerInfo linfo = new ListenerInfo((int)data[1], localID,
|
||||
ItemID, hostID, (int)data[2], (string)data[3],
|
||||
(UUID)data[4], (string)data[5]);
|
||||
linfo.m_active=(bool)data[0];
|
||||
ListenerInfo linfo = new ListenerInfo((int)data[1], localID, ItemID, hostID, (int)data[2], (string)data[3], (UUID)data[4], (string)data[5]);
|
||||
linfo.m_active = (bool)data[0];
|
||||
if (data.Length >= 7)
|
||||
{
|
||||
linfo.RegexBitfield = (int)data[6];
|
||||
}
|
||||
|
||||
return linfo;
|
||||
}
|
||||
@@ -831,5 +916,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
{
|
||||
return m_id;
|
||||
}
|
||||
|
||||
public int RegexBitfield { get; private set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||
lastX = (lastX == null) ? curLastX : (lastX > curLastX) ? lastX : curLastX;
|
||||
}
|
||||
|
||||
Rect = new Rectangle((int)firstX, (int)firstY, (int)(lastY - firstY + 1), (int)(lastX - firstX + 1));
|
||||
Rect = new Rectangle((int)firstX, (int)firstY, (int)(lastX - firstX + 1), (int)(lastY - firstY + 1));
|
||||
|
||||
|
||||
// Calculate the subdirectory in which each region will be stored in the archive
|
||||
|
||||
@@ -32,6 +32,8 @@ using System.Reflection;
|
||||
using log4net;
|
||||
using NDesk.Options;
|
||||
using Nini.Config;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Console;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
@@ -117,7 +119,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||
//
|
||||
// foreach (string param in mainParams)
|
||||
// m_log.DebugFormat("GOT PARAM [{0}]", param);
|
||||
|
||||
|
||||
if (mainParams.Count > 2)
|
||||
{
|
||||
DearchiveRegion(mainParams[2], mergeOar, skipAssets, Guid.Empty);
|
||||
@@ -150,14 +152,16 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||
|
||||
List<string> mainParams = ops.Parse(cmdparams);
|
||||
|
||||
string path;
|
||||
if (mainParams.Count > 2)
|
||||
{
|
||||
ArchiveRegion(mainParams[2], options);
|
||||
}
|
||||
path = mainParams[2];
|
||||
else
|
||||
{
|
||||
ArchiveRegion(DEFAULT_OAR_BACKUP_FILENAME, options);
|
||||
}
|
||||
path = DEFAULT_OAR_BACKUP_FILENAME;
|
||||
|
||||
if (!ConsoleUtil.CheckFileDoesNotExist(MainConsole.Instance, path))
|
||||
return;
|
||||
|
||||
ArchiveRegion(path, options);
|
||||
}
|
||||
|
||||
public void ArchiveRegion(string savePath, Dictionary<string, object> options)
|
||||
|
||||
@@ -27,10 +27,12 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Xml;
|
||||
using log4net;
|
||||
using Mono.Addins;
|
||||
using NDesk.Options;
|
||||
@@ -41,6 +43,7 @@ using OpenSim.Framework.Console;
|
||||
using OpenSim.Framework.Monitoring;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||
{
|
||||
@@ -96,9 +99,9 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||
HandleDeleteObject);
|
||||
|
||||
m_console.Commands.AddCommand(
|
||||
"Objects", false, "delete object uuid",
|
||||
"delete object uuid <UUID>",
|
||||
"Delete a scene object by uuid",
|
||||
"Objects", false, "delete object id",
|
||||
"delete object id <UUID-or-localID>",
|
||||
"Delete a scene object by uuid or localID",
|
||||
HandleDeleteObject);
|
||||
|
||||
m_console.Commands.AddCommand(
|
||||
@@ -122,28 +125,18 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||
"delete object pos",
|
||||
"delete object pos <start-coord> to <end-coord>",
|
||||
"Delete scene objects within the given area.",
|
||||
"Each component of the coord is comma separated. There must be no spaces between the commas.\n"
|
||||
+ "If you don't care about the z component you can simply omit it.\n"
|
||||
+ "If you don't care about the x or y components then you can leave them blank (though a comma is still required)\n"
|
||||
+ "If you want to specify the maxmimum value of a component then you can use ~ instead of a number\n"
|
||||
+ "If you want to specify the minimum value of a component then you can use -~ instead of a number\n"
|
||||
+ "e.g.\n"
|
||||
+ "delete object pos 20,20,20 to 40,40,40\n"
|
||||
+ "delete object pos 20,20 to 40,40\n"
|
||||
+ "delete object pos ,20,20 to ,40,40\n"
|
||||
+ "delete object pos ,,30 to ,,~\n"
|
||||
+ "delete object pos ,,-~ to ,,30",
|
||||
ConsoleUtil.CoordHelp,
|
||||
HandleDeleteObject);
|
||||
|
||||
m_console.Commands.AddCommand(
|
||||
"Objects",
|
||||
false,
|
||||
"show object uuid",
|
||||
"show object uuid [--full] <UUID>",
|
||||
"Show details of a scene object with the given UUID",
|
||||
"show object id",
|
||||
"show object id [--full] <UUID-or-localID>",
|
||||
"Show details of a scene object with the given UUID or localID",
|
||||
"The --full option will print out information on all the parts of the object.\n"
|
||||
+ "For yet more detailed part information, use the \"show part\" commands.",
|
||||
HandleShowObjectByUuid);
|
||||
HandleShowObjectById);
|
||||
|
||||
m_console.Commands.AddCommand(
|
||||
"Objects",
|
||||
@@ -164,25 +157,15 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||
"Show details of scene objects within the given area.",
|
||||
"The --full option will print out information on all the parts of the object.\n"
|
||||
+ "For yet more detailed part information, use the \"show part\" commands.\n"
|
||||
+ "Each component of the coord is comma separated. There must be no spaces between the commas.\n"
|
||||
+ "If you don't care about the z component you can simply omit it.\n"
|
||||
+ "If you don't care about the x or y components then you can leave them blank (though a comma is still required)\n"
|
||||
+ "If you want to specify the maxmimum value of a component then you can use ~ instead of a number\n"
|
||||
+ "If you want to specify the minimum value of a component then you can use -~ instead of a number\n"
|
||||
+ "e.g.\n"
|
||||
+ "show object pos 20,20,20 to 40,40,40\n"
|
||||
+ "show object pos 20,20 to 40,40\n"
|
||||
+ "show object pos ,20,20 to ,40,40\n"
|
||||
+ "show object pos ,,30 to ,,~\n"
|
||||
+ "show object pos ,,-~ to ,,30",
|
||||
+ ConsoleUtil.CoordHelp,
|
||||
HandleShowObjectByPos);
|
||||
|
||||
m_console.Commands.AddCommand(
|
||||
"Objects",
|
||||
false,
|
||||
"show part uuid",
|
||||
"show part uuid <UUID>",
|
||||
"Show details of a scene object parts with the given UUID", HandleShowPartByUuid);
|
||||
"show part id",
|
||||
"show part id <UUID-or-localID>",
|
||||
"Show details of a scene object part with the given UUID or localID", HandleShowPartById);
|
||||
|
||||
m_console.Commands.AddCommand(
|
||||
"Objects",
|
||||
@@ -190,7 +173,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||
"show part name",
|
||||
"show part name [--regex] <name>",
|
||||
"Show details of scene object parts with the given name.",
|
||||
"If --regex is specified then the name is treatead as a regular expression",
|
||||
"If --regex is specified then the name is treated as a regular expression",
|
||||
HandleShowPartByName);
|
||||
|
||||
m_console.Commands.AddCommand(
|
||||
@@ -199,18 +182,19 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||
"show part pos",
|
||||
"show part pos <start-coord> to <end-coord>",
|
||||
"Show details of scene object parts within the given area.",
|
||||
"Each component of the coord is comma separated. There must be no spaces between the commas.\n"
|
||||
+ "If you don't care about the z component you can simply omit it.\n"
|
||||
+ "If you don't care about the x or y components then you can leave them blank (though a comma is still required)\n"
|
||||
+ "If you want to specify the maxmimum value of a component then you can use ~ instead of a number\n"
|
||||
+ "If you want to specify the minimum value of a component then you can use -~ instead of a number\n"
|
||||
+ "e.g.\n"
|
||||
+ "show object pos 20,20,20 to 40,40,40\n"
|
||||
+ "show object pos 20,20 to 40,40\n"
|
||||
+ "show object pos ,20,20 to ,40,40\n"
|
||||
+ "show object pos ,,30 to ,,~\n"
|
||||
+ "show object pos ,,-~ to ,,30",
|
||||
ConsoleUtil.CoordHelp,
|
||||
HandleShowPartByPos);
|
||||
|
||||
m_console.Commands.AddCommand(
|
||||
"Objects",
|
||||
false,
|
||||
"dump object id",
|
||||
"dump object id <UUID-or-localID>",
|
||||
"Dump the formatted serialization of the given object to the file <UUID>.xml",
|
||||
"e.g. dump object uuid c1ed6809-cc24-4061-a4c2-93082a2d1f1d will dump serialization to c1ed6809-cc24-4061-a4c2-93082a2d1f1d.xml\n"
|
||||
+ "To locate the UUID or localID in the first place, you need to use the other show object commands.\n"
|
||||
+ "If a local ID is given then the filename used is still that for the UUID",
|
||||
HandleDumpObjectById);
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene scene)
|
||||
@@ -265,7 +249,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||
m_console.OutputFormat(sb.ToString());
|
||||
}
|
||||
|
||||
private void HandleShowObjectByUuid(string module, string[] cmdparams)
|
||||
private void HandleShowObjectById(string module, string[] cmdparams)
|
||||
{
|
||||
if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
|
||||
return;
|
||||
@@ -281,14 +265,17 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||
return;
|
||||
}
|
||||
|
||||
UUID objectUuid;
|
||||
if (!UUID.TryParse(mainParams[3], out objectUuid))
|
||||
{
|
||||
m_console.OutputFormat("{0} is not a valid uuid", mainParams[3]);
|
||||
UUID uuid;
|
||||
uint localId;
|
||||
if (!ConsoleUtil.TryParseConsoleId(m_console, mainParams[3], out uuid, out localId))
|
||||
return;
|
||||
}
|
||||
|
||||
SceneObjectGroup so = m_scene.GetSceneObjectGroup(objectUuid);
|
||||
SceneObjectGroup so;
|
||||
|
||||
if (localId != ConsoleUtil.LocalIdNotFound)
|
||||
so = m_scene.GetSceneObjectGroup(localId);
|
||||
else
|
||||
so = m_scene.GetSceneObjectGroup(uuid);
|
||||
|
||||
if (so == null)
|
||||
{
|
||||
@@ -365,7 +352,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||
OutputSogsToConsole(searchPredicate, showFull);
|
||||
}
|
||||
|
||||
private void HandleShowPartByUuid(string module, string[] cmdparams)
|
||||
private void HandleShowPartById(string module, string[] cmdparams)
|
||||
{
|
||||
if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
|
||||
return;
|
||||
@@ -378,18 +365,20 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||
|
||||
if (mainParams.Count < 4)
|
||||
{
|
||||
m_console.OutputFormat("Usage: show part uuid [--full] <uuid>");
|
||||
m_console.OutputFormat("Usage: show part id [--full] <UUID-or-localID>");
|
||||
return;
|
||||
}
|
||||
|
||||
UUID objectUuid;
|
||||
if (!UUID.TryParse(mainParams[3], out objectUuid))
|
||||
{
|
||||
m_console.OutputFormat("{0} is not a valid uuid", mainParams[3]);
|
||||
uint localId;
|
||||
if (!ConsoleUtil.TryParseConsoleId(m_console, mainParams[3], out objectUuid, out localId))
|
||||
return;
|
||||
}
|
||||
|
||||
SceneObjectPart sop = m_scene.GetSceneObjectPart(objectUuid);
|
||||
SceneObjectPart sop;
|
||||
if (localId == ConsoleUtil.LocalIdNotFound)
|
||||
sop = m_scene.GetSceneObjectPart(objectUuid);
|
||||
else
|
||||
sop = m_scene.GetSceneObjectPart(localId);
|
||||
|
||||
if (sop == null)
|
||||
{
|
||||
@@ -477,6 +466,51 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||
OutputSopsToConsole(searchPredicate, true);
|
||||
}
|
||||
|
||||
private void HandleDumpObjectById(string module, string[] cmdparams)
|
||||
{
|
||||
if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
|
||||
return;
|
||||
|
||||
if (cmdparams.Length < 4)
|
||||
{
|
||||
m_console.OutputFormat("Usage: dump object id <UUID-or-localID>");
|
||||
return;
|
||||
}
|
||||
|
||||
UUID objectUuid;
|
||||
uint localId;
|
||||
if (!ConsoleUtil.TryParseConsoleId(m_console, cmdparams[3], out objectUuid, out localId))
|
||||
return;
|
||||
|
||||
SceneObjectGroup so;
|
||||
if (localId == ConsoleUtil.LocalIdNotFound)
|
||||
so = m_scene.GetSceneObjectGroup(objectUuid);
|
||||
else
|
||||
so = m_scene.GetSceneObjectGroup(localId);
|
||||
|
||||
if (so == null)
|
||||
{
|
||||
// m_console.OutputFormat("No part found with uuid {0}", objectUuid);
|
||||
return;
|
||||
}
|
||||
|
||||
// In case we found it via local ID.
|
||||
objectUuid = so.UUID;
|
||||
|
||||
string fileName = string.Format("{0}.xml", objectUuid);
|
||||
|
||||
if (!ConsoleUtil.CheckFileDoesNotExist(m_console, fileName))
|
||||
return;
|
||||
|
||||
using (XmlTextWriter xtw = new XmlTextWriter(fileName, Encoding.UTF8))
|
||||
{
|
||||
xtw.Formatting = Formatting.Indented;
|
||||
SceneObjectSerializer.ToOriginalXmlFormat(so, xtw, true);
|
||||
}
|
||||
|
||||
m_console.OutputFormat("Object dumped to file {0}", fileName);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Append a scene object report to an input StringBuilder
|
||||
/// </summary>
|
||||
@@ -641,19 +675,24 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||
|
||||
break;
|
||||
|
||||
case "uuid":
|
||||
if (!UUID.TryParse(o, out match))
|
||||
case "id":
|
||||
UUID uuid;
|
||||
uint localId;
|
||||
if (!ConsoleUtil.TryParseConsoleId(m_console, o, out uuid, out localId))
|
||||
return;
|
||||
|
||||
requireConfirmation = false;
|
||||
deletes = new List<SceneObjectGroup>();
|
||||
|
||||
m_scene.ForEachSOG(delegate (SceneObjectGroup g)
|
||||
{
|
||||
if (g.UUID == match && !g.IsAttachment)
|
||||
deletes.Add(g);
|
||||
});
|
||||
|
||||
|
||||
SceneObjectGroup so;
|
||||
if (localId == ConsoleUtil.LocalIdNotFound)
|
||||
so = m_scene.GetSceneObjectGroup(uuid);
|
||||
else
|
||||
so = m_scene.GetSceneObjectGroup(localId);
|
||||
|
||||
if (!so.IsAttachment)
|
||||
deletes.Add(so);
|
||||
|
||||
// if (deletes.Count == 0)
|
||||
// m_console.OutputFormat("No objects were found with uuid {0}", match);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user