Make sure the avatar position gets moved along with a prim it is sitting on. This fixes mantis #208 and (maybe) issues with chat and sound coming from the wrong place when sat on a vehicle.

avinationmerge
Tom 2010-08-06 06:37:40 -07:00
parent 0a004f8c44
commit a636af13e7
3 changed files with 32 additions and 16 deletions

View File

@ -469,13 +469,22 @@ namespace OpenSim.Region.Framework.Scenes
return; return;
} }
} }
foreach (SceneObjectPart part in m_parts.Values) List<SceneObjectPart> parts = new List<SceneObjectPart>(m_parts.Values);
lockPartsForRead(false);
foreach (SceneObjectPart part in parts)
{ {
part.IgnoreUndoUpdate = false; part.IgnoreUndoUpdate = false;
part.StoreUndoState(UndoType.STATE_GROUP_POSITION); part.StoreUndoState(UndoType.STATE_GROUP_POSITION);
part.GroupPosition = val; part.GroupPosition = val;
} }
lockPartsForRead(false);
foreach (ScenePresence av in m_linkedAvatars)
{
Vector3 offset = m_parts[av.LinkedPrim].GetWorldPosition() - av.ParentPosition;
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)
//{ //{

View File

@ -682,25 +682,13 @@ namespace OpenSim.Region.Framework.Scenes
// Tell the physics engines that this prim changed. // Tell the physics engines that this prim changed.
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
} }
catch (Exception e) catch (Exception e)
{ {
m_log.Error("[SCENEOBJECTPART]: GROUP POSITION. " + e.Message); m_log.Error("[SCENEOBJECTPART]: GROUP POSITION. " + e.Message);
} }
} }
// TODO if we decide to do sitting in a more SL compatible way (multiple avatars per prim), this has to be fixed, too
if (m_sitTargetAvatar != UUID.Zero)
{
if (m_parentGroup != null) // TODO can there be a SOP without a SOG?
{
ScenePresence avatar;
if (m_parentGroup.Scene.TryGetScenePresence(m_sitTargetAvatar, out avatar))
{
avatar.ParentPosition = GetWorldPosition();
}
}
}
} }
} }
@ -709,6 +697,7 @@ namespace OpenSim.Region.Framework.Scenes
get { return m_offsetPosition; } get { return m_offsetPosition; }
set set
{ {
Vector3 oldpos = m_offsetPosition;
StoreUndoState(UndoType.STATE_PRIM_POSITION); StoreUndoState(UndoType.STATE_PRIM_POSITION);
m_offsetPosition = value; m_offsetPosition = value;
@ -727,7 +716,12 @@ namespace OpenSim.Region.Framework.Scenes
List<ScenePresence> avs = ParentGroup.GetLinkedAvatars(); List<ScenePresence> avs = ParentGroup.GetLinkedAvatars();
foreach (ScenePresence av in avs) foreach (ScenePresence av in avs)
{ {
av.SendFullUpdateToAllClients(); if (av.LinkedPrim == m_uuid)
{
Vector3 offset = (m_offsetPosition - oldpos);
av.OffsetPosition += offset;
av.SendFullUpdateToAllClients();
}
} }
} }
} }

View File

@ -595,11 +595,21 @@ namespace OpenSim.Region.Framework.Scenes
private uint m_parentID; private uint m_parentID;
private UUID m_linkedPrim;
public uint ParentID public uint ParentID
{ {
get { return m_parentID; } get { return m_parentID; }
set { m_parentID = value; } set { m_parentID = value; }
} }
public UUID LinkedPrim
{
get { return m_linkedPrim; }
set { m_linkedPrim = value; }
}
public float Health public float Health
{ {
get { return m_health; } get { return m_health; }
@ -1835,6 +1845,7 @@ namespace OpenSim.Region.Framework.Scenes
m_parentPosition = Vector3.Zero; m_parentPosition = Vector3.Zero;
m_parentID = 0; m_parentID = 0;
m_linkedPrim = UUID.Zero;
m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f); m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
SendFullUpdateToAllClients(); SendFullUpdateToAllClients();
m_requestedSitTargetID = 0; m_requestedSitTargetID = 0;
@ -2422,6 +2433,8 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
m_parentID = m_requestedSitTargetID; m_parentID = m_requestedSitTargetID;
} }
m_linkedPrim = part.UUID;
Velocity = Vector3.Zero; Velocity = Vector3.Zero;
RemoveFromPhysicalScene(); RemoveFromPhysicalScene();