diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 6677daeb30..b3f11a756e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -135,6 +135,21 @@ namespace OpenSim.Region.Framework.Scenes
get { return ParentGroup.RootPart == this; }
}
+ ///
+ /// Is an explicit sit target set for this part?
+ ///
+ public bool IsSitTargetSet
+ {
+ get
+ {
+ return
+ !(SitTargetPosition == Vector3.Zero
+ && (SitTargetOrientation == Quaternion.Identity // Valid Zero Rotation quaternion
+ || SitTargetOrientation.X == 0f && SitTargetOrientation.Y == 0f && SitTargetOrientation.Z == 1f && SitTargetOrientation.W == 0f // W-Z Mapping was invalid at one point
+ || SitTargetOrientation.X == 0f && SitTargetOrientation.Y == 0f && SitTargetOrientation.Z == 0f && SitTargetOrientation.W == 0f)); // Invalid Quaternion
+ }
+ }
+
#region Fields
public bool AllowedDrop;
@@ -4510,6 +4525,9 @@ namespace OpenSim.Region.Framework.Scenes
///
protected internal bool AddSittingAvatar(UUID avatarId)
{
+ if (IsSitTargetSet && SitTargetAvatar == UUID.Zero)
+ SitTargetAvatar = avatarId;
+
HashSet sittingAvatars = m_sittingAvatars;
if (sittingAvatars == null)
@@ -4532,6 +4550,9 @@ namespace OpenSim.Region.Framework.Scenes
///
protected internal bool RemoveSittingAvatar(UUID avatarId)
{
+ if (SitTargetAvatar == avatarId)
+ SitTargetAvatar = UUID.Zero;
+
HashSet sittingAvatars = m_sittingAvatars;
// This can occur under a race condition where another thread
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index c71bae9bc1..0e7f2e5dd6 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1799,10 +1799,6 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- // Reset sit target.
- if (part.SitTargetAvatar == UUID)
- part.SitTargetAvatar = UUID.Zero;
-
ParentPosition = part.GetWorldPosition();
ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
@@ -1846,15 +1842,7 @@ namespace OpenSim.Region.Framework.Scenes
//look for prims with explicit sit targets that are available
foreach (SceneObjectPart part in partArray)
{
- // Is a sit target available?
- Vector3 avSitOffset = part.SitTargetPosition;
- Quaternion avSitOrientation = part.SitTargetOrientation;
- UUID avOnTargetAlready = part.SitTargetAvatar;
-
- bool SitTargetUnOccupied = avOnTargetAlready == UUID.Zero;
- bool SitTargetisSet = avSitOffset != Vector3.Zero || avSitOrientation != Quaternion.Identity;
-
- if (SitTargetisSet && SitTargetUnOccupied)
+ if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero)
{
//switch the target to this prim
return part;
@@ -1865,10 +1853,8 @@ namespace OpenSim.Region.Framework.Scenes
return targetPart;
}
- private void SendSitResponse(UUID targetID, Vector3 offset, Quaternion pSitOrientation)
+ private void SendSitResponse(UUID targetID, Vector3 offset, Quaternion sitOrientation)
{
- Vector3 pos = new Vector3();
- Quaternion sitOrientation = pSitOrientation;
Vector3 cameraEyeOffset = Vector3.Zero;
Vector3 cameraAtOffset = Vector3.Zero;
bool forceMouselook = false;
@@ -1880,42 +1866,21 @@ namespace OpenSim.Region.Framework.Scenes
// TODO: determine position to sit at based on scene geometry; don't trust offset from client
// see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it
- // Is a sit target available?
- Vector3 avSitOffSet = part.SitTargetPosition;
- Quaternion avSitOrientation = part.SitTargetOrientation;
- UUID avOnTargetAlready = part.SitTargetAvatar;
-
- bool SitTargetUnOccupied = (!(avOnTargetAlready != UUID.Zero));
- bool SitTargetisSet =
- (!(avSitOffSet == Vector3.Zero &&
- (
- avSitOrientation == Quaternion.Identity // Valid Zero Rotation quaternion
- || avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 1f && avSitOrientation.W == 0f // W-Z Mapping was invalid at one point
- || avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 0f && avSitOrientation.W == 0f // Invalid Quaternion
- )
- ));
-
-// m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied);
-
if (PhysicsActor != null)
m_sitAvatarHeight = PhysicsActor.Size.Z;
bool canSit = false;
- pos = part.AbsolutePosition + offset;
+ Vector3 pos = part.AbsolutePosition + offset;
- if (SitTargetisSet)
+ if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero)
{
- if (SitTargetUnOccupied)
- {
// m_log.DebugFormat(
// "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is set and unoccupied",
// Name, part.Name, part.LocalId);
- part.SitTargetAvatar = UUID;
- offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z);
- sitOrientation = avSitOrientation;
- canSit = true;
- }
+ offset = part.SitTargetPosition;
+ sitOrientation = part.SitTargetOrientation;
+ canSit = true;
}
else
{