diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 7afd78c5d2..d9446e3f22 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -26,18 +26,14 @@
*/
using System;
-using System.Xml;
using System.Collections.Generic;
using System.Reflection;
using System.Threading;
-using System.Timers;
-using Timer = System.Timers.Timer;
using OpenMetaverse;
using log4net;
using Nini.Config;
using OpenSim.Framework;
using OpenSim.Framework.Client;
-using OpenSim.Framework.Monitoring;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes.Animation;
using OpenSim.Region.Framework.Scenes.Types;
@@ -353,7 +349,6 @@ namespace OpenSim.Region.Framework.Scenes
}
private uint m_requestedSitTargetID;
- private UUID m_requestedSitTargetUUID;
///
/// Are we sitting on the ground?
@@ -3436,9 +3431,6 @@ namespace OpenSim.Region.Framework.Scenes
private void SendSitResponse(UUID targetID, Vector3 offset, Quaternion sitOrientation)
{
- Vector3 cameraEyeOffset = Vector3.Zero;
- Vector3 cameraAtOffset = Vector3.Zero;
- bool forceMouselook = false;
SceneObjectPart part = FindNextAvailableSitTarget(targetID);
if (part == null)
@@ -3485,10 +3477,10 @@ namespace OpenSim.Region.Framework.Scenes
part.AddSittingAvatar(this);
- cameraAtOffset = part.GetCameraAtOffset();
- cameraEyeOffset = part.GetCameraEyeOffset();
+ Vector3 cameraAtOffset = part.GetCameraAtOffset();
+ Vector3 cameraEyeOffset = part.GetCameraEyeOffset();
- forceMouselook = part.GetForceMouselook();
+ bool forceMouselook = part.GetForceMouselook();
if (!part.IsRoot)
{
@@ -3515,8 +3507,7 @@ namespace OpenSim.Region.Framework.Scenes
part.ParentGroup.UUID, offset, sitOrientation,
true, cameraAtOffset, cameraEyeOffset, forceMouselook);
- m_requestedSitTargetUUID = part.UUID;
-
+ m_requestedSitTargetID = part.LocalId;
HandleAgentSit(ControllingClient, UUID);
// Moved here to avoid a race with default sit anim
@@ -3532,26 +3523,13 @@ namespace OpenSim.Region.Framework.Scenes
if (ParentID != 0)
{
- if (ParentPart.UUID == targetID)
+ if (targetID.Equals(ParentPart.UUID))
return; // already sitting here, ignore
-
StandUp();
}
- else if(SitGround)
+ else if (SitGround)
StandUp();
- SceneObjectPart part = FindNextAvailableSitTarget(targetID);
-
- if (part != null)
- {
- m_requestedSitTargetID = part.LocalId;
- m_requestedSitTargetUUID = part.UUID;
- }
- else
- {
- m_log.Warn("Sit requested on unknown object: " + targetID.ToString());
- }
-
SendSitResponse(targetID, offset, Quaternion.Identity);
}
@@ -3577,11 +3555,12 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
+ m_requestedSitTargetID = part.LocalId;
if (m_scene.PhysicsScene.SitAvatar(part.PhysActor, AbsolutePosition, CameraPosition, offset, new Vector3(0.35f, 0, 0.65f), PhysicsSitResponse) != 0)
{
return true;
}
-
+ m_requestedSitTargetID = 0;
return false;
}
@@ -3686,6 +3665,7 @@ namespace OpenSim.Region.Framework.Scenes
return;
SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
+ m_requestedSitTargetID = 0;
if (part != null)
{
@@ -3806,12 +3786,11 @@ namespace OpenSim.Region.Framework.Scenes
part.AddSittingAvatar(this);
ParentPart = part;
- ParentID = m_requestedSitTargetID;
+ ParentID = part.LocalId;
m_AngularVelocity = Vector3.Zero;
Velocity = Vector3.Zero;
- m_requestedSitTargetID = 0;
SendAvatarDataToAllAgents();
@@ -4681,25 +4660,28 @@ namespace OpenSim.Region.Framework.Scenes
// Also don't do this while sat, sitting avatars cross with the
// object they sit on. ParentUUID denoted a pending sit, don't
// interfere with it.
- if (ParentID != 0 || PhysicsActor == null || !ParentUUID.IsZero())
+ if (ParentID != 0 || PhysicsActor == null || ParentUUID.IsNotZero())
return;
Vector3 pos2 = AbsolutePosition;
Vector3 vel = Velocity;
- float timeStep = 0.1f;
- pos2.X += vel.X * timeStep;
- pos2.Y += vel.Y * timeStep;
- pos2.Z += vel.Z * timeStep;
+ RegionInfo rinfo = m_scene.RegionInfo;
-// m_log.DebugFormat(
-// "[SCENE PRESENCE]: Testing border check for projected position {0} of {1} in {2}",
-// pos2, Name, Scene.Name);
+ float timeStep = m_scene.FrameTime;
+ float t = pos2.X + vel.X * timeStep;
+ if (t >= 0 && t < rinfo.RegionSizeX)
+ {
+ t = pos2.Y + vel.Y * timeStep;
+ if (t >= 0 && t < rinfo.RegionSizeY)
+ return;
+ }
- if (Scene.PositionIsInCurrentRegion(pos2))
- return;
+ //m_log.DebugFormat(
+ // "[SCENE PRESENCE]: Testing border check for projected position {0} of {1} in {2}",
+ // pos2, Name, Scene.Name);
- if (!CrossToNewRegion() && m_requestedSitTargetUUID.IsZero())
+ if (!CrossToNewRegion() && m_requestedSitTargetID == 0)
{
// we don't have entity transfer module
Vector3 pos = AbsolutePosition;
@@ -4707,13 +4689,13 @@ namespace OpenSim.Region.Framework.Scenes
float px = pos.X;
if (px < 0)
pos.X += vel.X * 2;
- else if (px > m_scene.RegionInfo.RegionSizeX)
+ else if (px > rinfo.RegionSizeX)
pos.X -= vel.X * 2;
float py = pos.Y;
if (py < 0)
pos.Y += vel.Y * 2;
- else if (py > m_scene.RegionInfo.RegionSizeY)
+ else if (py > rinfo.RegionSizeY)
pos.Y -= vel.Y * 2;
Velocity = Vector3.Zero;
@@ -4724,7 +4706,7 @@ namespace OpenSim.Region.Framework.Scenes
public void CrossToNewRegionFail()
{
- if (m_requestedSitTargetUUID.IsZero())
+ if (m_requestedSitTargetID == 0)
{
bool isFlying = Flying;
RemoveFromPhysicalScene();
@@ -4759,22 +4741,15 @@ namespace OpenSim.Region.Framework.Scenes
///
protected bool CrossToNewRegion()
{
- bool result = false;
-// parcelRegionCross(false);
try
{
- result = m_scene.CrossAgentToNewRegion(this, Flying);
+ return m_scene.CrossAgentToNewRegion(this, Flying);
}
catch
{
// result = m_scene.CrossAgentToNewRegion(this, false);
return false;
}
- // if(!result)
- // parcelRegionCross(true);
-
- return result;
-
}
///