From 76238715e3c8f4ba22cdd6dd09a282a0b52bad4d Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 4 Mar 2010 20:08:25 +0000
Subject: move linden notecard parsing from LSL_Api.cs to SLUtil so that region
modules can use it backport from master
---
OpenSim/Region/Framework/Scenes/EventManager.cs | 30 +++++++++++-----------
.../Framework/Scenes/SceneObjectPartInventory.cs | 1 -
2 files changed, 15 insertions(+), 16 deletions(-)
(limited to 'OpenSim/Region/Framework')
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 57e1c37..4365ece 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -107,21 +107,24 @@ namespace OpenSim.Region.Framework.Scenes
public event OnSetRootAgentSceneDelegate OnSetRootAgentScene;
///
- /// Called when an object is touched/grabbed.
+ /// Fired when an object is touched/grabbed.
///
/// The originalID is the local ID of the part that was actually touched. The localID itself is always that of
- /// the root part.
- public delegate void ObjectGrabDelegate(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs);
+ /// the root part.
public event ObjectGrabDelegate OnObjectGrab;
+ public delegate void ObjectGrabDelegate(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs);
public event ObjectGrabDelegate OnObjectGrabbing;
public event ObjectDeGrabDelegate OnObjectDeGrab;
public event ScriptResetDelegate OnScriptReset;
- public event OnPermissionErrorDelegate OnPermissionError;
+ public event OnPermissionErrorDelegate OnPermissionError;
- public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource);
+ ///
+ /// Fired when a new script is created.
+ ///
public event NewRezScript OnRezScript;
+ public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource);
public delegate void RemoveScript(uint localID, UUID itemID);
public event RemoveScript OnRemoveScript;
@@ -163,38 +166,35 @@ namespace OpenSim.Region.Framework.Scenes
public delegate void ClientClosed(UUID clientID, Scene scene);
- public event ClientClosed OnClientClosed;
-
- public delegate void ScriptChangedEvent(uint localID, uint change);
+ public event ClientClosed OnClientClosed;
+ ///
+ /// This is fired when a scene object property that a script might be interested in (such as color, scale or
+ /// inventory) changes. Only enough information is sent for the LSL changed event
+ /// (see http://lslwiki.net/lslwiki/wakka.php?wakka=changed)
+ ///
public event ScriptChangedEvent OnScriptChangedEvent;
+ public delegate void ScriptChangedEvent(uint localID, uint change);
public delegate void ScriptControlEvent(uint localID, UUID item, UUID avatarID, uint held, uint changed);
-
public event ScriptControlEvent OnScriptControlEvent;
public delegate void ScriptAtTargetEvent(uint localID, uint handle, Vector3 targetpos, Vector3 atpos);
-
public event ScriptAtTargetEvent OnScriptAtTargetEvent;
public delegate void ScriptNotAtTargetEvent(uint localID);
-
public event ScriptNotAtTargetEvent OnScriptNotAtTargetEvent;
public delegate void ScriptAtRotTargetEvent(uint localID, uint handle, Quaternion targetrot, Quaternion atrot);
-
public event ScriptAtRotTargetEvent OnScriptAtRotTargetEvent;
public delegate void ScriptNotAtRotTargetEvent(uint localID);
-
public event ScriptNotAtRotTargetEvent OnScriptNotAtRotTargetEvent;
public delegate void ScriptColliding(uint localID, ColliderArgs colliders);
-
public event ScriptColliding OnScriptColliderStart;
public event ScriptColliding OnScriptColliding;
public event ScriptColliding OnScriptCollidingEnd;
-
public event ScriptColliding OnScriptLandColliderStart;
public event ScriptColliding OnScriptLandColliding;
public event ScriptColliding OnScriptLandColliderEnd;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index a555eae..21ca1de 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -638,7 +638,6 @@ namespace OpenSim.Region.Framework.Scenes
m_items[item.ItemID] = item;
m_inventorySerial++;
m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
-
HasInventoryChanged = true;
m_part.ParentGroup.HasGroupChanged = true;
--
cgit v1.1
From 427ae1087fa67088afa23bcf533c63b52b62ae42 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 16 Apr 2010 22:57:44 +0100
Subject: minor: correctly print out missing item id when it can't be found
rather than a NullReferenceException
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 1 -
1 file changed, 1 deletion(-)
(limited to 'OpenSim/Region/Framework')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 4f2b446..fcbeeb6 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -531,7 +531,6 @@ namespace OpenSim.Region.Framework.Scenes
return null;
}
-
if (recipientParentFolderId == UUID.Zero)
{
InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId);
--
cgit v1.1
From 59546a348a4a47e21c5d05e53e1a2b15da10ce7a Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 21 May 2010 02:31:14 +0100
Subject: Change the way the object perms are propagated to attempt to salvage
some older content
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 44 +++++++++++-----------
1 file changed, 23 insertions(+), 21 deletions(-)
(limited to 'OpenSim/Region/Framework')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index fcbeeb6..af5742c 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -438,29 +438,31 @@ namespace OpenSim.Region.Framework.Scenes
itemCopy.InvType = item.InvType;
itemCopy.Folder = recipientFolderId;
- if (Permissions.PropagatePermissions())
+ if (Permissions.PropagatePermissions() && recipient != senderId)
{
+ // First, make sore base is limited to the next perms
+ itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions;
+ // By default, current equals base
+ itemCopy.CurrentPermissions = itemCopy.BasePermissions;
+
+ // If this is an object, replace current perms
+ // with folded perms
if (item.InvType == (int)InventoryType.Object)
{
- itemCopy.BasePermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
- itemCopy.BasePermissions |= (item.CurrentPermissions & 7) << 13;
- }
- else
- {
- itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions;
+ itemCopy.CurrentPermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
+ itemCopy.CurrentPermissions |= (item.CurrentPermissions & 7) << 13;
}
- itemCopy.CurrentPermissions = itemCopy.BasePermissions;
- if ((item.CurrentPermissions & 8) != 0) // Propagate slam bit
- {
- itemCopy.BasePermissions &= item.NextPermissions;
- itemCopy.CurrentPermissions = itemCopy.BasePermissions;
- itemCopy.CurrentPermissions |= 8;
- }
+ // Ensure there is no escalation
+ itemCopy.CurrentPermissions &= item.NextPermissions;
+
+ // Need slam bit on xfer
+ itemCopy.CurrentPermissions |= 8;
itemCopy.NextPermissions = item.NextPermissions;
- itemCopy.EveryOnePermissions = item.EveryOnePermissions & item.NextPermissions;
- itemCopy.GroupPermissions = item.GroupPermissions & item.NextPermissions;
+
+ itemCopy.EveryOnePermissions = 0;
+ itemCopy.GroupPermissions = 0;
}
else
{
@@ -909,12 +911,12 @@ namespace OpenSim.Region.Framework.Scenes
if ((part.OwnerID != destAgent) && Permissions.PropagatePermissions())
{
+ agentItem.BasePermissions = taskItem.BasePermissions & taskItem.NextPermissions;
if (taskItem.InvType == (int)InventoryType.Object)
- agentItem.BasePermissions = taskItem.BasePermissions & ((taskItem.CurrentPermissions & 7) << 13);
- else
- agentItem.BasePermissions = taskItem.BasePermissions;
- agentItem.BasePermissions &= taskItem.NextPermissions;
- agentItem.CurrentPermissions = agentItem.BasePermissions | 8;
+ agentItem.CurrentPermissions = agentItem.BasePermissions & ((taskItem.CurrentPermissions & 7) << 13);
+ agentItem.CurrentPermissions = agentItem.BasePermissions ;
+
+ agentItem.CurrentPermissions |= 8;
agentItem.NextPermissions = taskItem.NextPermissions;
agentItem.EveryOnePermissions = taskItem.EveryonePermissions & taskItem.NextPermissions;
agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions;
--
cgit v1.1
From 8048a8a39daf98b1068e84473e3e29ce0323e6f0 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 24 May 2010 17:33:58 +0100
Subject: backport some IGroupsModule method doc and an extra exposed method
from git master
---
.../Region/Framework/Interfaces/IGroupsModule.cs | 33 ++++++++++++++++++++--
1 file changed, 31 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework')
diff --git a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs
index 8980b2d..9683da0 100644
--- a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs
@@ -37,6 +37,37 @@ namespace OpenSim.Region.Framework.Interfaces
{
event NewGroupNotice OnNewGroupNotice;
+ ///
+ /// Create a group
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ /// The UUID of the created group
+ UUID CreateGroup(
+ IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee,
+ bool openEnrollment, bool allowPublish, bool maturePublish);
+
+ ///
+ /// Get a group
+ ///
+ /// Name of the group
+ /// The group's data. Null if there is no such group.
+ GroupRecord GetGroupRecord(string name);
+
+ ///
+ /// Get a group
+ ///
+ /// ID of the group
+ /// The group's data. Null if there is no such group.
+ GroupRecord GetGroupRecord(UUID GroupID);
+
void ActivateGroup(IClientAPI remoteClient, UUID groupID);
List GroupTitlesRequest(IClientAPI remoteClient, UUID groupID);
List GroupMembersRequest(IClientAPI remoteClient, UUID groupID);
@@ -51,7 +82,6 @@ namespace OpenSim.Region.Framework.Interfaces
void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile);
void GroupTitleUpdate(IClientAPI remoteClient, UUID GroupID, UUID TitleRoleID);
- UUID CreateGroup(IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish);
GroupNoticeData[] GroupNoticesListRequest(IClientAPI remoteClient, UUID GroupID);
string GetGroupTitle(UUID avatarID);
@@ -64,7 +94,6 @@ namespace OpenSim.Region.Framework.Interfaces
void LeaveGroupRequest(IClientAPI remoteClient, UUID GroupID);
void EjectGroupMemberRequest(IClientAPI remoteClient, UUID GroupID, UUID EjecteeID);
void InviteGroupRequest(IClientAPI remoteClient, UUID GroupID, UUID InviteeID, UUID RoleID);
- GroupRecord GetGroupRecord(UUID GroupID);
void NotifyChange(UUID GroupID);
}
}
--
cgit v1.1
From a6c7995b71ee1886bf94b2c63d0a603525a0667f Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 24 May 2010 19:19:44 +0100
Subject: backport from master fix for attachment display this fix stops two
full updates being sent on attachment rather than one. Sending two can stop
the client displaying attachments properly
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 5 ++++-
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 1 -
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 2 +-
3 files changed, 5 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index af5742c..42a748f 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2076,7 +2076,10 @@ namespace OpenSim.Region.Framework.Scenes
group.RootPart.IsAttachment = true;
}
- AddNewSceneObject(group, true);
+ // If we're rezzing an attachment then don't ask AddNewSceneObject() to update the client since
+ // we'll be doing that later on. Scheduling more than one full update during the attachment
+ // process causes some clients to fail to display the attachment properly.
+ AddNewSceneObject(group, true, !attachment);
// m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z);
// if attachment we set it's asset id so object updates can reflect that
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index ad24160..59a2f41 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -536,7 +536,6 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.DebugFormat(
// "[SCENE GRAPH]: Retrieved single object {0} for attachment to {1} on point {2}",
// objatt.Name, remoteClient.Name, AttachmentPt);
-
if (objatt != null)
{
bool tainted = false;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index c14b39a..602b811 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1514,7 +1514,7 @@ namespace OpenSim.Region.Framework.Scenes
internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags)
{
// m_log.DebugFormat(
-// "[SOG]: Sendinging part full update to {0} for {1} {2}", remoteClient.Name, part.Name, part.LocalId);
+// "[SOG]: Sending part full update to {0} for {1} {2}", remoteClient.Name, part.Name, part.LocalId);
if (m_rootPart.UUID == part.UUID)
{
--
cgit v1.1
From 5074d290e4aeb583560272cadc8ba09aa8337210 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 27 May 2010 21:35:17 +0100
Subject: commit code which stops full updates being fired multiple times when
attachments cross standalone region boundaries
lots of messy debug code here too which would need to be removed
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 5 +++
.../Framework/Scenes/Scene.PacketHandlers.cs | 1 +
OpenSim/Region/Framework/Scenes/Scene.cs | 43 +++++++++++++++++++---
.../Framework/Scenes/SceneCommunicationService.cs | 2 +
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 34 ++++++++++++++++-
.../Region/Framework/Scenes/SceneObjectGroup.cs | 15 ++++++--
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 34 +++++++++++++----
OpenSim/Region/Framework/Scenes/SceneViewer.cs | 8 +++-
8 files changed, 121 insertions(+), 21 deletions(-)
(limited to 'OpenSim/Region/Framework')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 42a748f..aa724c5 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2449,6 +2449,8 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
+ m_log.DebugFormat("[SCENE INVENTORY]: {0} {1} IsAttachment={2}", att.Name, att.LocalId, att.IsAttachment);
+ Console.WriteLine("HERE X");
ScenePresence presence;
if (TryGetAvatar(remoteClient.AgentId, out presence))
{
@@ -2456,9 +2458,12 @@ namespace OpenSim.Region.Framework.Scenes
InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
item = InventoryService.GetItem(item);
presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/);
+ Console.WriteLine("HERE Y");
if (m_AvatarFactory != null)
m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
+
+ Console.WriteLine("HERE Z");
}
}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index ac04dc7..d8e604f 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -124,6 +124,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (((SceneObjectGroup)ent).LocalId == primLocalID)
{
+ m_log.DebugFormat("[SCENE]: Received full update request for {0} from {1}", primLocalID, remoteClient.Name);
((SceneObjectGroup)ent).SendFullUpdateToClient(remoteClient);
return;
}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 637ebff..dd2d2cc 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1850,9 +1850,31 @@ namespace OpenSim.Region.Framework.Scenes
/// true if the object was added, false if an object with the same uuid was already in the scene
///
public bool AddRestoredSceneObject(
+ SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates)
+ {
+ return m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates);
+ }
+
+ ///
+ /// Add an object into the scene that has come from storage
+ ///
+ ///
+ ///
+ ///
+ /// If true, changes to the object will be reflected in its persisted data
+ /// If false, the persisted data will not be changed even if the object in the scene is changed
+ ///
+ ///
+ /// If true, we won't persist this object until it changes
+ /// If false, we'll persist this object immediately
+ ///
+ ///
+ /// true if the object was added, false if an object with the same uuid was already in the scene
+ ///
+ public bool AddRestoredSceneObject(
SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted)
{
- return m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted);
+ return AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, true);
}
///
@@ -2461,7 +2483,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public bool IncomingCreateObject(ISceneObject sog)
{
- //m_log.Debug(" >>> IncomingCreateObject(sog) <<< " + ((SceneObjectGroup)sog).AbsolutePosition + " deleted? " + ((SceneObjectGroup)sog).IsDeleted);
+ m_log.Debug(" >>> IncomingCreateObject(sog) <<< " + ((SceneObjectGroup)sog).AbsolutePosition + " deleted? " + ((SceneObjectGroup)sog).IsDeleted);
SceneObjectGroup newObject;
try
{
@@ -2533,10 +2555,12 @@ namespace OpenSim.Region.Framework.Scenes
if (sceneObject.IsAttachmentCheckFull()) // Attachment
{
+ m_log.DebugFormat("[SCENE]: Adding attachment {0} {1}", sceneObject.Name, sceneObject.LocalId);
+
sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez);
sceneObject.RootPart.AddFlag(PrimFlags.Phantom);
- AddRestoredSceneObject(sceneObject, false, false);
+ AddRestoredSceneObject(sceneObject, false, false, false);
// Handle attachment special case
SceneObjectPart RootPrim = sceneObject.RootPart;
@@ -2544,6 +2568,8 @@ namespace OpenSim.Region.Framework.Scenes
// Fix up attachment Parent Local ID
ScenePresence sp = GetScenePresence(sceneObject.OwnerID);
+ Console.WriteLine("AAAA");
+
//uint parentLocalID = 0;
if (sp != null)
{
@@ -2562,20 +2588,25 @@ namespace OpenSim.Region.Framework.Scenes
//grp.SetFromAssetID(grp.RootPart.LastOwnerID);
m_log.DebugFormat(
"[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition);
-
+
+ RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
AttachObject(
sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false);
- RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
- grp.SendGroupFullUpdate();
+
+ //grp.SendGroupFullUpdate();
}
else
{
RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
RootPrim.AddFlag(PrimFlags.TemporaryOnRez);
}
+
+ Console.WriteLine("BBBB");
}
else
{
+ m_log.DebugFormat("[SCENE]: Adding ordinary object {0} {1}", sceneObject.Name, sceneObject.LocalId);
+
AddRestoredSceneObject(sceneObject, true, false);
if (!Permissions.CanObjectEntry(sceneObject.UUID,
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 2f6a0db..50feb17 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -1383,7 +1383,9 @@ namespace OpenSim.Region.Framework.Scenes
// now we have a child agent in this region. Request all interesting data about other (root) agents
agent.SendInitialFullUpdateToAllClients();
+ Console.WriteLine("SCS 1");
agent.CrossAttachmentsIntoNewRegion(neighbourHandle, true);
+ Console.WriteLine("SCS 2");
// m_scene.SendKillObject(m_localId);
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 59a2f41..fa3c5eb 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -216,11 +216,15 @@ namespace OpenSim.Region.Framework.Scenes
/// If true, we won't persist this object until it changes
/// If false, we'll persist this object immediately
///
+ ///
+ /// If true, we send updates to the client to tell it about this object
+ /// If false, we leave it up to the caller to do this
+ ///
///
/// true if the object was added, false if an object with the same uuid was already in the scene
///
protected internal bool AddRestoredSceneObject(
- SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted)
+ SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates)
{
if (!alreadyPersisted)
{
@@ -228,8 +232,29 @@ namespace OpenSim.Region.Framework.Scenes
sceneObject.HasGroupChanged = true;
}
- return AddSceneObject(sceneObject, attachToBackup, true);
+ return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates);
}
+
+// ///
+// /// Add an object into the scene that has come from storage
+// ///
+// ///
+// ///
+// /// If true, changes to the object will be reflected in its persisted data
+// /// If false, the persisted data will not be changed even if the object in the scene is changed
+// ///
+// ///
+// /// If true, we won't persist this object until it changes
+// /// If false, we'll persist this object immediately
+// ///
+// ///
+// /// true if the object was added, false if an object with the same uuid was already in the scene
+// ///
+// protected internal bool AddRestoredSceneObject(
+// SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted)
+// {
+// AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, true);
+// }
///
/// Add a newly created object to the scene. This will both update the scene, and send information about the
@@ -611,11 +636,13 @@ namespace OpenSim.Region.Framework.Scenes
protected internal bool AttachObject(
IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos, bool silent)
{
+ Console.WriteLine("HERE A");
SceneObjectGroup group = GetGroupByPrim(objectLocalID);
if (group != null)
{
if (m_parentScene.Permissions.CanTakeObject(group.UUID, remoteClient.AgentId))
{
+ Console.WriteLine("HERE -1");
// If the attachment point isn't the same as the one previously used
// set it's offset position = 0 so that it appears on the attachment point
// and not in a weird location somewhere unknown.
@@ -654,9 +681,12 @@ namespace OpenSim.Region.Framework.Scenes
itemId = group.GetFromItemID();
}
+ Console.WriteLine("HERE 0");
m_parentScene.AttachObject(remoteClient, AttachmentPt, itemId, group);
+ Console.WriteLine("HERE 1");
group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos, silent);
+ Console.WriteLine("HERE 2");
// In case it is later dropped again, don't let
// it get cleaned up
//
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 602b811..ba3fde7 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1494,6 +1494,10 @@ namespace OpenSim.Region.Framework.Scenes
public void SendFullUpdateToClient(IClientAPI remoteClient)
{
+ if (IsAttachment)
+ m_log.DebugFormat(
+ "[SOG]: Sending full update to client {0} for {1} {2}", remoteClient.Name, Name, LocalId);
+
SendPartFullUpdate(remoteClient, RootPart, m_scene.Permissions.GenerateClientFlags(remoteClient.AgentId, RootPart.UUID));
lock (m_parts)
@@ -1513,8 +1517,9 @@ namespace OpenSim.Region.Framework.Scenes
///
internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags)
{
-// m_log.DebugFormat(
-// "[SOG]: Sending part full update to {0} for {1} {2}", remoteClient.Name, part.Name, part.LocalId);
+ if (IsAttachment)
+ m_log.DebugFormat(
+ "[SOG]: Sending part full update to {0} for {1} {2}", remoteClient.Name, part.Name, part.LocalId);
if (m_rootPart.UUID == part.UUID)
{
@@ -1994,7 +1999,8 @@ namespace OpenSim.Region.Framework.Scenes
public void ScheduleFullUpdateToAvatar(ScenePresence presence)
{
-// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1} just to avatar {2}", Name, UUID, presence.Name);
+ if (IsAttachment)
+ m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1} just to avatar {2}", Name, UUID, presence.Name);
RootPart.AddFullUpdateToAvatar(presence);
@@ -2026,7 +2032,8 @@ namespace OpenSim.Region.Framework.Scenes
///
public void ScheduleGroupForFullUpdate()
{
-// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, UUID);
+ if (IsAttachment)
+ m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, UUID);
checkAtTargets();
RootPart.ScheduleFullUpdate();
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index a85a4b3..ffbb427 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1259,16 +1259,17 @@ namespace OpenSim.Region.Framework.Scenes
/// Tell all scene presences that they should send updates for this part to their clients
///
public void AddFullUpdateToAllAvatars()
- {
+ {
ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
for (int i = 0; i < avatars.Length; i++)
- {
- avatars[i].SceneViewer.QueuePartForUpdate(this);
- }
+ AddFullUpdateToAvatar(avatars[i]);
}
public void AddFullUpdateToAvatar(ScenePresence presence)
{
+ if (IsAttachment)
+ m_log.DebugFormat("AddFullUpdateToAllAvatar() {0} for {1} {2}", presence.Name, Name, LocalId);
+
presence.SceneViewer.QueuePartForUpdate(this);
}
@@ -1287,13 +1288,14 @@ namespace OpenSim.Region.Framework.Scenes
{
ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
for (int i = 0; i < avatars.Length; i++)
- {
- avatars[i].SceneViewer.QueuePartForUpdate(this);
- }
+ AddTerseUpdateToAvatar(avatars[i]);
}
public void AddTerseUpdateToAvatar(ScenePresence presence)
{
+ if (IsAttachment)
+ m_log.DebugFormat("AddTerseUpdateToAvatar() {0} for {1} {2}", presence.Name, Name, LocalId);
+
presence.SceneViewer.QueuePartForUpdate(this);
}
@@ -2727,7 +2729,8 @@ namespace OpenSim.Region.Framework.Scenes
///
public void ScheduleFullUpdate()
{
-// m_log.DebugFormat("[SCENE OBJECT PART]: Scheduling full update for {0} {1}", Name, LocalId);
+ if (IsAttachment)
+ m_log.DebugFormat("[SOP]: Scheduling full update for {0} {1}", Name, LocalId);
if (m_parentGroup != null)
{
@@ -2840,6 +2843,10 @@ namespace OpenSim.Region.Framework.Scenes
///
public void SendFullUpdate(IClientAPI remoteClient, uint clientFlags)
{
+ if (IsAttachment)
+ m_log.DebugFormat(
+ "[SCENE OBJECT PART]: Sending part full update to {0} for {1} {2}", remoteClient.Name, Name, LocalId);
+
m_parentGroup.SendPartFullUpdate(remoteClient, this, clientFlags);
}
@@ -2848,6 +2855,10 @@ namespace OpenSim.Region.Framework.Scenes
///
public void SendFullUpdateToAllClients()
{
+ if (IsAttachment)
+ m_log.DebugFormat(
+ "[SCENE OBJECT PART]: Sending full update for {0} {1} for all clients", Name, LocalId);
+
ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
for (int i = 0; i < avatars.Length; i++)
{
@@ -2859,6 +2870,10 @@ namespace OpenSim.Region.Framework.Scenes
public void SendFullUpdateToAllClientsExcept(UUID agentID)
{
+ if (IsAttachment)
+ m_log.DebugFormat(
+ "[SCENE OBJECT PART]: Sending full update for {0} {1} to all clients except {2}", Name, LocalId, agentID);
+
ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
for (int i = 0; i < avatars.Length; i++)
{
@@ -2965,6 +2980,9 @@ namespace OpenSim.Region.Framework.Scenes
{
if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes
{
+ if (IsAttachment)
+ m_log.DebugFormat("[SOP]: Sending scheduled full update for {0} {1}", Name, LocalId);
+
AddFullUpdateToAllAvatars();
ClearUpdateSchedule();
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
index e4296ef..6f2bef9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
@@ -27,6 +27,7 @@
using System;
using System.Collections.Generic;
+using System.Reflection;
using OpenMetaverse;
using log4net;
using OpenSim.Framework;
@@ -39,6 +40,8 @@ namespace OpenSim.Region.Framework.Scenes
{
public class SceneViewer : ISceneViewer
{
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
protected ScenePresence m_presence;
protected UpdateQueue m_partsUpdateQueue = new UpdateQueue();
protected Queue m_pendingObjects;
@@ -60,6 +63,9 @@ namespace OpenSim.Region.Framework.Scenes
///
public void QueuePartForUpdate(SceneObjectPart part)
{
+ if (part.IsAttachment)
+ m_log.DebugFormat("[SCENE VIEWER]: Queueing part {0} {1} for update", part.Name, part.LocalId);
+
lock (m_partsUpdateQueue)
{
m_partsUpdateQueue.Enqueue(part);
@@ -134,7 +140,7 @@ namespace OpenSim.Region.Framework.Scenes
}
else if (update.LastTerseUpdateTime <= part.TimeStampTerse)
{
-// m_log.DebugFormat(
+// m_log.DebugFormat(AddFullUpdateToAvatar
// "[SCENE PRESENCE]: Tersely updating prim {0}, {1} - part timestamp {2}",
// part.Name, part.UUID, part.TimeStampTerse);
--
cgit v1.1
From c7d812802fcb2531c49f0fe4f4971571f332183d Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 28 May 2010 18:49:32 +0100
Subject: Adjust Scene.DeleteAllSceneObjects() to not delete objects attached
to avatars.
This is going to be the right behaviour in all cases, I should think.
This means that avatars in region when an oar is loaded do not lose their attachments
---
OpenSim/Region/Framework/Scenes/Scene.cs | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index dd2d2cc..f8ca047 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1908,7 +1908,7 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- /// Delete every object from the scene
+ /// Delete every object from the scene. This does not include attachments worn by avatars.
///
public void DeleteAllSceneObjects()
{
@@ -1919,7 +1919,11 @@ namespace OpenSim.Region.Framework.Scenes
foreach (EntityBase e in entities)
{
if (e is SceneObjectGroup)
- DeleteSceneObject((SceneObjectGroup)e, false);
+ {
+ SceneObjectGroup sog = (SceneObjectGroup)e;
+ if (!sog.IsAttachment)
+ DeleteSceneObject((SceneObjectGroup)e, false);
+ }
}
}
}
--
cgit v1.1