mirror of
https://github.com/opensim/opensim.git
synced 2026-08-10 03:06:05 +08:00
Merge branch 'master' into varregion
Conflicts: OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs OpenSim/Region/Framework/Scenes/SceneBase.cs OpenSim/Services/Interfaces/IGridService.cs OpenSim/Services/LLLoginService/LLLoginResponse.cs (conflicts were debug statements that are commented out in master branch)
This commit is contained in:
@@ -669,17 +669,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
// a mask
|
||||
if (item.InvType == (int)InventoryType.Object)
|
||||
{
|
||||
// Create a safe mask for the current perms
|
||||
uint foldedPerms = (item.CurrentPermissions & 7) << 13;
|
||||
foldedPerms |= permsMask;
|
||||
|
||||
bool isRootMod = (item.CurrentPermissions &
|
||||
(uint)PermissionMask.Modify) != 0 ?
|
||||
true : false;
|
||||
|
||||
// Mask the owner perms to the folded perms
|
||||
ownerPerms &= foldedPerms;
|
||||
basePerms &= foldedPerms;
|
||||
PermissionsUtil.ApplyFoldedPermissions(item.CurrentPermissions, ref ownerPerms);
|
||||
PermissionsUtil.ApplyFoldedPermissions(item.CurrentPermissions, ref basePerms);
|
||||
|
||||
// If the root was mod, let the mask reflect that
|
||||
// We also need to adjust the base here, because
|
||||
@@ -1209,9 +1205,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
agentItem.BasePermissions = taskItem.BasePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move);
|
||||
if (taskItem.InvType == (int)InventoryType.Object)
|
||||
agentItem.CurrentPermissions = agentItem.BasePermissions & (((taskItem.CurrentPermissions & 7) << 13) | (taskItem.CurrentPermissions & (uint)PermissionMask.Move));
|
||||
{
|
||||
uint perms = taskItem.CurrentPermissions;
|
||||
PermissionsUtil.ApplyFoldedPermissions(taskItem.CurrentPermissions, ref perms);
|
||||
agentItem.BasePermissions = perms | (uint)PermissionMask.Move;
|
||||
agentItem.CurrentPermissions = agentItem.BasePermissions;
|
||||
}
|
||||
else
|
||||
{
|
||||
agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions;
|
||||
}
|
||||
|
||||
agentItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm;
|
||||
agentItem.NextPermissions = taskItem.NextPermissions;
|
||||
|
||||
@@ -109,6 +109,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
STATUS_ROTATE_Z = 0x008,
|
||||
}
|
||||
|
||||
// This flag has the same purpose as InventoryItemFlags.ObjectSlamPerm
|
||||
public static readonly uint SLAM = 16;
|
||||
|
||||
// private PrimCountTaintedDelegate handlerPrimCountTainted = null;
|
||||
|
||||
/// <summary>
|
||||
@@ -3230,13 +3233,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
Vector3 oldPos;
|
||||
|
||||
// FIXME: This improves the situation where editing just the root prim of an attached object would send
|
||||
// all the other parts to oblivion after detach/reattach. However, a problem remains since the root prim
|
||||
// still ends up in the wrong position on reattach.
|
||||
if (IsAttachment)
|
||||
oldPos = RootPart.OffsetPosition;
|
||||
oldPos = m_rootPart.AttachedPos + m_rootPart.OffsetPosition; // OffsetPosition should always be 0 in an attachments's root prim
|
||||
else
|
||||
oldPos = AbsolutePosition + RootPart.OffsetPosition;
|
||||
oldPos = AbsolutePosition + m_rootPart.OffsetPosition;
|
||||
|
||||
Vector3 diff = oldPos - newPos;
|
||||
Quaternion partRotation = m_rootPart.RotationOffset;
|
||||
@@ -3251,6 +3251,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
}
|
||||
|
||||
AbsolutePosition = newPos;
|
||||
|
||||
if (IsAttachment)
|
||||
m_rootPart.AttachedPos = newPos;
|
||||
|
||||
HasGroupChanged = true;
|
||||
ScheduleGroupForTerseUpdate();
|
||||
|
||||
@@ -4800,6 +4800,64 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
ParentGroup.AddScriptLPS(count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets a prim's owner and permissions when it's rezzed.
|
||||
/// </summary>
|
||||
/// <param name="item">The inventory item from which the item was rezzed</param>
|
||||
/// <param name="userInventory">True: the item is being rezzed from the user's inventory. False: from a prim's inventory.</param>
|
||||
/// <param name="scene">The scene the prim is being rezzed into</param>
|
||||
public void ApplyPermissionsOnRez(InventoryItemBase item, bool userInventory, Scene scene)
|
||||
{
|
||||
if ((OwnerID != item.Owner) || ((item.CurrentPermissions & SceneObjectGroup.SLAM) != 0) || ((item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0))
|
||||
{
|
||||
if (scene.Permissions.PropagatePermissions())
|
||||
{
|
||||
if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
|
||||
{
|
||||
// Apply the item's permissions to the object
|
||||
//LogPermissions("Before applying item permissions");
|
||||
if (userInventory)
|
||||
{
|
||||
EveryoneMask = item.EveryOnePermissions;
|
||||
NextOwnerMask = item.NextPermissions;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
|
||||
EveryoneMask = item.EveryOnePermissions;
|
||||
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
|
||||
NextOwnerMask = item.NextPermissions;
|
||||
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0)
|
||||
GroupMask = item.GroupPermissions;
|
||||
}
|
||||
//LogPermissions("After applying item permissions");
|
||||
}
|
||||
}
|
||||
|
||||
GroupMask = 0; // DO NOT propagate here
|
||||
}
|
||||
|
||||
if (OwnerID != item.Owner)
|
||||
{
|
||||
//LogPermissions("Before ApplyNextOwnerPermissions");
|
||||
ApplyNextOwnerPermissions();
|
||||
//LogPermissions("After ApplyNextOwnerPermissions");
|
||||
|
||||
LastOwnerID = OwnerID;
|
||||
OwnerID = item.Owner;
|
||||
Inventory.ChangeInventoryOwner(item.Owner);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Logs the prim's permissions. Useful when debugging permission problems.
|
||||
/// </summary>
|
||||
/// <param name="message"></param>
|
||||
private void LogPermissions(String message)
|
||||
{
|
||||
PermissionsUtil.LogPermissions(Name, message, BaseMask, OwnerMask, NextOwnerMask);
|
||||
}
|
||||
|
||||
public void ApplyNextOwnerPermissions()
|
||||
{
|
||||
|
||||
@@ -764,48 +764,27 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
// Since renaming the item in the inventory does not affect the name stored
|
||||
// in the serialization, transfer the correct name from the inventory to the
|
||||
// object itself before we rez.
|
||||
rootPart.Name = item.Name;
|
||||
rootPart.Description = item.Description;
|
||||
|
||||
SceneObjectPart[] partList = group.Parts;
|
||||
// Only do these for the first object if we are rezzing a coalescence.
|
||||
if (i == 0)
|
||||
{
|
||||
rootPart.Name = item.Name;
|
||||
rootPart.Description = item.Description;
|
||||
}
|
||||
|
||||
group.SetGroup(m_part.GroupID, null);
|
||||
|
||||
// TODO: Remove magic number badness
|
||||
if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) // Magic number
|
||||
foreach (SceneObjectPart part in group.Parts)
|
||||
{
|
||||
if (m_part.ParentGroup.Scene.Permissions.PropagatePermissions())
|
||||
{
|
||||
foreach (SceneObjectPart part in partList)
|
||||
{
|
||||
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
|
||||
part.EveryoneMask = item.EveryonePermissions;
|
||||
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
|
||||
part.NextOwnerMask = item.NextPermissions;
|
||||
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0)
|
||||
part.GroupMask = item.GroupPermissions;
|
||||
}
|
||||
// Convert between InventoryItem classes. You can never have too many similar but slightly different classes :)
|
||||
InventoryItemBase dest = new InventoryItemBase(item.ItemID, item.OwnerID);
|
||||
dest.BasePermissions = item.BasePermissions;
|
||||
dest.CurrentPermissions = item.CurrentPermissions;
|
||||
dest.EveryOnePermissions = item.EveryonePermissions;
|
||||
dest.GroupPermissions = item.GroupPermissions;
|
||||
dest.NextPermissions = item.NextPermissions;
|
||||
dest.Flags = item.Flags;
|
||||
|
||||
group.ApplyNextOwnerPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
foreach (SceneObjectPart part in partList)
|
||||
{
|
||||
// TODO: Remove magic number badness
|
||||
if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) // Magic number
|
||||
{
|
||||
part.LastOwnerID = part.OwnerID;
|
||||
part.OwnerID = item.OwnerID;
|
||||
part.Inventory.ChangeInventoryOwner(item.OwnerID);
|
||||
}
|
||||
|
||||
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
|
||||
part.EveryoneMask = item.EveryonePermissions;
|
||||
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
|
||||
part.NextOwnerMask = item.NextPermissions;
|
||||
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0)
|
||||
part.GroupMask = item.GroupPermissions;
|
||||
part.ApplyPermissionsOnRez(dest, false, m_part.ParentGroup.Scene);
|
||||
}
|
||||
|
||||
rootPart.TrimPermissions();
|
||||
@@ -1130,25 +1109,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
mask &= ~((uint)PermissionMask.Transfer >> 13);
|
||||
if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0)
|
||||
mask &= ~((uint)PermissionMask.Modify >> 13);
|
||||
|
||||
if (item.InvType != (int)InventoryType.Object)
|
||||
{
|
||||
if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0)
|
||||
mask &= ~((uint)PermissionMask.Copy >> 13);
|
||||
if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Transfer) == 0)
|
||||
mask &= ~((uint)PermissionMask.Transfer >> 13);
|
||||
if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0)
|
||||
mask &= ~((uint)PermissionMask.Modify >> 13);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
|
||||
mask &= ~((uint)PermissionMask.Copy >> 13);
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
|
||||
mask &= ~((uint)PermissionMask.Transfer >> 13);
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
|
||||
mask &= ~((uint)PermissionMask.Modify >> 13);
|
||||
}
|
||||
|
||||
if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
|
||||
mask &= ~(uint)PermissionMask.Copy;
|
||||
@@ -1172,14 +1132,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
// "[SCENE OBJECT PART INVENTORY]: Applying next permissions {0} to {1} in {2} with current {3}, base {4}, everyone {5}",
|
||||
// item.NextPermissions, item.Name, m_part.Name, item.CurrentPermissions, item.BasePermissions, item.EveryonePermissions);
|
||||
|
||||
if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0)
|
||||
if (item.InvType == (int)InventoryType.Object)
|
||||
{
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
|
||||
item.CurrentPermissions &= ~(uint)PermissionMask.Copy;
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
|
||||
item.CurrentPermissions &= ~(uint)PermissionMask.Transfer;
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
|
||||
item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
|
||||
uint perms = item.CurrentPermissions;
|
||||
PermissionsUtil.ApplyFoldedPermissions(perms, ref perms);
|
||||
item.CurrentPermissions = perms;
|
||||
}
|
||||
|
||||
item.CurrentPermissions &= item.NextPermissions;
|
||||
|
||||
@@ -1900,6 +1900,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
ControllingClient.SendAgentTerseUpdate(this);
|
||||
|
||||
PhysicsActor actor = PhysicsActor;
|
||||
|
||||
// This will be the case if the agent is sitting on the groudn or on an object.
|
||||
if (actor == null)
|
||||
{
|
||||
SendControlsToScripts(flagsForScripts);
|
||||
|
||||
Reference in New Issue
Block a user