Merge branch 'careminster-presence-refactor' of ssh://3dhosting.de/var/git/careminster into careminster-presence-refactor
commit
8c2e1c6c29
|
@ -1,5 +1,6 @@
|
||||||
.project
|
.project
|
||||||
.settings
|
.settings
|
||||||
|
.gitignore
|
||||||
*.csproj
|
*.csproj
|
||||||
*.csproj.user
|
*.csproj.user
|
||||||
*.build
|
*.build
|
||||||
|
@ -10,6 +11,7 @@
|
||||||
*.pidb
|
*.pidb
|
||||||
*.dll.build
|
*.dll.build
|
||||||
*.dll
|
*.dll
|
||||||
|
*.log
|
||||||
*.VisualState.xml
|
*.VisualState.xml
|
||||||
*/*/obj
|
*/*/obj
|
||||||
*/*/*/obj
|
*/*/*/obj
|
||||||
|
@ -23,6 +25,7 @@
|
||||||
*/*/*/*/*/bin
|
*/*/*/*/*/bin
|
||||||
*/*/*/*/*/*/bin
|
*/*/*/*/*/*/bin
|
||||||
*/*/*/*/*/*/*/bin
|
*/*/*/*/*/*/*/bin
|
||||||
|
addon-modules/
|
||||||
bin/Debug/*.dll
|
bin/Debug/*.dll
|
||||||
bin/*.dll.mdb
|
bin/*.dll.mdb
|
||||||
bin/*.db
|
bin/*.db
|
||||||
|
|
|
@ -781,7 +781,7 @@ namespace OpenSim.Data.Tests
|
||||||
// Ownership changes when you drop an object into an object
|
// Ownership changes when you drop an object into an object
|
||||||
// owned by someone else
|
// owned by someone else
|
||||||
Assert.That(t.OwnerID,Is.EqualTo(sog.RootPart.OwnerID), "Assert.That(t.OwnerID,Is.EqualTo(sog.RootPart.OwnerID))");
|
Assert.That(t.OwnerID,Is.EqualTo(sog.RootPart.OwnerID), "Assert.That(t.OwnerID,Is.EqualTo(sog.RootPart.OwnerID))");
|
||||||
Assert.That(t.CurrentPermissions, Is.EqualTo(curperm | 8), "Assert.That(t.CurrentPermissions, Is.EqualTo(curperm | 8))");
|
Assert.That(t.CurrentPermissions, Is.EqualTo(curperm | 16), "Assert.That(t.CurrentPermissions, Is.EqualTo(curperm | 8))");
|
||||||
Assert.That(t.ParentID,Is.EqualTo(sog.RootPart.FolderID), "Assert.That(t.ParentID,Is.EqualTo(sog.RootPart.FolderID))");
|
Assert.That(t.ParentID,Is.EqualTo(sog.RootPart.FolderID), "Assert.That(t.ParentID,Is.EqualTo(sog.RootPart.FolderID))");
|
||||||
Assert.That(t.ParentPartID,Is.EqualTo(sog.RootPart.UUID), "Assert.That(t.ParentPartID,Is.EqualTo(sog.RootPart.UUID))");
|
Assert.That(t.ParentPartID,Is.EqualTo(sog.RootPart.UUID), "Assert.That(t.ParentPartID,Is.EqualTo(sog.RootPart.UUID))");
|
||||||
}
|
}
|
||||||
|
|
|
@ -212,9 +212,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
|
|
||||||
InventoryFolderBase destFolder = ResolveDestinationFolder(rootDestFolder, ref iarPathExisting, resolvedFolders);
|
InventoryFolderBase destFolder = ResolveDestinationFolder(rootDestFolder, ref iarPathExisting, resolvedFolders);
|
||||||
|
|
||||||
m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
"[INVENTORY ARCHIVER]: originalArchivePath [{0}], section already loaded [{1}]",
|
// "[INVENTORY ARCHIVER]: originalArchivePath [{0}], section already loaded [{1}]",
|
||||||
iarPath, iarPathExisting);
|
// iarPath, iarPathExisting);
|
||||||
|
|
||||||
string iarPathToCreate = iarPath.Substring(iarPathExisting.Length);
|
string iarPathToCreate = iarPath.Substring(iarPathExisting.Length);
|
||||||
CreateFoldersForPath(destFolder, iarPathExisting, iarPathToCreate, resolvedFolders, loadedNodes);
|
CreateFoldersForPath(destFolder, iarPathExisting, iarPathToCreate, resolvedFolders, loadedNodes);
|
||||||
|
@ -255,12 +255,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
{
|
{
|
||||||
while (null == destFolder && archivePath.Length > 0)
|
while (null == destFolder && archivePath.Length > 0)
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[INVENTORY ARCHIVER]: Trying to resolve destination folder {0}", archivePath);
|
// m_log.DebugFormat("[INVENTORY ARCHIVER]: Trying to resolve destination folder {0}", archivePath);
|
||||||
|
|
||||||
if (resolvedFolders.ContainsKey(archivePath))
|
if (resolvedFolders.ContainsKey(archivePath))
|
||||||
{
|
{
|
||||||
m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
"[INVENTORY ARCHIVER]: Found previously created folder from archive path {0}", archivePath);
|
// "[INVENTORY ARCHIVER]: Found previously created folder from archive path {0}", archivePath);
|
||||||
destFolder = resolvedFolders[archivePath];
|
destFolder = resolvedFolders[archivePath];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -275,9 +275,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
"[INVENTORY ARCHIVER]: Found no previously created folder for archive path {0}",
|
// "[INVENTORY ARCHIVER]: Found no previously created folder for archive path {0}",
|
||||||
originalArchivePath);
|
// originalArchivePath);
|
||||||
archivePath = string.Empty;
|
archivePath = string.Empty;
|
||||||
destFolder = rootDestFolder;
|
destFolder = rootDestFolder;
|
||||||
}
|
}
|
||||||
|
|
|
@ -381,12 +381,27 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
if ((nextPerms & (uint)PermissionMask.Modify) == 0)
|
if ((nextPerms & (uint)PermissionMask.Modify) == 0)
|
||||||
perms &= ~(uint)PermissionMask.Modify;
|
perms &= ~(uint)PermissionMask.Modify;
|
||||||
|
|
||||||
|
// Make sure all bits but the ones we want are clear
|
||||||
|
// on take.
|
||||||
|
// This will be applied to the current perms, so
|
||||||
|
// it will do what we want.
|
||||||
|
objectGroup.RootPart.NextOwnerMask &=
|
||||||
|
((uint)PermissionMask.Copy |
|
||||||
|
(uint)PermissionMask.Transfer |
|
||||||
|
(uint)PermissionMask.Modify);
|
||||||
|
objectGroup.RootPart.NextOwnerMask |=
|
||||||
|
(uint)PermissionMask.Move;
|
||||||
|
|
||||||
item.BasePermissions = perms & objectGroup.RootPart.NextOwnerMask;
|
item.BasePermissions = perms & objectGroup.RootPart.NextOwnerMask;
|
||||||
item.CurrentPermissions = item.BasePermissions;
|
item.CurrentPermissions = item.BasePermissions;
|
||||||
item.NextPermissions = objectGroup.RootPart.NextOwnerMask;
|
item.NextPermissions = objectGroup.RootPart.NextOwnerMask;
|
||||||
item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask;
|
item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask;
|
||||||
item.GroupPermissions = objectGroup.RootPart.GroupMask & objectGroup.RootPart.NextOwnerMask;
|
item.GroupPermissions = objectGroup.RootPart.GroupMask & objectGroup.RootPart.NextOwnerMask;
|
||||||
item.CurrentPermissions |= 8; // Slam!
|
|
||||||
|
// Magic number badness. Maybe this deserves an enum.
|
||||||
|
// bit 4 (16) is the "Slam" bit, it means treat as passed
|
||||||
|
// and apply next owner perms on rez
|
||||||
|
item.CurrentPermissions |= 16; // Slam!
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -396,7 +411,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask;
|
item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask;
|
||||||
item.GroupPermissions = objectGroup.RootPart.GroupMask;
|
item.GroupPermissions = objectGroup.RootPart.GroupMask;
|
||||||
|
|
||||||
item.CurrentPermissions |= 8; // Slam!
|
item.CurrentPermissions &=
|
||||||
|
((uint)PermissionMask.Copy |
|
||||||
|
(uint)PermissionMask.Transfer |
|
||||||
|
(uint)PermissionMask.Modify |
|
||||||
|
(uint)PermissionMask.Move |
|
||||||
|
7); // Preserve folded permissions
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: add the new fields (Flags, Sale info, etc)
|
// TODO: add the new fields (Flags, Sale info, etc)
|
||||||
|
@ -499,6 +519,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
|
|
||||||
group.RootPart.FromFolderID = item.Folder;
|
group.RootPart.FromFolderID = item.Folder;
|
||||||
|
|
||||||
|
// If it's rezzed in world, select it. Much easier to
|
||||||
|
// find small items.
|
||||||
|
//
|
||||||
|
if (!attachment)
|
||||||
|
group.RootPart.CreateSelected = true;
|
||||||
|
|
||||||
if (!m_Scene.Permissions.CanRezObject(
|
if (!m_Scene.Permissions.CanRezObject(
|
||||||
group.Children.Count, remoteClient.AgentId, pos)
|
group.Children.Count, remoteClient.AgentId, pos)
|
||||||
&& !attachment)
|
&& !attachment)
|
||||||
|
@ -571,15 +597,13 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values);
|
List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values);
|
||||||
|
|
||||||
group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
|
group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
|
||||||
if (rootPart.OwnerID != item.Owner)
|
if ((rootPart.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0)
|
||||||
{
|
{
|
||||||
//Need to kill the for sale here
|
//Need to kill the for sale here
|
||||||
rootPart.ObjectSaleType = 0;
|
rootPart.ObjectSaleType = 0;
|
||||||
rootPart.SalePrice = 10;
|
rootPart.SalePrice = 10;
|
||||||
|
|
||||||
if (m_Scene.Permissions.PropagatePermissions())
|
if (m_Scene.Permissions.PropagatePermissions())
|
||||||
{
|
|
||||||
if ((item.CurrentPermissions & 8) != 0)
|
|
||||||
{
|
{
|
||||||
foreach (SceneObjectPart part in partList)
|
foreach (SceneObjectPart part in partList)
|
||||||
{
|
{
|
||||||
|
@ -587,7 +611,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
part.NextOwnerMask = item.NextPermissions;
|
part.NextOwnerMask = item.NextPermissions;
|
||||||
part.GroupMask = 0; // DO NOT propagate here
|
part.GroupMask = 0; // DO NOT propagate here
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
group.ApplyNextOwnerPermissions();
|
group.ApplyNextOwnerPermissions();
|
||||||
}
|
}
|
||||||
|
@ -595,19 +618,15 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
|
|
||||||
foreach (SceneObjectPart part in partList)
|
foreach (SceneObjectPart part in partList)
|
||||||
{
|
{
|
||||||
if (part.OwnerID != item.Owner)
|
if ((part.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0)
|
||||||
{
|
{
|
||||||
part.LastOwnerID = part.OwnerID;
|
part.LastOwnerID = part.OwnerID;
|
||||||
part.OwnerID = item.Owner;
|
part.OwnerID = item.Owner;
|
||||||
part.Inventory.ChangeInventoryOwner(item.Owner);
|
part.Inventory.ChangeInventoryOwner(item.Owner);
|
||||||
}
|
|
||||||
else if (((item.CurrentPermissions & 8) != 0) && (!attachment)) // Slam!
|
|
||||||
{
|
|
||||||
part.EveryoneMask = item.EveryOnePermissions;
|
|
||||||
part.NextOwnerMask = item.NextPermissions;
|
|
||||||
|
|
||||||
part.GroupMask = 0; // DO NOT propagate here
|
part.GroupMask = 0; // DO NOT propagate here
|
||||||
}
|
}
|
||||||
|
part.EveryoneMask = item.EveryOnePermissions;
|
||||||
|
part.NextOwnerMask = item.NextPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
rootPart.TrimPermissions();
|
rootPart.TrimPermissions();
|
||||||
|
|
|
@ -280,6 +280,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID,
|
public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID,
|
||||||
UUID itemID, InventoryItemBase itemUpd)
|
UUID itemID, InventoryItemBase itemUpd)
|
||||||
{
|
{
|
||||||
|
// This one will let people set next perms on items in agent
|
||||||
|
// inventory. Rut-Roh. Whatever. Make this secure. Yeah.
|
||||||
|
//
|
||||||
|
// Passing something to another avatar or a an object will already
|
||||||
InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
|
InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
|
||||||
item = InventoryService.GetItem(item);
|
item = InventoryService.GetItem(item);
|
||||||
|
|
||||||
|
@ -289,11 +293,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
item.Name = itemUpd.Name;
|
item.Name = itemUpd.Name;
|
||||||
item.Description = itemUpd.Description;
|
item.Description = itemUpd.Description;
|
||||||
item.NextPermissions = itemUpd.NextPermissions;
|
item.NextPermissions = itemUpd.NextPermissions & item.BasePermissions;
|
||||||
item.CurrentPermissions |= 8; // Slam!
|
item.EveryOnePermissions = itemUpd.EveryOnePermissions & item.BasePermissions;
|
||||||
item.EveryOnePermissions = itemUpd.EveryOnePermissions;
|
item.GroupPermissions = itemUpd.GroupPermissions & item.BasePermissions;
|
||||||
item.GroupPermissions = itemUpd.GroupPermissions;
|
|
||||||
|
|
||||||
item.GroupID = itemUpd.GroupID;
|
item.GroupID = itemUpd.GroupID;
|
||||||
item.GroupOwned = itemUpd.GroupOwned;
|
item.GroupOwned = itemUpd.GroupOwned;
|
||||||
item.CreationDate = itemUpd.CreationDate;
|
item.CreationDate = itemUpd.CreationDate;
|
||||||
|
@ -399,28 +401,96 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
if (Permissions.PropagatePermissions() && recipient != senderId)
|
if (Permissions.PropagatePermissions() && recipient != senderId)
|
||||||
{
|
{
|
||||||
// First, make sore base is limited to the next perms
|
// Trying to do this right this time. This is evil. If
|
||||||
itemCopy.BasePermissions = item.BasePermissions & (item.NextPermissions | (uint)PermissionMask.Move);
|
// you believe in Good, go elsewhere. Vampires and other
|
||||||
// By default, current equals base
|
// evil creatores only beyond this point. You have been
|
||||||
itemCopy.CurrentPermissions = itemCopy.BasePermissions & item.CurrentPermissions;
|
// warned.
|
||||||
|
|
||||||
// If this is an object, replace current perms
|
// We're going to mask a lot of things by the next perms
|
||||||
// with folded perms
|
// Tweak the next perms to be nicer to our data
|
||||||
|
//
|
||||||
|
// In this mask, all the bits we do NOT want to mess
|
||||||
|
// with are set. These are:
|
||||||
|
//
|
||||||
|
// Transfer
|
||||||
|
// Copy
|
||||||
|
// Modufy
|
||||||
|
uint permsMask = ~ ((uint)PermissionMask.Copy |
|
||||||
|
(uint)PermissionMask.Transfer |
|
||||||
|
(uint)PermissionMask.Modify);
|
||||||
|
|
||||||
|
// Now, reduce the next perms to the mask bits
|
||||||
|
// relevant to the operation
|
||||||
|
uint nextPerms = permsMask | (item.NextPermissions &
|
||||||
|
((uint)PermissionMask.Copy |
|
||||||
|
(uint)PermissionMask.Transfer |
|
||||||
|
(uint)PermissionMask.Modify));
|
||||||
|
|
||||||
|
// nextPerms now has all bits set, except for the actual
|
||||||
|
// next permission bits.
|
||||||
|
|
||||||
|
// This checks for no mod, no copy, no trans.
|
||||||
|
// This indicates an error or messed up item. Do it like
|
||||||
|
// SL and assume trans
|
||||||
|
if (nextPerms == permsMask)
|
||||||
|
nextPerms |= (uint)PermissionMask.Transfer;
|
||||||
|
|
||||||
|
// Inventory owner perms are the logical AND of the
|
||||||
|
// folded perms and the root prim perms, however, if
|
||||||
|
// the root prim is mod, the inventory perms will be
|
||||||
|
// mod. This happens on "take" and is of little concern
|
||||||
|
// here, save for preventing escalation
|
||||||
|
|
||||||
|
// This hack ensures that items previously permalocked
|
||||||
|
// get unlocked when they're passed or rezzed
|
||||||
|
uint basePerms = item.BasePermissions |
|
||||||
|
(uint)PermissionMask.Move;
|
||||||
|
uint ownerPerms = item.CurrentPermissions;
|
||||||
|
|
||||||
|
// Mask the base permissions. This is a conservative
|
||||||
|
// approach altering only the three main perms
|
||||||
|
basePerms &= nextPerms;
|
||||||
|
|
||||||
|
// If this is an object, root prim perms may be more
|
||||||
|
// permissive than folded perms. Use folded perms as
|
||||||
|
// a mask
|
||||||
if (item.InvType == (int)InventoryType.Object)
|
if (item.InvType == (int)InventoryType.Object)
|
||||||
{
|
{
|
||||||
itemCopy.CurrentPermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
|
// Create a safe mask for the current perms
|
||||||
itemCopy.CurrentPermissions |= (item.CurrentPermissions & 7) << 13;
|
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;
|
||||||
|
|
||||||
|
// If the root was mod, let the mask reflect that
|
||||||
|
if (isRootMod)
|
||||||
|
ownerPerms |= (uint)PermissionMask.Modify;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure there is no escalation
|
// These will be applied to the root prim at next rez.
|
||||||
itemCopy.CurrentPermissions &= (item.NextPermissions | (uint)PermissionMask.Move);
|
// The slam bit (bit 3) and folded permission (bits 0-2)
|
||||||
|
// are preserved due to the above mangling
|
||||||
|
ownerPerms &= nextPerms;
|
||||||
|
|
||||||
// Need slam bit on xfer
|
// Assign to the actual item. Make sure the slam bit is
|
||||||
itemCopy.CurrentPermissions |= 8;
|
// set, if it wasn't set before.
|
||||||
|
itemCopy.BasePermissions = basePerms;
|
||||||
|
itemCopy.CurrentPermissions = ownerPerms | 16; // Slam
|
||||||
|
|
||||||
itemCopy.NextPermissions = item.NextPermissions;
|
itemCopy.NextPermissions = item.NextPermissions;
|
||||||
|
|
||||||
itemCopy.EveryOnePermissions = 0;
|
// This preserves "everyone can move"
|
||||||
|
itemCopy.EveryOnePermissions = item.EveryOnePermissions &
|
||||||
|
nextPerms;
|
||||||
|
|
||||||
|
// Intentionally killing "share with group" here, as
|
||||||
|
// the recipient will not have the group this is
|
||||||
|
// set to
|
||||||
itemCopy.GroupPermissions = 0;
|
itemCopy.GroupPermissions = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -922,7 +992,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
else
|
else
|
||||||
agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions;
|
agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions;
|
||||||
|
|
||||||
agentItem.CurrentPermissions |= 8;
|
agentItem.CurrentPermissions |= 16; // Slam
|
||||||
agentItem.NextPermissions = taskItem.NextPermissions;
|
agentItem.NextPermissions = taskItem.NextPermissions;
|
||||||
agentItem.EveryOnePermissions = taskItem.EveryonePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move);
|
agentItem.EveryOnePermissions = taskItem.EveryonePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move);
|
||||||
agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions;
|
agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions;
|
||||||
|
@ -1113,7 +1183,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
(srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
|
(srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
|
||||||
destTaskItem.BasePermissions = srcTaskItem.BasePermissions &
|
destTaskItem.BasePermissions = srcTaskItem.BasePermissions &
|
||||||
(srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
|
(srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
|
||||||
destTaskItem.CurrentPermissions |= 8; // Slam!
|
destTaskItem.CurrentPermissions |= 16; // Slam!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1497,7 +1567,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
srcTaskItem.NextPermissions;
|
srcTaskItem.NextPermissions;
|
||||||
destTaskItem.BasePermissions = srcTaskItem.BasePermissions &
|
destTaskItem.BasePermissions = srcTaskItem.BasePermissions &
|
||||||
srcTaskItem.NextPermissions;
|
srcTaskItem.NextPermissions;
|
||||||
destTaskItem.CurrentPermissions |= 8; // Slam!
|
destTaskItem.CurrentPermissions |= 16; // Slam!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1889,36 +1959,30 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
group.SetGroup(sourcePart.GroupID, null);
|
group.SetGroup(sourcePart.GroupID, null);
|
||||||
|
|
||||||
if (rootPart.OwnerID != item.OwnerID)
|
if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0)
|
||||||
{
|
{
|
||||||
if (Permissions.PropagatePermissions())
|
if (Permissions.PropagatePermissions())
|
||||||
{
|
|
||||||
if ((item.CurrentPermissions & 8) != 0)
|
|
||||||
{
|
{
|
||||||
foreach (SceneObjectPart part in partList)
|
foreach (SceneObjectPart part in partList)
|
||||||
{
|
{
|
||||||
part.EveryoneMask = item.EveryonePermissions;
|
part.EveryoneMask = item.EveryonePermissions;
|
||||||
part.NextOwnerMask = item.NextPermissions;
|
part.NextOwnerMask = item.NextPermissions;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
group.ApplyNextOwnerPermissions();
|
group.ApplyNextOwnerPermissions();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (SceneObjectPart part in partList)
|
foreach (SceneObjectPart part in partList)
|
||||||
{
|
{
|
||||||
if (part.OwnerID != item.OwnerID)
|
if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0)
|
||||||
{
|
{
|
||||||
part.LastOwnerID = part.OwnerID;
|
part.LastOwnerID = part.OwnerID;
|
||||||
part.OwnerID = item.OwnerID;
|
part.OwnerID = item.OwnerID;
|
||||||
part.Inventory.ChangeInventoryOwner(item.OwnerID);
|
part.Inventory.ChangeInventoryOwner(item.OwnerID);
|
||||||
}
|
}
|
||||||
else if ((item.CurrentPermissions & 8) != 0) // Slam!
|
|
||||||
{
|
|
||||||
part.EveryoneMask = item.EveryonePermissions;
|
part.EveryoneMask = item.EveryonePermissions;
|
||||||
part.NextOwnerMask = item.NextPermissions;
|
part.NextOwnerMask = item.NextPermissions;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
rootPart.TrimPermissions();
|
rootPart.TrimPermissions();
|
||||||
|
|
||||||
|
|
|
@ -4818,7 +4818,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
part.NextOwnerMask;
|
part.NextOwnerMask;
|
||||||
item.GroupPermissions = part.GroupMask &
|
item.GroupPermissions = part.GroupMask &
|
||||||
part.NextOwnerMask;
|
part.NextOwnerMask;
|
||||||
item.CurrentPermissions |= 8; // Slam!
|
item.CurrentPermissions |= 16; // Slam!
|
||||||
item.CreationDate = Util.UnixTimeSinceEpoch();
|
item.CreationDate = Util.UnixTimeSinceEpoch();
|
||||||
|
|
||||||
if (InventoryService.AddItem(item))
|
if (InventoryService.AddItem(item))
|
||||||
|
|
|
@ -170,13 +170,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
taskItem.GroupPermissions = item.GroupPermissions &
|
taskItem.GroupPermissions = item.GroupPermissions &
|
||||||
item.NextPermissions;
|
item.NextPermissions;
|
||||||
taskItem.NextPermissions = item.NextPermissions;
|
taskItem.NextPermissions = item.NextPermissions;
|
||||||
taskItem.CurrentPermissions |= 8;
|
// We're adding this to a prim we don't own. Force
|
||||||
|
// owner change
|
||||||
|
taskItem.CurrentPermissions |= 16; // Slam
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
taskItem.BasePermissions = item.BasePermissions;
|
taskItem.BasePermissions = item.BasePermissions;
|
||||||
taskItem.CurrentPermissions = item.CurrentPermissions;
|
taskItem.CurrentPermissions = item.CurrentPermissions;
|
||||||
taskItem.CurrentPermissions |= 8;
|
|
||||||
taskItem.EveryonePermissions = item.EveryOnePermissions;
|
taskItem.EveryonePermissions = item.EveryOnePermissions;
|
||||||
taskItem.GroupPermissions = item.GroupPermissions;
|
taskItem.GroupPermissions = item.GroupPermissions;
|
||||||
taskItem.NextPermissions = item.NextPermissions;
|
taskItem.NextPermissions = item.NextPermissions;
|
||||||
|
|
|
@ -1082,7 +1082,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
item.CurrentPermissions &= ~(uint)PermissionMask.Transfer;
|
item.CurrentPermissions &= ~(uint)PermissionMask.Transfer;
|
||||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
|
if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
|
||||||
item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
|
item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
|
||||||
item.CurrentPermissions |= 8;
|
|
||||||
}
|
}
|
||||||
item.OwnerChanged = true;
|
item.OwnerChanged = true;
|
||||||
item.CurrentPermissions &= item.NextPermissions;
|
item.CurrentPermissions &= item.NextPermissions;
|
||||||
|
|
|
@ -565,7 +565,29 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
CAPSULE_RADIUS = 0.01f;
|
CAPSULE_RADIUS = 0.01f;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(Shell != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
d.GeomDestroy(Shell);
|
||||||
|
}
|
||||||
|
catch (System.AccessViolationException)
|
||||||
|
{
|
||||||
|
m_log.Error("[PHYSICS]: PrimGeom dead");
|
||||||
|
}
|
||||||
|
// Remove any old entries
|
||||||
|
//string tShell;
|
||||||
|
//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
|
||||||
|
//Console.WriteLine("**** Remove {0}", tShell);
|
||||||
|
if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
|
||||||
|
if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
|
||||||
|
}
|
||||||
|
|
||||||
Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH);
|
Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH);
|
||||||
|
_parent_scene.geom_name_map[Shell] = m_name;
|
||||||
|
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
|
||||||
|
//Console.WriteLine("**** Create {2} Dicts: actor={0} name={1}", _parent_scene.actor_name_map.Count, _parent_scene.geom_name_map.Count, m_name);
|
||||||
|
|
||||||
d.GeomSetCategoryBits(Shell, (int)m_collisionCategories);
|
d.GeomSetCategoryBits(Shell, (int)m_collisionCategories);
|
||||||
d.GeomSetCollideBits(Shell, (int)m_collisionFlags);
|
d.GeomSetCollideBits(Shell, (int)m_collisionFlags);
|
||||||
|
@ -931,10 +953,23 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
Body = IntPtr.Zero;
|
Body = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Shell != IntPtr.Zero)
|
if(Shell != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
d.GeomDestroy(Shell);
|
d.GeomDestroy(Shell);
|
||||||
_parent_scene.geom_name_map.Remove(Shell);
|
}
|
||||||
|
catch (System.AccessViolationException)
|
||||||
|
{
|
||||||
|
m_log.Error("[PHYSICS]: PrimGeom dead");
|
||||||
|
}
|
||||||
|
// Remove any old entries
|
||||||
|
//string tShell;
|
||||||
|
//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
|
||||||
|
//Console.WriteLine("**** Remove {0}", tShell);
|
||||||
|
|
||||||
|
if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
|
||||||
|
if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
|
||||||
Shell = IntPtr.Zero;
|
Shell = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1098,10 +1133,23 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
Body = IntPtr.Zero;
|
Body = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Shell != IntPtr.Zero)
|
if(Shell != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
d.GeomDestroy(Shell);
|
d.GeomDestroy(Shell);
|
||||||
_parent_scene.geom_name_map.Remove(Shell);
|
}
|
||||||
|
catch (System.AccessViolationException)
|
||||||
|
{
|
||||||
|
m_log.Error("[PHYSICS]: PrimGeom dead");
|
||||||
|
}
|
||||||
|
// Remove any old entries
|
||||||
|
//string tShell;
|
||||||
|
//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
|
||||||
|
//Console.WriteLine("**** Remove {0}", tShell);
|
||||||
|
|
||||||
|
if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
|
||||||
|
if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
|
||||||
Shell = IntPtr.Zero;
|
Shell = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1277,9 +1325,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
+ (Amotor!=IntPtr.Zero ? "Amotor ":""));
|
+ (Amotor!=IntPtr.Zero ? "Amotor ":""));
|
||||||
}
|
}
|
||||||
AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z, m_tensor);
|
AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z, m_tensor);
|
||||||
|
|
||||||
_parent_scene.geom_name_map[Shell] = m_name;
|
|
||||||
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
|
|
||||||
_parent_scene.AddCharacter(this);
|
_parent_scene.AddCharacter(this);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1299,17 +1344,28 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
//kill the body
|
//kill the body
|
||||||
d.BodyDestroy(Body);
|
d.BodyDestroy(Body);
|
||||||
|
|
||||||
Body = IntPtr.Zero;
|
Body = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Shell != IntPtr.Zero)
|
if(Shell != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
d.GeomDestroy(Shell);
|
d.GeomDestroy(Shell);
|
||||||
_parent_scene.geom_name_map.Remove(Shell);
|
}
|
||||||
|
catch (System.AccessViolationException)
|
||||||
|
{
|
||||||
|
m_log.Error("[PHYSICS]: PrimGeom dead");
|
||||||
|
}
|
||||||
|
// Remove any old entries
|
||||||
|
//string tShell;
|
||||||
|
//_parent_scene.geom_name_map.TryGetValue(Shell, out tShell);
|
||||||
|
//Console.WriteLine("**** Remove {0}", tShell);
|
||||||
|
|
||||||
|
if(_parent_scene.geom_name_map.ContainsKey(Shell)) _parent_scene.geom_name_map.Remove(Shell);
|
||||||
|
if(_parent_scene.actor_name_map.ContainsKey(Shell)) _parent_scene.actor_name_map.Remove(Shell);
|
||||||
Shell = IntPtr.Zero;
|
Shell = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_isPhysical = m_tainted_isPhysical;
|
m_isPhysical = m_tainted_isPhysical;
|
||||||
|
@ -1327,13 +1383,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH;
|
CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH;
|
||||||
//m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
|
//m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
|
||||||
d.BodyDestroy(Body);
|
d.BodyDestroy(Body);
|
||||||
d.GeomDestroy(Shell);
|
|
||||||
AvatarGeomAndBodyCreation(_position.X, _position.Y,
|
AvatarGeomAndBodyCreation(_position.X, _position.Y,
|
||||||
_position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor);
|
_position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor);
|
||||||
Velocity = Vector3.Zero;
|
Velocity = Vector3.Zero;
|
||||||
|
|
||||||
_parent_scene.geom_name_map[Shell] = m_name;
|
|
||||||
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -142,7 +142,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
private OdeScene _parent_scene;
|
private OdeScene _parent_scene;
|
||||||
public IntPtr m_targetSpace = IntPtr.Zero;
|
public IntPtr m_targetSpace = IntPtr.Zero;
|
||||||
public IntPtr prim_geom;
|
public IntPtr prim_geom;
|
||||||
public IntPtr prev_geom;
|
// public IntPtr prev_geom;
|
||||||
public IntPtr _triMeshData;
|
public IntPtr _triMeshData;
|
||||||
|
|
||||||
private IntPtr _linkJointGroup = IntPtr.Zero;
|
private IntPtr _linkJointGroup = IntPtr.Zero;
|
||||||
|
@ -274,7 +274,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
|
|
||||||
prim_geom = IntPtr.Zero;
|
prim_geom = IntPtr.Zero;
|
||||||
prev_geom = IntPtr.Zero;
|
// prev_geom = IntPtr.Zero;
|
||||||
|
|
||||||
if (!pos.IsFinite())
|
if (!pos.IsFinite())
|
||||||
{
|
{
|
||||||
|
@ -776,13 +776,26 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public void SetGeom(IntPtr geom)
|
public void SetGeom(IntPtr geom)
|
||||||
{
|
{
|
||||||
prev_geom = prim_geom;
|
if(prim_geom != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
// Remove any old entries
|
||||||
|
//string tPA;
|
||||||
|
//_parent_scene.geom_name_map.TryGetValue(prim_geom, out tPA);
|
||||||
|
//Console.WriteLine("**** Remove {0}", tPA);
|
||||||
|
if(_parent_scene.geom_name_map.ContainsKey(prim_geom)) _parent_scene.geom_name_map.Remove(prim_geom);
|
||||||
|
if(_parent_scene.actor_name_map.ContainsKey(prim_geom)) _parent_scene.actor_name_map.Remove(prim_geom);
|
||||||
|
d.GeomDestroy(prim_geom);
|
||||||
|
}
|
||||||
|
|
||||||
prim_geom = geom;
|
prim_geom = geom;
|
||||||
//Console.WriteLine("SetGeom to " + prim_geom + " for " + m_primName);
|
//Console.WriteLine("SetGeom to " + prim_geom + " for " + m_primName);
|
||||||
if (prim_geom != IntPtr.Zero)
|
if (prim_geom != IntPtr.Zero)
|
||||||
{
|
{
|
||||||
|
_parent_scene.geom_name_map[prim_geom] = this.m_primName;
|
||||||
|
_parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this;
|
||||||
d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
|
d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
|
||||||
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
|
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
|
||||||
|
//Console.WriteLine("**** Create {2} Dicts: actor={0} name={1}", _parent_scene.actor_name_map.Count, _parent_scene.geom_name_map.Count, this.m_primName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (childPrim)
|
if (childPrim)
|
||||||
|
@ -1774,17 +1787,17 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh)
|
public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh)
|
||||||
{
|
{
|
||||||
//Console.WriteLine("CreateGeom:");
|
//Console.WriteLine("CreateGeom:");
|
||||||
if (_mesh != null)
|
if (_mesh != null) // Special - make mesh
|
||||||
{
|
{
|
||||||
setMesh(_parent_scene, _mesh);
|
setMesh(_parent_scene, _mesh);
|
||||||
}
|
}
|
||||||
else
|
else // not a mesh
|
||||||
{
|
{
|
||||||
if (_pbs.ProfileShape == ProfileShape.HalfCircle && _pbs.PathCurve == (byte)Extrusion.Curve1)
|
if (_pbs.ProfileShape == ProfileShape.HalfCircle && _pbs.PathCurve == (byte)Extrusion.Curve1) // special profile??
|
||||||
{
|
{
|
||||||
if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z)
|
if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z) // Equi-size
|
||||||
{
|
{
|
||||||
if (((_size.X / 2f) > 0f))
|
if (((_size.X / 2f) > 0f)) // Has size
|
||||||
{
|
{
|
||||||
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
||||||
try
|
try
|
||||||
|
@ -1815,7 +1828,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else // not equi-size
|
||||||
{
|
{
|
||||||
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
||||||
try
|
try
|
||||||
|
@ -1832,7 +1845,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else // not special profile
|
||||||
{
|
{
|
||||||
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
||||||
try
|
try
|
||||||
|
@ -1894,9 +1907,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_parent_scene.geom_name_map[prim_geom] = this.m_primName;
|
|
||||||
_parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this;
|
|
||||||
|
|
||||||
changeSelectedStatus(timestep);
|
changeSelectedStatus(timestep);
|
||||||
|
|
||||||
m_taintadd = false;
|
m_taintadd = false;
|
||||||
|
@ -2045,22 +2055,7 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
{
|
{
|
||||||
if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim)
|
if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
if (prim_geom != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
d.GeomDestroy(prim_geom);
|
|
||||||
prim_geom = IntPtr.Zero;
|
|
||||||
_mesh = null;
|
_mesh = null;
|
||||||
}
|
|
||||||
catch (System.AccessViolationException)
|
|
||||||
{
|
|
||||||
prim_geom = IntPtr.Zero;
|
|
||||||
m_log.Error("[PHYSICS]: PrimGeom dead");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//Console.WriteLine("changePhysicsStatus for " + m_primName );
|
//Console.WriteLine("changePhysicsStatus for " + m_primName );
|
||||||
changeadd(2f);
|
changeadd(2f);
|
||||||
}
|
}
|
||||||
|
@ -2120,8 +2115,6 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
||||||
d.SpaceRemove(m_targetSpace, prim_geom);
|
d.SpaceRemove(m_targetSpace, prim_geom);
|
||||||
}
|
}
|
||||||
d.GeomDestroy(prim_geom);
|
|
||||||
prim_geom = IntPtr.Zero;
|
|
||||||
// we don't need to do space calculation because the client sends a position update also.
|
// we don't need to do space calculation because the client sends a position update also.
|
||||||
|
|
||||||
// Construction of new prim
|
// Construction of new prim
|
||||||
|
@ -2223,16 +2216,8 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
disableBody();
|
disableBody();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try
|
|
||||||
{
|
|
||||||
d.GeomDestroy(prim_geom);
|
|
||||||
}
|
|
||||||
catch (System.AccessViolationException)
|
|
||||||
{
|
|
||||||
prim_geom = IntPtr.Zero;
|
|
||||||
m_log.Error("[PHYSICS]: PrimGeom dead");
|
|
||||||
}
|
|
||||||
prim_geom = IntPtr.Zero;
|
|
||||||
// we don't need to do space calculation because the client sends a position update also.
|
// we don't need to do space calculation because the client sends a position update also.
|
||||||
if (_size.X <= 0) _size.X = 0.01f;
|
if (_size.X <= 0) _size.X = 0.01f;
|
||||||
if (_size.Y <= 0) _size.Y = 0.01f;
|
if (_size.Y <= 0) _size.Y = 0.01f;
|
||||||
|
|
|
@ -2206,6 +2206,12 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
if (prim.prim_geom != IntPtr.Zero)
|
if (prim.prim_geom != IntPtr.Zero)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//string tPA;
|
||||||
|
//geom_name_map.TryGetValue(prim.prim_geom, out tPA);
|
||||||
|
//Console.WriteLine("**** Remove {0}", tPA);
|
||||||
|
if(geom_name_map.ContainsKey(prim.prim_geom)) geom_name_map.Remove(prim.prim_geom);
|
||||||
|
if(actor_name_map.ContainsKey(prim.prim_geom)) actor_name_map.Remove(prim.prim_geom);
|
||||||
d.GeomDestroy(prim.prim_geom);
|
d.GeomDestroy(prim.prim_geom);
|
||||||
prim.prim_geom = IntPtr.Zero;
|
prim.prim_geom = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue