A try to better attachment crossing.
parent
7823ca5c8b
commit
287c724b55
|
@ -2414,6 +2414,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
|
||||
if (AttachPoint > 30 && ownerID != AgentId) // Someone else's HUD
|
||||
return;
|
||||
if (parentID == 0)
|
||||
return;
|
||||
|
||||
if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0)
|
||||
rotation = Quaternion.Identity;
|
||||
|
|
|
@ -2145,86 +2145,95 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
{
|
||||
SceneObjectGroup sceneObject = m_serialiser.DeserializeGroupFromXml2(objXMLData);
|
||||
|
||||
// If the user is banned, we won't let any of their objects
|
||||
// enter. Period.
|
||||
//
|
||||
if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID))
|
||||
{
|
||||
m_log.Info("[INTERREGION]: Denied prim crossing for "+
|
||||
"banned avatar");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Force allocation of new LocalId
|
||||
//
|
||||
foreach (SceneObjectPart p in sceneObject.Children.Values)
|
||||
p.LocalId = 0;
|
||||
|
||||
AddRestoredSceneObject(sceneObject, true, false);
|
||||
if (sceneObject.RootPart.Shape.PCode == (byte)PCode.Prim)
|
||||
{
|
||||
if(sceneObject.RootPart.Shape.State != 0)
|
||||
{
|
||||
// Fix up attachment Parent Local ID
|
||||
//
|
||||
ScenePresence sp = GetScenePresence(sceneObject.OwnerID);
|
||||
|
||||
uint parentLocalID = 0;
|
||||
if (sp != null)
|
||||
parentLocalID = sp.LocalId;
|
||||
|
||||
sceneObject.RootPart.SetParentLocalId(parentLocalID);
|
||||
|
||||
AddRestoredSceneObject(sceneObject, false, false);
|
||||
|
||||
// Handle attachment special case
|
||||
//
|
||||
SceneObjectPart RootPrim = GetSceneObjectPart(primID);
|
||||
|
||||
RootPrim.SetParentLocalId(parentLocalID);
|
||||
|
||||
if (RootPrim != null)
|
||||
{
|
||||
if (m_regInfo.EstateSettings.IsBanned(RootPrim.OwnerID))
|
||||
{
|
||||
SceneObjectGroup grp = RootPrim.ParentGroup;
|
||||
if (grp != null)
|
||||
DeleteSceneObject(grp, false);
|
||||
|
||||
m_log.Info("[INTERREGION]: Denied prim crossing for banned avatar");
|
||||
|
||||
return false;
|
||||
}
|
||||
if (RootPrim.Shape.PCode == (byte)PCode.Prim)
|
||||
{
|
||||
SceneObjectGroup grp = RootPrim.ParentGroup;
|
||||
if((RootPrim.Shape.State == 0) &&
|
||||
(!Permissions.CanObjectEntry(RootPrim.UUID,
|
||||
true, RootPrim.AbsolutePosition)))
|
||||
{
|
||||
if (grp != null)
|
||||
{
|
||||
DeleteSceneObject(grp, false);
|
||||
}
|
||||
m_log.DebugFormat("[ATTACHMENT]: Received "+
|
||||
"attachment {0}, inworld asset id {1}",
|
||||
grp.RootPart.LastOwnerID.ToString(),
|
||||
grp.UUID.ToString());
|
||||
|
||||
m_log.Info("[INTERREGION]: Denied prim crossing because of parcel settings");
|
||||
|
||||
return false;
|
||||
}
|
||||
if (grp != null)
|
||||
{
|
||||
if (RootPrim.Shape.State != 0)
|
||||
{
|
||||
// Never persist
|
||||
|
||||
m_log.DebugFormat("[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.RootPart.LastOwnerID.ToString(), grp.UUID.ToString());
|
||||
|
||||
grp.DetachFromBackup();
|
||||
|
||||
// Attachment
|
||||
ScenePresence sp = GetScenePresence(grp.OwnerID);
|
||||
if (sp != null)
|
||||
{
|
||||
// hack assetID until we get assetID into the XML format.
|
||||
// LastOwnerID is used for group deeding, so when you do stuff
|
||||
// with the deeded object, it goes back to them
|
||||
|
||||
grp.SetFromAssetID(grp.RootPart.LastOwnerID);
|
||||
m_log.DebugFormat("[ATTACHMENT]: Attach to avatar {0}", sp.UUID.ToString());
|
||||
AttachObject(sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false);
|
||||
m_log.DebugFormat("[ATTACHMENT]: Attach "+
|
||||
"to avatar {0}",
|
||||
sp.UUID.ToString());
|
||||
AttachObject(sp.ControllingClient,
|
||||
grp.LocalId, (uint)0,
|
||||
grp.GroupRotation,
|
||||
grp.AbsolutePosition, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Remove, then add, to ensure the expire
|
||||
// time is refreshed. Wouldn't do to
|
||||
// have it poof before the avatar gets
|
||||
// there.
|
||||
//
|
||||
RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
|
||||
RootPrim.AddFlag(PrimFlags.TemporaryOnRez);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!Permissions.CanObjectEntry(sceneObject.UUID,
|
||||
true, sceneObject.AbsolutePosition))
|
||||
{
|
||||
// Deny non attachments based on parcel settings
|
||||
//
|
||||
m_log.Info("[INTERREGION]: Denied prim crossing "+
|
||||
"because of parcel settings");
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
AddRestoredSceneObject(sceneObject, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Add/Remove Avatar Methods
|
||||
|
|
|
@ -592,6 +592,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
m_scene = scene;
|
||||
RegionHandle = m_scene.RegionInfo.RegionHandle;
|
||||
|
||||
if (m_rootPart.Shape.PCode != 9 || m_rootPart.Shape.State == 0)
|
||||
m_rootPart.ParentID = 0;
|
||||
if (m_rootPart.LocalId==0)
|
||||
m_rootPart.LocalId = m_scene.AllocateLocalId();
|
||||
|
@ -921,9 +922,10 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
public void SetRootPart(SceneObjectPart part)
|
||||
{
|
||||
part.SetParent(this);
|
||||
m_rootPart = part;
|
||||
if (!IsAttachment)
|
||||
part.ParentID = 0;
|
||||
part.LinkNum = 0;
|
||||
m_rootPart = part;
|
||||
|
||||
// No locking required since the SOG should not be in the scene yet - one can't change root parts after
|
||||
// the scene object has been attached to the scene
|
||||
|
|
Loading…
Reference in New Issue