aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs59
1 files changed, 59 insertions, 0 deletions
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)