diff options
author | UbitUmarov | 2015-12-21 16:31:49 +0000 |
---|---|---|
committer | UbitUmarov | 2015-12-21 16:31:49 +0000 |
commit | 4b14ec3c45dde729f81ef78e9b251496d97c77ac (patch) | |
tree | 89aacd6683ba00ed356ed2763820ade0cf7c5646 /OpenSim | |
parent | revert the setting of phantom flag on attachment drop to ground, since it can... (diff) | |
download | opensim-SC-4b14ec3c45dde729f81ef78e9b251496d97c77ac.zip opensim-SC-4b14ec3c45dde729f81ef78e9b251496d97c77ac.tar.gz opensim-SC-4b14ec3c45dde729f81ef78e9b251496d97c77ac.tar.bz2 opensim-SC-4b14ec3c45dde729f81ef78e9b251496d97c77ac.tar.xz |
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.
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 50 |
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 | } |