Merge branch 'careminster-presence-refactor' of ssh://3dhosting.de/var/git/careminster into careminster-presence-refactor

avinationmerge
Melanie Thielker 2010-08-08 02:04:37 +02:00
commit d2b3d45d76
4 changed files with 636 additions and 617 deletions

View File

@ -318,7 +318,7 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_scriptListens_atRotTarget = false; private bool m_scriptListens_atRotTarget = false;
private bool m_scriptListens_notAtRotTarget = false; private bool m_scriptListens_notAtRotTarget = false;
public bool m_dupeInProgress = false;
internal Dictionary<UUID, string> m_savedScriptState = null; internal Dictionary<UUID, string> m_savedScriptState = null;
#region Properties #region Properties
@ -476,15 +476,20 @@ namespace OpenSim.Region.Framework.Scenes
part.IgnoreUndoUpdate = false; part.IgnoreUndoUpdate = false;
part.StoreUndoState(UndoType.STATE_GROUP_POSITION); part.StoreUndoState(UndoType.STATE_GROUP_POSITION);
part.GroupPosition = val; part.GroupPosition = val;
part.TriggerScriptChangedEvent(Changed.POSITION); if (!m_dupeInProgress)
{
part.TriggerScriptChangedEvent(Changed.POSITION);
}
} }
if (!m_dupeInProgress)
foreach (ScenePresence av in m_linkedAvatars)
{ {
Vector3 offset = m_parts[av.LinkedPrim].GetWorldPosition() - av.ParentPosition; foreach (ScenePresence av in m_linkedAvatars)
av.AbsolutePosition += offset; {
av.ParentPosition = m_parts[av.LinkedPrim].GetWorldPosition(); //ParentPosition gets cleared by AbsolutePosition Vector3 offset = m_parts[av.LinkedPrim].GetWorldPosition() - av.ParentPosition;
av.SendFullUpdateToAllClients(); av.AbsolutePosition += offset;
av.ParentPosition = m_parts[av.LinkedPrim].GetWorldPosition(); //ParentPosition gets cleared by AbsolutePosition
av.SendFullUpdateToAllClients();
}
} }
//if (m_rootPart.PhysActor != null) //if (m_rootPart.PhysActor != null)
@ -1801,87 +1806,95 @@ namespace OpenSim.Region.Framework.Scenes
/// <returns></returns> /// <returns></returns>
public SceneObjectGroup Copy(bool userExposed) public SceneObjectGroup Copy(bool userExposed)
{ {
SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone(); SceneObjectGroup dupe;
dupe.m_isBackedUp = false; try
dupe.m_parts = new Dictionary<UUID, SceneObjectPart>();
// Warning, The following code related to previousAttachmentStatus is needed so that clones of
// attachments do not bordercross while they're being duplicated. This is hacktastic!
// Normally, setting AbsolutePosition will bordercross a prim if it's outside the region!
// unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state
// (which should be false anyway) set it as an Attachment and then set it's Absolute Position,
// then restore it's attachment state
// This is only necessary when userExposed is false!
bool previousAttachmentStatus = dupe.RootPart.IsAttachment;
if (!userExposed)
dupe.RootPart.IsAttachment = true;
dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
if (!userExposed)
{ {
dupe.RootPart.IsAttachment = previousAttachmentStatus; m_dupeInProgress = true;
} dupe = (SceneObjectGroup)MemberwiseClone();
dupe.m_isBackedUp = false;
dupe.m_parts = new Dictionary<UUID, SceneObjectPart>();
dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed); // Warning, The following code related to previousAttachmentStatus is needed so that clones of
dupe.m_rootPart.LinkNum = m_rootPart.LinkNum; // attachments do not bordercross while they're being duplicated. This is hacktastic!
// Normally, setting AbsolutePosition will bordercross a prim if it's outside the region!
// unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state
// (which should be false anyway) set it as an Attachment and then set it's Absolute Position,
// then restore it's attachment state
if (userExposed) // This is only necessary when userExposed is false!
dupe.m_rootPart.TrimPermissions();
/// may need to create a new Physics actor. bool previousAttachmentStatus = dupe.RootPart.IsAttachment;
if (dupe.RootPart.PhysActor != null && userExposed)
{
PrimitiveBaseShape pbs = dupe.RootPart.Shape;
dupe.RootPart.PhysActor = m_scene.PhysicsScene.AddPrimShape( if (!userExposed)
dupe.RootPart.Name, dupe.RootPart.IsAttachment = true;
pbs,
dupe.RootPart.AbsolutePosition,
dupe.RootPart.Scale,
dupe.RootPart.RotationOffset,
dupe.RootPart.PhysActor.IsPhysical);
dupe.RootPart.PhysActor.LocalID = dupe.RootPart.LocalId; dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
}
List<SceneObjectPart> partList; if (!userExposed)
lockPartsForRead(true);
partList = new List<SceneObjectPart>(m_parts.Values);
lockPartsForRead(false);
partList.Sort(delegate(SceneObjectPart p1, SceneObjectPart p2)
{ {
return p1.LinkNum.CompareTo(p2.LinkNum); dupe.RootPart.IsAttachment = previousAttachmentStatus;
} }
);
foreach (SceneObjectPart part in partList) dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
{ dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
if (part.UUID != m_rootPart.UUID)
if (userExposed)
dupe.m_rootPart.TrimPermissions();
/// may need to create a new Physics actor.
if (dupe.RootPart.PhysActor != null && userExposed)
{ {
SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed); PrimitiveBaseShape pbs = dupe.RootPart.Shape;
newPart.LinkNum = part.LinkNum; dupe.RootPart.PhysActor = m_scene.PhysicsScene.AddPrimShape(
dupe.RootPart.Name,
pbs,
dupe.RootPart.AbsolutePosition,
dupe.RootPart.Scale,
dupe.RootPart.RotationOffset,
dupe.RootPart.PhysActor.IsPhysical);
dupe.RootPart.PhysActor.LocalID = dupe.RootPart.LocalId;
dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
}
List<SceneObjectPart> partList;
lockPartsForRead(true);
partList = new List<SceneObjectPart>(m_parts.Values);
lockPartsForRead(false);
partList.Sort(delegate(SceneObjectPart p1, SceneObjectPart p2)
{
return p1.LinkNum.CompareTo(p2.LinkNum);
}
);
foreach (SceneObjectPart part in partList)
{
if (part.UUID != m_rootPart.UUID)
{
SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
newPart.LinkNum = part.LinkNum;
}
}
if (userExposed)
{
dupe.UpdateParentIDs();
dupe.HasGroupChanged = true;
dupe.AttachToBackup();
ScheduleGroupForFullUpdate();
} }
} }
finally
if (userExposed)
{ {
dupe.UpdateParentIDs(); m_dupeInProgress = false;
dupe.HasGroupChanged = true;
dupe.AttachToBackup();
ScheduleGroupForFullUpdate();
} }
return dupe; return dupe;
} }

