aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs59
2 files changed, 60 insertions, 1 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index fc1e85a..0ebdbb7 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3573,7 +3573,7 @@ namespace OpenSim.Region.Framework.Scenes
3573 return true; 3573 return true;
3574 } 3574 }
3575 3575
3576 private bool TestLandRestrictions(UUID agentID, out string reason, ref float posX, ref float posY) 3576 public bool TestLandRestrictions(UUID agentID, out string reason, ref float posX, ref float posY)
3577 { 3577 {
3578 reason = String.Empty; 3578 reason = String.Empty;
3579 if (Permissions.IsGod(agentID)) 3579 if (Permissions.IsGod(agentID))
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index fdbcbb0..bac356e 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3844,8 +3844,67 @@ namespace OpenSim.Region.Framework.Scenes
3844 } 3844 }
3845 } 3845 }
3846 3846
3847 private void CheckAndAdjustTelehub(SceneObjectGroup telehub, ref Vector3 pos)
3848 {
3849 if ((m_teleportFlags & (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID)) ==
3850 (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID) ||
3851 (m_teleportFlags & TeleportFlags.ViaLandmark) != 0 ||
3852 (m_teleportFlags & TeleportFlags.ViaLocation) != 0 ||
3853 (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0)
3854 {
3855 if (GodLevel < 200 &&
3856 ((!m_scene.Permissions.IsGod(m_uuid) &&
3857 !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid)) ||
3858 (m_teleportFlags & TeleportFlags.ViaLocation) != 0 ||
3859 (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0))
3860 {
3861 SpawnPoint[] spawnPoints = m_scene.RegionInfo.RegionSettings.SpawnPoints().ToArray();
3862 if (spawnPoints.Length == 0)
3863 return;
3864
3865 float distance = 9999;
3866 int closest = -1;
3867
3868 for (int i = 0 ; i < spawnPoints.Length ; i++)
3869 {
3870 Vector3 spawnPosition = spawnPoints[i].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation);
3871 Vector3 offset = spawnPosition - pos;
3872 float d = Vector3.Mag(offset);
3873 if (d >= distance)
3874 continue;
3875 ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y);
3876 if (land == null)
3877 continue;
3878 if (land.IsEitherBannedOrRestricted(UUID))
3879 continue;
3880 distance = d;
3881 closest = i;
3882 }
3883 if (closest == -1)
3884 return;
3885
3886 pos = spawnPoints[closest].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation);
3887 }
3888 }
3889 }
3890
3847 private void CheckAndAdjustLandingPoint(ref Vector3 pos) 3891 private void CheckAndAdjustLandingPoint(ref Vector3 pos)
3848 { 3892 {
3893 string reason;
3894
3895 // Honor bans
3896 if (!m_scene.TestLandRestrictions(UUID, out reason, ref pos.X, ref pos.Y))
3897 return;
3898
3899 SceneObjectGroup telehub = null;
3900 if (m_scene.RegionInfo.RegionSettings.TelehubObject != UUID.Zero && (telehub = m_scene.GetSceneObjectGroup(m_scene.RegionInfo.RegionSettings.TelehubObject)) != null)
3901 {
3902 if (!m_scene.RegionInfo.EstateSettings.AllowDirectTeleport)
3903 {
3904 CheckAndAdjustTelehub(telehub, ref pos);
3905 return;
3906 }
3907 }
3849 3908
3850 ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y); 3909 ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
3851 if (land != null) 3910 if (land != null)