diff -Nur opensim-/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs opensim/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs --- opensim-/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs 2009-08-11 22:52:48.000000000 +0900 +++ opensim/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs 2009-08-11 22:53:56.000000000 +0900 @@ -2930,8 +2930,40 @@ { foreach (OdeCharacter actor in _characters) { - if (actor != null) + if (actor != null) { actor.UpdatePositionAndVelocity(); + + // by Fumi.Iseki for falling at SIM boundary + d.Vector3 vec = d.BodyGetPosition(actor.Body); + + //if (vec.Y<=0.0f || vec.Y>=255.95f || vec.X<=0.0f || vec.X>=255.95f) { + if ((vec.Y<=0.0f || vec.Y>=255.95f || vec.X<=0.0f || vec.X>=255.95f) && !actor.IsColliding && !actor.CollidingGround) { + if (vec.Y<=0.0f) vec.Y = 0.1f; + else if (vec.Y>255.95f) vec.Y = 255.95f; + if (vec.X<=0.0f) vec.X = 0.1f; + else if (vec.X>255.95f) vec.X = 255.95f; + + float height = _origheightmap[(int)vec.Y * Constants.RegionSize + (int)vec.X]; + if (actor.Flying) { + if (vec.Z < height + 2) { + vec.Z = height + actor.Size.Z/2; + actor.Velocity.Z = 0; + actor.IsColliding = true; + } + } + else { + if (vec.Z < height + actor.Size.Z/2) { + vec.Z = height + actor.Size.Z/2; + actor.Velocity.Z = 0; + actor.IsColliding = true; + actor.CollidingGround = true; + } + } + + actor.Position = new PhysicsVector(vec.X, vec.Y, vec.Z); + d.BodySetPosition(actor.Body, vec.X, vec.Y, vec.Z); + } + } } } diff -Nur opensim-/bin/OpenMetaverse.dll.config opensim/bin/OpenMetaverse.dll.config --- opensim-/bin/OpenMetaverse.dll.config 2009-08-11 22:56:29.000000000 +0900 +++ opensim/bin/OpenMetaverse.dll.config 2009-08-11 22:56:49.000000000 +0900 @@ -1,7 +1,7 @@ - +