diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index b6172d2d22..729d5a9a72 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1110,6 +1110,12 @@ namespace OpenSim.Region.Framework.Scenes #region Status Methods + void PhysicsCheckPositionZ() + { + if(m_scene.PhysicsScene == null) + return; + } + /// /// Turns a child agent into a root agent. /// @@ -1195,7 +1201,8 @@ namespace OpenSim.Region.Framework.Scenes if (ParentID == 0) { - if(!CheckAndAdjustLandingPoint(ref pos, ref lookat)) + bool positionChanged = false; + if(!CheckAndAdjustLandingPoint(ref pos, ref lookat, ref positionChanged )) { m_log.DebugFormat("[SCENE PRESENCE MakeRootAgent]: houston we have a problem.. {0}({1} got here banned",Name, UUID); } @@ -1218,6 +1225,13 @@ namespace OpenSim.Region.Framework.Scenes pos.Y = m_scene.RegionInfo.RegionSizeY - 0.5f; } + bool checkPhysics = !positionChanged && + m_scene.SupportsRayCastFiltered() && + ((m_teleportFlags & (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID)) == + (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID) + || (m_teleportFlags & TeleportFlags.ViaLocation) != 0 + || (m_teleportFlags & TeleportFlags.ViaHGLogin) != 0); + float localAVHeight = 1.56f; if (Appearance.AvatarHeight > 0) localAVHeight = Appearance.AvatarHeight; @@ -1227,6 +1241,29 @@ namespace OpenSim.Region.Framework.Scenes if (newPosZ > pos.Z) pos.Z = newPosZ; + if(checkPhysics) + { + // no land!! + RayFilterFlags rayfilter = RayFilterFlags.ClosestAndBackCull; + rayfilter |= RayFilterFlags.physical; + rayfilter |= RayFilterFlags.nonphysical; + rayfilter |= RayFilterFlags.LSLPhantom; // ubODE will only see volume detectors + int physcount = 1; + float dist = 1024f; + Vector3 direction = new Vector3(0f,0f,-1f); + Vector3 RayStart = pos; + RayStart.Z += dist; + + List physresults = + (List)m_scene.RayCastFiltered(RayStart, direction, dist, physcount, rayfilter); + if (physresults != null && physresults.Count > 0) + { + float d = physresults[0].Pos.Z + 0.5f * localAVHeight; + if(d > pos.Z) + pos.Z = d; + } + } + AbsolutePosition = pos; // m_log.DebugFormat( @@ -5531,7 +5568,7 @@ namespace OpenSim.Region.Framework.Scenes const TeleportFlags TeleHubTPFlags = TeleportFlags.ViaLogin | TeleportFlags.ViaHGLogin | TeleportFlags.ViaLocation; - private bool CheckAndAdjustTelehub(SceneObjectGroup telehub, ref Vector3 pos) + private bool CheckAndAdjustTelehub(SceneObjectGroup telehub, ref Vector3 pos, ref bool positionChanged) { // forcing telehubs on any tp that reachs this if ((m_teleportFlags & TeleHubTPFlags) != 0 || @@ -5549,6 +5586,7 @@ namespace OpenSim.Region.Framework.Scenes pos = teleHubPosition; if(land.IsEitherBannedOrRestricted(UUID)) return false; + positionChanged = true; return true; } else @@ -5613,6 +5651,7 @@ namespace OpenSim.Region.Framework.Scenes if(!selected) return false; + positionChanged = true; return true; default: @@ -5646,10 +5685,12 @@ namespace OpenSim.Region.Framework.Scenes if(closest < 0) { pos = spawnPoints[0].GetLocation(teleHubPosition, teleHubRotation); + positionChanged = true; return false; } pos = spawnPoints[closest].GetLocation(teleHubPosition, teleHubRotation); + positionChanged = true; return true; } } @@ -5660,7 +5701,7 @@ namespace OpenSim.Region.Framework.Scenes TeleportFlags.ViaLocation | TeleportFlags.ViaHGLogin; // Modify landing point based on telehubs or parcel restrictions. - private bool CheckAndAdjustLandingPoint(ref Vector3 pos, ref Vector3 lookat) + private bool CheckAndAdjustLandingPoint(ref Vector3 pos, ref Vector3 lookat, ref bool positionChanged) { string reason; @@ -5677,7 +5718,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup telehub = null; if (m_scene.RegionInfo.RegionSettings.TelehubObject != UUID.Zero && (telehub = m_scene.GetSceneObjectGroup(m_scene.RegionInfo.RegionSettings.TelehubObject)) != null) { - if(CheckAndAdjustTelehub(telehub, ref pos)) + if(CheckAndAdjustTelehub(telehub, ref pos, ref positionChanged)) return true; } } @@ -5706,6 +5747,7 @@ namespace OpenSim.Region.Framework.Scenes pos = land.LandData.UserLocation; if(land.LandData.UserLookAt != Vector3.Zero) lookat = land.LandData.UserLookAt; + positionChanged = true; } } }