diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 77e67ba183..53edcd6caf 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -537,8 +537,15 @@ namespace OpenSim.Region.Framework.Scenes return; } } + else if (RootPart.PhysActor != null) + { + RootPart.PhysActor.CrossingFailure(); + } - val = AbsolutePosition; + Vector3 oldp = AbsolutePosition; + val.X = Util.Clamp(oldp.X, 0.5f, (float)Constants.RegionSize - 0.5f); + val.Y = Util.Clamp(oldp.Y, 0.5f, (float)Constants.RegionSize - 0.5f); + val.Z = Util.Clamp(oldp.Z, 0.5f, 4096.0f); } } diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs index 95a97415ab..073241f2f3 100644 --- a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs @@ -3125,7 +3125,7 @@ Console.WriteLine("ODEPrim JointCreateFixed !!!"); d.BodySetPosition(Body, _position.X, _position.Y, _position.Z); d.BodySetLinearVel(Body, 0, 0, 0); - if (Interlocked.Exchange(ref m_crossingfailures, 0) == 0) + if (Interlocked.Exchange(ref m_crossingfailures, m_crossingfailures) == 0) { // tell base code only once Interlocked.Increment(ref m_crossingfailures); base.RequestPhysicsterseUpdate(); @@ -3133,7 +3133,7 @@ Console.WriteLine("ODEPrim JointCreateFixed !!!"); return; } - if (Interlocked.Exchange(ref m_crossingfailures, 0) > 1) + if (Interlocked.Exchange(ref m_crossingfailures, 0) != 0) { // main simulator had a crossing failure // park it inside region