From 4b14ec3c45dde729f81ef78e9b251496d97c77ac Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Mon, 21 Dec 2015 16:31:49 +0000
Subject: add physics help on root agent arrival via some login types and if
not under action of telehub or landpoint. will change land to the top of
anything physics sees above ground up to 1024m above ground. Only works with
ubOde (possible ode but untested). Feature testing... some results may be
ugly.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 50 ++++++++++++++++++++++--
1 file changed, 46 insertions(+), 4 deletions(-)
(limited to 'OpenSim')
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
#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;
}
}
}
--
cgit v1.1