aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs214
1 files changed, 109 insertions, 105 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 6f02475..040cbfc 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2736,137 +2736,141 @@ namespace OpenSim.Region.Framework.Scenes
2736 /// </remarks> 2736 /// </remarks>
2737 protected void CheckForBorderCrossing() 2737 protected void CheckForBorderCrossing()
2738 { 2738 {
2739 // Check that we we are not a child and have a physics actor or we're sitting on something 2739 // Check that we we are not a child
2740 if (IsChildAgent || (ParentID == 0 && PhysicsActor != null || ParentID != 0)) 2740 if (IsChildAgent)
2741 return; 2741 return;
2742 2742
2743 Vector3 pos2 = AbsolutePosition; 2743 // We only do this if we have a physics actor or we're sitting on something
2744 Vector3 vel = Velocity; 2744 if (ParentID == 0 && PhysicsActor != null || ParentID != 0)
2745 int neighbor = 0; 2745 {
2746 int[] fix = new int[2]; 2746 Vector3 pos2 = AbsolutePosition;
2747 Vector3 vel = Velocity;
2748 int neighbor = 0;
2749 int[] fix = new int[2];
2747 2750
2748 float timeStep = 0.1f; 2751 float timeStep = 0.1f;
2749 pos2.X = pos2.X + (vel.X*timeStep); 2752 pos2.X = pos2.X + (vel.X * timeStep);
2750 pos2.Y = pos2.Y + (vel.Y*timeStep); 2753 pos2.Y = pos2.Y + (vel.Y * timeStep);
2751 pos2.Z = pos2.Z + (vel.Z*timeStep); 2754 pos2.Z = pos2.Z + (vel.Z * timeStep);
2752 2755
2753 if (!IsInTransit) 2756 if (!IsInTransit)
2754 {
2755 // Checks if where it's headed exists a region
2756 bool needsTransit = false;
2757 if (m_scene.TestBorderCross(pos2, Cardinals.W))
2758 { 2757 {
2759 if (m_scene.TestBorderCross(pos2, Cardinals.S)) 2758 // Checks if where it's headed exists a region
2759 bool needsTransit = false;
2760 if (m_scene.TestBorderCross(pos2, Cardinals.W))
2760 { 2761 {
2761 needsTransit = true; 2762 if (m_scene.TestBorderCross(pos2, Cardinals.S))
2762 neighbor = m_scene.HaveNeighbor(Cardinals.SW, ref fix); 2763 {
2763 } 2764 needsTransit = true;
2764 else if (m_scene.TestBorderCross(pos2, Cardinals.N)) 2765 neighbor = m_scene.HaveNeighbor(Cardinals.SW, ref fix);
2765 { 2766 }
2766 needsTransit = true; 2767 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2767 neighbor = m_scene.HaveNeighbor(Cardinals.NW, ref fix); 2768 {
2769 needsTransit = true;
2770 neighbor = m_scene.HaveNeighbor(Cardinals.NW, ref fix);
2771 }
2772 else
2773 {
2774 needsTransit = true;
2775 neighbor = m_scene.HaveNeighbor(Cardinals.W, ref fix);
2776 }
2768 } 2777 }
2769 else 2778 else if (m_scene.TestBorderCross(pos2, Cardinals.E))
2770 { 2779 {
2771 needsTransit = true; 2780 if (m_scene.TestBorderCross(pos2, Cardinals.S))
2772 neighbor = m_scene.HaveNeighbor(Cardinals.W, ref fix); 2781 {
2782 needsTransit = true;
2783 neighbor = m_scene.HaveNeighbor(Cardinals.SE, ref fix);
2784 }
2785 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2786 {
2787 needsTransit = true;
2788 neighbor = m_scene.HaveNeighbor(Cardinals.NE, ref fix);
2789 }
2790 else
2791 {
2792 needsTransit = true;
2793 neighbor = m_scene.HaveNeighbor(Cardinals.E, ref fix);
2794 }
2773 } 2795 }
2774 } 2796 else if (m_scene.TestBorderCross(pos2, Cardinals.S))
2775 else if (m_scene.TestBorderCross(pos2, Cardinals.E))
2776 {
2777 if (m_scene.TestBorderCross(pos2, Cardinals.S))
2778 { 2797 {
2779 needsTransit = true; 2798 needsTransit = true;
2780 neighbor = m_scene.HaveNeighbor(Cardinals.SE, ref fix); 2799 neighbor = m_scene.HaveNeighbor(Cardinals.S, ref fix);
2781 } 2800 }
2782 else if (m_scene.TestBorderCross(pos2, Cardinals.N)) 2801 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2783 { 2802 {
2784 needsTransit = true; 2803 needsTransit = true;
2785 neighbor = m_scene.HaveNeighbor(Cardinals.NE, ref fix); 2804 neighbor = m_scene.HaveNeighbor(Cardinals.N, ref fix);
2786 } 2805 }
2787 else
2788 {
2789 needsTransit = true;
2790 neighbor = m_scene.HaveNeighbor(Cardinals.E, ref fix);
2791 }
2792 }
2793 else if (m_scene.TestBorderCross(pos2, Cardinals.S))
2794 {
2795 needsTransit = true;
2796 neighbor = m_scene.HaveNeighbor(Cardinals.S, ref fix);
2797 }
2798 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2799 {
2800 needsTransit = true;
2801 neighbor = m_scene.HaveNeighbor(Cardinals.N, ref fix);
2802 }
2803 2806
2804 // Makes sure avatar does not end up outside region 2807 // Makes sure avatar does not end up outside region
2805 if (neighbor <= 0) 2808 if (neighbor <= 0)
2806 {
2807 if (needsTransit)
2808 { 2809 {
2809 if (m_requestedSitTargetUUID == UUID.Zero) 2810 if (needsTransit)
2810 { 2811 {
2811 bool isFlying = Flying; 2812 if (m_requestedSitTargetUUID == UUID.Zero)
2812 RemoveFromPhysicalScene(); 2813 {
2813 2814 bool isFlying = Flying;
2814 Vector3 pos = AbsolutePosition; 2815 RemoveFromPhysicalScene();
2815 if (AbsolutePosition.X < 0) 2816
2816 pos.X += Velocity.X * 2; 2817 Vector3 pos = AbsolutePosition;
2817 else if (AbsolutePosition.X > Constants.RegionSize) 2818 if (AbsolutePosition.X < 0)
2818 pos.X -= Velocity.X * 2; 2819 pos.X += Velocity.X * 2;
2819 if (AbsolutePosition.Y < 0) 2820 else if (AbsolutePosition.X > Constants.RegionSize)
2820 pos.Y += Velocity.Y * 2; 2821 pos.X -= Velocity.X * 2;
2821 else if (AbsolutePosition.Y > Constants.RegionSize) 2822 if (AbsolutePosition.Y < 0)
2822 pos.Y -= Velocity.Y * 2; 2823 pos.Y += Velocity.Y * 2;
2823 Velocity = Vector3.Zero; 2824 else if (AbsolutePosition.Y > Constants.RegionSize)
2824 AbsolutePosition = pos; 2825 pos.Y -= Velocity.Y * 2;
2825 2826 Velocity = Vector3.Zero;
2826 m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); 2827 AbsolutePosition = pos;
2827 2828
2828 AddToPhysicalScene(isFlying); 2829 m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition);
2830
2831 AddToPhysicalScene(isFlying);
2832 }
2829 } 2833 }
2830 } 2834 }
2831 } 2835 else if (neighbor > 0)
2832 else if (neighbor > 0)
2833 {
2834 if (!CrossToNewRegion())
2835 { 2836 {
2836 if (m_requestedSitTargetUUID == UUID.Zero) 2837 if (!CrossToNewRegion())
2837 { 2838 {
2838 bool isFlying = Flying; 2839 if (m_requestedSitTargetUUID == UUID.Zero)
2839 RemoveFromPhysicalScene(); 2840 {
2840 2841 bool isFlying = Flying;
2841 Vector3 pos = AbsolutePosition; 2842 RemoveFromPhysicalScene();
2842 if (AbsolutePosition.X < 0) 2843
2843 pos.X += Velocity.X * 2; 2844 Vector3 pos = AbsolutePosition;
2844 else if (AbsolutePosition.X > Constants.RegionSize) 2845 if (AbsolutePosition.X < 0)
2845 pos.X -= Velocity.X * 2; 2846 pos.X += Velocity.X * 2;
2846 if (AbsolutePosition.Y < 0) 2847 else if (AbsolutePosition.X > Constants.RegionSize)
2847 pos.Y += Velocity.Y * 2; 2848 pos.X -= Velocity.X * 2;
2848 else if (AbsolutePosition.Y > Constants.RegionSize) 2849 if (AbsolutePosition.Y < 0)
2849 pos.Y -= Velocity.Y * 2; 2850 pos.Y += Velocity.Y * 2;
2850 Velocity = Vector3.Zero; 2851 else if (AbsolutePosition.Y > Constants.RegionSize)
2851 AbsolutePosition = pos; 2852 pos.Y -= Velocity.Y * 2;
2852 2853 Velocity = Vector3.Zero;
2853 AddToPhysicalScene(isFlying); 2854 AbsolutePosition = pos;
2855
2856 AddToPhysicalScene(isFlying);
2857 }
2854 } 2858 }
2855 } 2859 }
2856 } 2860 }
2857 } 2861 else
2858 else 2862 {
2859 { 2863 // This constant has been inferred from experimentation
2860 // This constant has been inferred from experimentation 2864 // I'm not sure what this value should be, so I tried a few values.
2861 // I'm not sure what this value should be, so I tried a few values. 2865 timeStep = 0.04f;
2862 timeStep = 0.04f; 2866 pos2 = AbsolutePosition;
2863 pos2 = AbsolutePosition; 2867 pos2.X = pos2.X + (vel.X * timeStep);
2864 pos2.X = pos2.X + (vel.X * timeStep); 2868 pos2.Y = pos2.Y + (vel.Y * timeStep);
2865 pos2.Y = pos2.Y + (vel.Y * timeStep); 2869 // Don't touch the Z
2866 // Don't touch the Z 2870 m_pos = pos2;
2867 m_pos = pos2; 2871 m_log.DebugFormat("[SCENE PRESENCE]: In transit m_pos={0}", m_pos);
2868 m_log.ErrorFormat("m_pos={0}", m_pos); 2872 }
2869 } 2873 }
2870 } 2874 }
2871 2875
2872 /// <summary> 2876 /// <summary>