Merge branch 'master' of /home/opensim/var/repo/opensim
commit
466d3793b1
|
@ -135,6 +135,21 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
get { return ParentGroup.RootPart == this; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Is an explicit sit target set for this part?
|
||||
/// </summary>
|
||||
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
|
|||
/// <param name='avatarId'></param>
|
||||
protected internal bool AddSittingAvatar(UUID avatarId)
|
||||
{
|
||||
if (IsSitTargetSet && SitTargetAvatar == UUID.Zero)
|
||||
SitTargetAvatar = avatarId;
|
||||
|
||||
HashSet<UUID> sittingAvatars = m_sittingAvatars;
|
||||
|
||||
if (sittingAvatars == null)
|
||||
|
@ -4532,6 +4550,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <param name='avatarId'></param>
|
||||
protected internal bool RemoveSittingAvatar(UUID avatarId)
|
||||
{
|
||||
if (SitTargetAvatar == avatarId)
|
||||
SitTargetAvatar = UUID.Zero;
|
||||
|
||||
HashSet<UUID> sittingAvatars = m_sittingAvatars;
|
||||
|
||||
// This can occur under a race condition where another thread
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue