aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs50
1 files changed, 46 insertions, 4 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index b6172d2..729d5a9 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1110,6 +1110,12 @@ namespace OpenSim.Region.Framework.Scenes
1110 1110
1111 #region Status Methods 1111 #region Status Methods
1112 1112
1113 void PhysicsCheckPositionZ()
1114 {
1115 if(m_scene.PhysicsScene == null)
1116 return;
1117 }
1118
1113 /// <summary> 1119 /// <summary>
1114 /// Turns a child agent into a root agent. 1120 /// Turns a child agent into a root agent.
1115 /// </summary> 1121 /// </summary>
@@ -1195,7 +1201,8 @@ namespace OpenSim.Region.Framework.Scenes
1195 1201
1196 if (ParentID == 0) 1202 if (ParentID == 0)
1197 { 1203 {
1198 if(!CheckAndAdjustLandingPoint(ref pos, ref lookat)) 1204 bool positionChanged = false;
1205 if(!CheckAndAdjustLandingPoint(ref pos, ref lookat, ref positionChanged ))
1199 { 1206 {
1200 m_log.DebugFormat("[SCENE PRESENCE MakeRootAgent]: houston we have a problem.. {0}({1} got here banned",Name, UUID); 1207 m_log.DebugFormat("[SCENE PRESENCE MakeRootAgent]: houston we have a problem.. {0}({1} got here banned",Name, UUID);
1201 } 1208 }
@@ -1218,6 +1225,13 @@ namespace OpenSim.Region.Framework.Scenes
1218 pos.Y = m_scene.RegionInfo.RegionSizeY - 0.5f; 1225 pos.Y = m_scene.RegionInfo.RegionSizeY - 0.5f;
1219 } 1226 }
1220 1227
1228 bool checkPhysics = !positionChanged &&
1229 m_scene.SupportsRayCastFiltered() &&
1230 ((m_teleportFlags & (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID)) ==
1231 (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID)
1232 || (m_teleportFlags & TeleportFlags.ViaLocation) != 0
1233 || (m_teleportFlags & TeleportFlags.ViaHGLogin) != 0);
1234
1221 float localAVHeight = 1.56f; 1235 float localAVHeight = 1.56f;
1222 if (Appearance.AvatarHeight > 0) 1236 if (Appearance.AvatarHeight > 0)
1223 localAVHeight = Appearance.AvatarHeight; 1237 localAVHeight = Appearance.AvatarHeight;
@@ -1227,6 +1241,29 @@ namespace OpenSim.Region.Framework.Scenes
1227 if (newPosZ > pos.Z) 1241 if (newPosZ > pos.Z)
1228 pos.Z = newPosZ; 1242 pos.Z = newPosZ;
1229 1243
1244 if(checkPhysics)
1245 {
1246 // no land!!
1247 RayFilterFlags rayfilter = RayFilterFlags.ClosestAndBackCull;
1248 rayfilter |= RayFilterFlags.physical;
1249 rayfilter |= RayFilterFlags.nonphysical;
1250 rayfilter |= RayFilterFlags.LSLPhantom; // ubODE will only see volume detectors
1251 int physcount = 1;
1252 float dist = 1024f;
1253 Vector3 direction = new Vector3(0f,0f,-1f);
1254 Vector3 RayStart = pos;
1255 RayStart.Z += dist;
1256
1257 List<ContactResult> physresults =
1258 (List<ContactResult>)m_scene.RayCastFiltered(RayStart, direction, dist, physcount, rayfilter);
1259 if (physresults != null && physresults.Count > 0)
1260 {
1261 float d = physresults[0].Pos.Z + 0.5f * localAVHeight;
1262 if(d > pos.Z)
1263 pos.Z = d;
1264 }
1265 }
1266
1230 AbsolutePosition = pos; 1267 AbsolutePosition = pos;
1231 1268
1232// m_log.DebugFormat( 1269// m_log.DebugFormat(
@@ -5531,7 +5568,7 @@ namespace OpenSim.Region.Framework.Scenes
5531 const TeleportFlags TeleHubTPFlags = TeleportFlags.ViaLogin 5568 const TeleportFlags TeleHubTPFlags = TeleportFlags.ViaLogin
5532 | TeleportFlags.ViaHGLogin | TeleportFlags.ViaLocation; 5569 | TeleportFlags.ViaHGLogin | TeleportFlags.ViaLocation;
5533 5570
5534 private bool CheckAndAdjustTelehub(SceneObjectGroup telehub, ref Vector3 pos) 5571 private bool CheckAndAdjustTelehub(SceneObjectGroup telehub, ref Vector3 pos, ref bool positionChanged)
5535 { 5572 {
5536 // forcing telehubs on any tp that reachs this 5573 // forcing telehubs on any tp that reachs this
5537 if ((m_teleportFlags & TeleHubTPFlags) != 0 || 5574 if ((m_teleportFlags & TeleHubTPFlags) != 0 ||
@@ -5549,6 +5586,7 @@ namespace OpenSim.Region.Framework.Scenes
5549 pos = teleHubPosition; 5586 pos = teleHubPosition;
5550 if(land.IsEitherBannedOrRestricted(UUID)) 5587 if(land.IsEitherBannedOrRestricted(UUID))
5551 return false; 5588 return false;
5589 positionChanged = true;
5552 return true; 5590 return true;
5553 } 5591 }
5554 else 5592 else
@@ -5613,6 +5651,7 @@ namespace OpenSim.Region.Framework.Scenes
5613 5651
5614 if(!selected) 5652 if(!selected)
5615 return false; 5653 return false;
5654 positionChanged = true;
5616 return true; 5655 return true;
5617 5656
5618 default: 5657 default:
@@ -5646,10 +5685,12 @@ namespace OpenSim.Region.Framework.Scenes
5646 if(closest < 0) 5685 if(closest < 0)
5647 { 5686 {
5648 pos = spawnPoints[0].GetLocation(teleHubPosition, teleHubRotation); 5687 pos = spawnPoints[0].GetLocation(teleHubPosition, teleHubRotation);
5688 positionChanged = true;
5649 return false; 5689 return false;
5650 } 5690 }
5651 5691
5652 pos = spawnPoints[closest].GetLocation(teleHubPosition, teleHubRotation); 5692 pos = spawnPoints[closest].GetLocation(teleHubPosition, teleHubRotation);
5693 positionChanged = true;
5653 return true; 5694 return true;
5654 } 5695 }
5655 } 5696 }
@@ -5660,7 +5701,7 @@ namespace OpenSim.Region.Framework.Scenes
5660 TeleportFlags.ViaLocation | TeleportFlags.ViaHGLogin; 5701 TeleportFlags.ViaLocation | TeleportFlags.ViaHGLogin;
5661 5702
5662 // Modify landing point based on telehubs or parcel restrictions. 5703 // Modify landing point based on telehubs or parcel restrictions.
5663 private bool CheckAndAdjustLandingPoint(ref Vector3 pos, ref Vector3 lookat) 5704 private bool CheckAndAdjustLandingPoint(ref Vector3 pos, ref Vector3 lookat, ref bool positionChanged)
5664 { 5705 {
5665 string reason; 5706 string reason;
5666 5707
@@ -5677,7 +5718,7 @@ namespace OpenSim.Region.Framework.Scenes
5677 SceneObjectGroup telehub = null; 5718 SceneObjectGroup telehub = null;
5678 if (m_scene.RegionInfo.RegionSettings.TelehubObject != UUID.Zero && (telehub = m_scene.GetSceneObjectGroup(m_scene.RegionInfo.RegionSettings.TelehubObject)) != null) 5719 if (m_scene.RegionInfo.RegionSettings.TelehubObject != UUID.Zero && (telehub = m_scene.GetSceneObjectGroup(m_scene.RegionInfo.RegionSettings.TelehubObject)) != null)
5679 { 5720 {
5680 if(CheckAndAdjustTelehub(telehub, ref pos)) 5721 if(CheckAndAdjustTelehub(telehub, ref pos, ref positionChanged))
5681 return true; 5722 return true;
5682 } 5723 }
5683 } 5724 }
@@ -5706,6 +5747,7 @@ namespace OpenSim.Region.Framework.Scenes
5706 pos = land.LandData.UserLocation; 5747 pos = land.LandData.UserLocation;
5707 if(land.LandData.UserLookAt != Vector3.Zero) 5748 if(land.LandData.UserLookAt != Vector3.Zero)
5708 lookat = land.LandData.UserLookAt; 5749 lookat = land.LandData.UserLookAt;
5750 positionChanged = true;
5709 } 5751 }
5710 } 5752 }
5711 } 5753 }