View File

@ -720,14 +720,17 @@ namespace OpenSim.Region.Framework.Scenes
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
} }
List<ScenePresence> avs = ParentGroup.GetLinkedAvatars(); if (!m_parentGroup.m_dupeInProgress)
foreach (ScenePresence av in avs)
{ {
if (av.LinkedPrim == m_uuid) List<ScenePresence> avs = ParentGroup.GetLinkedAvatars();
foreach (ScenePresence av in avs)
{ {
Vector3 offset = (m_offsetPosition - oldpos); if (av.LinkedPrim == m_uuid)
av.OffsetPosition += offset; {
av.SendFullUpdateToAllClients(); Vector3 offset = (m_offsetPosition - oldpos);
av.OffsetPosition += offset;
av.SendFullUpdateToAllClients();
}
} }
} }
} }

View File

@ -2007,7 +2007,7 @@ namespace OpenSim.Region.Framework.Scenes
if (autopilot) if (autopilot)
{ // its not a scripted sit { // its not a scripted sit
// if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5) // if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5)
if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 10.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 10.0f) ) if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 256.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 256.0f) )
{ {
autopilot = false; // close enough autopilot = false; // close enough
m_lastWorldPosition = m_pos; /* CW - This give us a position to return the avatar to if the part is killed before standup. m_lastWorldPosition = m_pos; /* CW - This give us a position to return the avatar to if the part is killed before standup.
@ -2053,9 +2053,13 @@ namespace OpenSim.Region.Framework.Scenes
//Console.WriteLine("Camera Eye ={0}", cameraEyeOffset); //Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
//NOTE: SendSitResponse should be relative to the GROUP *NOT* THE PRIM if we're sitting on a child //NOTE: SendSitResponse should be relative to the GROUP *NOT* THE PRIM if we're sitting on a child
ControllingClient.SendSitResponse(part.ParentGroup.UUID, ((offset * part.RotationOffset) + part.OffsetPosition), sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook); Quaternion roffset = Quaternion.Identity;
if (SitTargetisSet)
{
roffset = part.RotationOffset;
}
ControllingClient.SendSitResponse(part.ParentGroup.UUID, ((offset * roffset) + part.OffsetPosition), sitOrientation / part.RotationOffset, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
// This calls HandleAgentSit twice, once from here, and the client calls // This calls HandleAgentSit twice, once from here, and the client calls
// HandleAgentSit itself after it gets to the location // HandleAgentSit itself after it gets to the location
// It doesn't get to the location until we've moved them there though // It doesn't get to the location until we've moved them there though
@ -2375,7 +2379,6 @@ namespace OpenSim.Region.Framework.Scenes
m_parentPosition = part.AbsolutePosition; m_parentPosition = part.AbsolutePosition;
part.IsOccupied = true; part.IsOccupied = true;
part.ParentGroup.AddAvatar(agentID); part.ParentGroup.AddAvatar(agentID);
Console.WriteLine("Scripted Sit ofset {0}", m_pos);
} }
else else
{ {
@ -2441,7 +2444,7 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
} }
m_linkedPrim = part.UUID; m_linkedPrim = part.UUID;
m_offsetRotation = m_offsetRotation / part.RotationOffset;
Velocity = Vector3.Zero; Velocity = Vector3.Zero;
RemoveFromPhysicalScene(); RemoveFromPhysicalScene();
Animator.TrySetMovementAnimation(sitAnimation); Animator.TrySetMovementAnimation(sitAnimation);

View File

@ -250,7 +250,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (toadd.Length > 0) if (toadd.Length > 0)
{ {
values.Add(rule); values.Add(new LSL_Integer(rule));
values.Add(toadd.Data[0]); values.Add(toadd.Data[0]);
} }
idx++; idx++;