diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index a3ad7ca..c3bc96a 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -836,9 +836,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
836 | { | 836 | { |
837 | Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N); | 837 | Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N); |
838 | pos.Y = crossedBorder.BorderLine.Z - 1; | 838 | pos.Y = crossedBorder.BorderLine.Z - 1; |
839 | } | ||
840 | |||
841 | //If they're TP'ing in or logging in, we haven't had time to add any known child regions yet. | ||
842 | //This has the unfortunate consequence that if somebody is TP'ing who is already a child agent, | ||
843 | //they'll bypass the landing point. But I can't think of any decent way of fixing this. | ||
844 | if (KnownChildRegionHandles.Count == 0) | ||
845 | { | ||
846 | ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y); | ||
847 | if (land != null) | ||
848 | { | ||
849 | //Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni. | ||
850 | if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && m_godlevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid) | ||
851 | { | ||
852 | pos = land.LandData.UserLocation; | ||
853 | } | ||
854 | } | ||
839 | } | 855 | } |
840 | 856 | ||
841 | |||
842 | if (pos.X < 0 || pos.Y < 0 || pos.Z < 0) | 857 | if (pos.X < 0 || pos.Y < 0 || pos.Z < 0) |
843 | { | 858 | { |
844 | Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128); | 859 | Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128); |
@@ -973,9 +988,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
973 | public void Teleport(Vector3 pos) | 988 | public void Teleport(Vector3 pos) |
974 | { | 989 | { |
975 | bool isFlying = false; | 990 | bool isFlying = false; |
976 | if (m_physicsActor != null) | ||
977 | isFlying = m_physicsActor.Flying; | ||
978 | 991 | ||
992 | if (m_physicsActor != null) | ||
993 | isFlying = m_physicsActor.Flying; | ||
994 | |||
979 | RemoveFromPhysicalScene(); | 995 | RemoveFromPhysicalScene(); |
980 | Velocity = Vector3.Zero; | 996 | Velocity = Vector3.Zero; |
981 | AbsolutePosition = pos; | 997 | AbsolutePosition = pos; |
@@ -986,7 +1002,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
986 | SetHeight(m_appearance.AvatarHeight); | 1002 | SetHeight(m_appearance.AvatarHeight); |
987 | } | 1003 | } |
988 | 1004 | ||
989 | SendTerseUpdateToAllClients(); | 1005 | SendTerseUpdateToAllClients(); |
1006 | |||
990 | } | 1007 | } |
991 | 1008 | ||
992 | public void TeleportWithMomentum(Vector3 pos) | 1009 | public void TeleportWithMomentum(Vector3 pos) |