From 3cb2b5eb6686d4e183eed5152570b7e052381f8d Mon Sep 17 00:00:00 2001
From: Teravus Ovares
Date: Wed, 14 Nov 2007 11:56:57 +0000
Subject: * Copied objects are now owned by the object copier (Next Owner)
(however next owner permissions are not applied yet) * In Serverside
permissions mode; If you've copied an object, then you can delete it and
clean up after yourself. The rest of the permissions functionality is still
unchanged. Admin can delete any object.. etc.
---
OpenSim/Region/Environment/PermissionManager.cs | 5 ++-
OpenSim/Region/Environment/Scenes/InnerScene.cs | 4 +-
.../Region/Environment/Scenes/SceneObjectGroup.cs | 45 ++++++++++++++++++----
.../Region/Environment/Scenes/SceneObjectPart.cs | 4 +-
4 files changed, 46 insertions(+), 12 deletions(-)
(limited to 'OpenSim/Region/Environment')
diff --git a/OpenSim/Region/Environment/PermissionManager.cs b/OpenSim/Region/Environment/PermissionManager.cs
index fd55833..560ecf3 100644
--- a/OpenSim/Region/Environment/PermissionManager.cs
+++ b/OpenSim/Region/Environment/PermissionManager.cs
@@ -139,9 +139,12 @@ namespace OpenSim.Region.Environment
SceneObjectGroup task = (SceneObjectGroup) m_scene.Entities[objId];
LLUUID taskOwner = null;
+ // Added this because at this point in time it wouldn't be wise for
+ // the administrator object permissions to take effect.
+ LLUUID objectOwner = task.OwnerID;
// Object owners should be able to edit their own content
- if (user == taskOwner)
+ if (user == objectOwner)
permission = true;
// Users should be able to edit what is over their land.
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs
index c8e9b73..c436b89 100644
--- a/OpenSim/Region/Environment/Scenes/InnerScene.cs
+++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs
@@ -593,7 +593,7 @@ namespace OpenSim.Region.Environment.Scenes
///
///
///
- public void DuplicateObject(uint originalPrim, LLVector3 offset, uint flags)
+ public void DuplicateObject(uint originalPrim, LLVector3 offset, uint flags, LLUUID AgentID, LLUUID GroupID)
{
SceneObjectGroup originPrim = null;
foreach (EntityBase ent in Entities.Values)
@@ -610,7 +610,7 @@ namespace OpenSim.Region.Environment.Scenes
if (originPrim != null)
{
- SceneObjectGroup copy = originPrim.Copy();
+ SceneObjectGroup copy = originPrim.Copy(AgentID, GroupID);
copy.AbsolutePosition = copy.AbsolutePosition + offset;
Entities.Add(copy.UUID, copy);
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index a9f0bb3..c9b6e9f 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -73,7 +73,11 @@ namespace OpenSim.Region.Environment.Scenes
{
get { return m_rootPart.RotationOffset; }
}
-
+ public LLUUID GroupID
+ {
+ get { return m_rootPart.GroupID; }
+ set { m_rootPart.GroupID = value; }
+ }
///
///
///
@@ -165,6 +169,7 @@ namespace OpenSim.Region.Environment.Scenes
public LLUUID OwnerID
{
get { return m_rootPart.OwnerID; }
+ set { m_rootPart.OwnerID = value; }
}
public Color Color
@@ -447,15 +452,18 @@ namespace OpenSim.Region.Environment.Scenes
///
///
///
- public new SceneObjectGroup Copy()
+ public new SceneObjectGroup Copy(LLUUID cAgentID, LLUUID cGroupID)
{
SceneObjectGroup dupe = (SceneObjectGroup) MemberwiseClone();
dupe.m_parts = new Dictionary();
dupe.m_parts.Clear();
+ //dupe.OwnerID = AgentID;
+ //dupe.GroupID = GroupID;
dupe.AbsolutePosition = new LLVector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
dupe.m_scene = m_scene;
dupe.m_regionHandle = m_regionHandle;
- dupe.CopyRootPart(m_rootPart);
+ dupe.CopyRootPart(m_rootPart, OwnerID, GroupID);
+
/// may need to create a new Physics actor.
if (dupe.RootPart.PhysActor != null)
@@ -472,18 +480,29 @@ namespace OpenSim.Region.Environment.Scenes
dupe.RootPart.RotationOffset.Y, dupe.RootPart.RotationOffset.Z),
dupe.RootPart.PhysActor.IsPhysical);
}
+ // Now we've made a copy that replaces this one, we need to
+ // switch the owner to the person who did the copying
+ // Second Life copies an object and duplicates the first one in it's place
+ // So, we have to make a copy of this one, set it in it's place then set the owner on this one
+
+ SetRootPartOwner(m_rootPart, cAgentID, cGroupID);
+ m_rootPart.ScheduleFullUpdate();
List partList = new List(m_parts.Values);
foreach (SceneObjectPart part in partList)
{
if (part.UUID != m_rootPart.UUID)
{
- dupe.CopyPart(part);
+ dupe.CopyPart(part,OwnerID, GroupID);
+ SetPartOwner(part, cAgentID, cGroupID);
+ part.ScheduleFullUpdate();
+
}
}
dupe.UpdateParentIDs();
dupe.AttachToBackup();
+ ScheduleGroupForFullUpdate();
return dupe;
}
@@ -492,25 +511,35 @@ namespace OpenSim.Region.Environment.Scenes
///
///
///
- public void CopyRootPart(SceneObjectPart part)
+ public void CopyRootPart(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID)
{
- SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate());
+ SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate(), OwnerID, GroupID);
newPart.SetParent(this);
m_parts.Add(newPart.UUID, newPart);
SetPartAsRoot(newPart);
}
+ public void SetRootPartOwner(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID) {
+ part.OwnerID = cAgentID;
+ part.GroupID = cGroupID;
+ part.ScheduleFullUpdate();
+ }
///
///
///
///
- public void CopyPart(SceneObjectPart part)
+ public void CopyPart(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID)
{
- SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate());
+ SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate(), OwnerID, GroupID);
newPart.SetParent(this);
m_parts.Add(newPart.UUID, newPart);
SetPartAsNonRoot(newPart);
}
+ public void SetPartOwner(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID)
+ {
+ part.OwnerID = cAgentID;
+ part.GroupID = cGroupID;
+ }
#endregion
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 52bea40..70b8829 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -520,13 +520,15 @@ namespace OpenSim.Region.Environment.Scenes
///
///
///
- public SceneObjectPart Copy(uint localID)
+ public SceneObjectPart Copy(uint localID, LLUUID AgentID, LLUUID GroupID)
{
SceneObjectPart dupe = (SceneObjectPart) MemberwiseClone();
dupe.m_shape = m_shape.Copy();
dupe.m_regionHandle = m_regionHandle;
dupe.UUID = LLUUID.Random();
dupe.LocalID = localID;
+ dupe.OwnerID = AgentID;
+ dupe.GroupID = GroupID;
dupe.GroupPosition = new LLVector3(GroupPosition.X, GroupPosition.Y, GroupPosition.Z);
dupe.OffsetPosition = new LLVector3(OffsetPosition.X, OffsetPosition.Y, OffsetPosition.Z);
dupe.RotationOffset =
--
cgit v1.1