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.
parent
0a004f8c44
commit
a636af13e7
|
@ -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)
|
||||||
//{
|
//{
|
||||||
|
|
|
@ -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,11 +716,16 @@ 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)
|
||||||
{
|
{
|
||||||
|
if (av.LinkedPrim == m_uuid)
|
||||||
|
{
|
||||||
|
Vector3 offset = (m_offsetPosition - oldpos);
|
||||||
|
av.OffsetPosition += offset;
|
||||||
av.SendFullUpdateToAllClients();
|
av.SendFullUpdateToAllClients();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Vector3 RelativePosition
|
public Vector3 RelativePosition
|
||||||
{
|
{
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue