aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/ScenePresence.cs
diff options
context:
space:
mode:
authorUbitUmarov2015-12-23 21:22:00 +0000
committerUbitUmarov2015-12-23 21:22:00 +0000
commit24aa5297155a47a57ad53841fea3eae759235c7b (patch)
tree07add88889ea1d223eae90a7e34ffad607a3fee7 /OpenSim/Region/Framework/Scenes/ScenePresence.cs
parent physics landing: don't land on top of volume detectors (diff)
downloadopensim-SC_OLD-24aa5297155a47a57ad53841fea3eae759235c7b.zip
opensim-SC_OLD-24aa5297155a47a57ad53841fea3eae759235c7b.tar.gz
opensim-SC_OLD-24aa5297155a47a57ad53841fea3eae759235c7b.tar.bz2
opensim-SC_OLD-24aa5297155a47a57ad53841fea3eae759235c7b.tar.xz
fix avatar movetotarget that got broken with changes on significant movement. Do it all on scenepresence.cs, and not also on scene.cs. check distance to target only on X,Y if not flying or landing
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs74
1 files changed, 51 insertions, 23 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 4e63310..142d643 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2467,7 +2467,7 @@ namespace OpenSim.Region.Framework.Scenes
2467 // The UseClientAgentPosition is set if parcel ban is forcing the avatar to move to a 2467 // The UseClientAgentPosition is set if parcel ban is forcing the avatar to move to a
2468 // certain position. It's only check for tolerance on returning to that position is 0.2 2468 // certain position. It's only check for tolerance on returning to that position is 0.2
2469 // rather than 1, at which point it removes its force target. 2469 // rather than 1, at which point it removes its force target.
2470 if (HandleMoveToTargetUpdate(agentData.UseClientAgentPosition ? 0.2 : 1, ref agent_control_v3)) 2470 if (HandleMoveToTargetUpdate(agentData.UseClientAgentPosition ? 0.2f : 1f, ref agent_control_v3))
2471 update_movementflag = true; 2471 update_movementflag = true;
2472 } 2472 }
2473 } 2473 }
@@ -2643,31 +2643,55 @@ namespace OpenSim.Region.Framework.Scenes
2643 /// </remarks> 2643 /// </remarks>
2644 /// <param value="agent_control_v3">Cumulative agent movement that this method will update.</param> 2644 /// <param value="agent_control_v3">Cumulative agent movement that this method will update.</param>
2645 /// <returns>True if movement has been updated in some way. False otherwise.</returns> 2645 /// <returns>True if movement has been updated in some way. False otherwise.</returns>
2646 public bool HandleMoveToTargetUpdate(double tolerance, ref Vector3 agent_control_v3) 2646 public bool HandleMoveToTargetUpdate(float tolerance, ref Vector3 agent_control_v3)
2647 { 2647 {
2648// m_log.DebugFormat("[SCENE PRESENCE]: Called HandleMoveToTargetUpdate() for {0}", Name); 2648// m_log.DebugFormat("[SCENE PRESENCE]: Called HandleMoveToTargetUpdate() for {0}", Name);
2649 2649
2650 bool updated = false; 2650 bool updated = false;
2651 2651
2652 Vector3 LocalVectorToTarget3D = MoveToPositionTarget - AbsolutePosition; 2652 Vector3 LocalVectorToTarget3D = MoveToPositionTarget - AbsolutePosition;
2653 2653
2654// m_log.DebugFormat( 2654// m_log.DebugFormat(
2655// "[SCENE PRESENCE]: bAllowUpdateMoveToPosition {0}, m_moveToPositionInProgress {1}, m_autopilotMoving {2}", 2655// "[SCENE PRESENCE]: bAllowUpdateMoveToPosition {0}, m_moveToPositionInProgress {1}, m_autopilotMoving {2}",
2656// allowUpdate, m_moveToPositionInProgress, m_autopilotMoving); 2656// allowUpdate, m_moveToPositionInProgress, m_autopilotMoving);
2657 2657
2658 double distanceToTarget = LocalVectorToTarget3D.Length(); 2658 float distanceToTarget;
2659 if(Flying && !LandAtTarget)
2660 {
2661 distanceToTarget = LocalVectorToTarget3D.Length();
2662 }
2663 else
2664 {
2665 Vector3 hdist = LocalVectorToTarget3D;
2666 hdist.Z = 0;
2667 distanceToTarget = hdist.Length();
2668 }
2659 2669
2660// m_log.DebugFormat( 2670 // m_log.DebugFormat(
2661// "[SCENE PRESENCE]: Abs pos of {0} is {1}, target {2}, distance {3}", 2671 // "[SCENE PRESENCE]: Abs pos of {0} is {1}, target {2}, distance {3}",
2662// Name, AbsolutePosition, MoveToPositionTarget, distanceToTarget); 2672 // Name, AbsolutePosition, MoveToPositionTarget, distanceToTarget);
2663 2673
2664 // Check the error term of the current position in relation to the target position 2674 // Check the error term of the current position in relation to the target position
2665 if (distanceToTarget <= tolerance) 2675 if (distanceToTarget <= tolerance)
2666 { 2676 {
2667 // We are close enough to the target 2677 // We are close enough to the target
2678 Velocity = Vector3.Zero;
2668 AbsolutePosition = MoveToPositionTarget; 2679 AbsolutePosition = MoveToPositionTarget;
2680 if (Flying)
2681 {
2682 if (LandAtTarget)
2683 Flying = false;
2684
2685 // A horrible hack to stop the avatar dead in its tracks rather than having them overshoot
2686 // the target if flying.
2687 // We really need to be more subtle (slow the avatar as it approaches the target) or at
2688 // least be able to set collision status once, rather than 5 times to give it enough
2689 // weighting so that that PhysicsActor thinks it really is colliding.
2690 for (int i = 0; i < 5; i++)
2691 IsColliding = true;
2692 }
2669 ResetMoveToTarget(); 2693 ResetMoveToTarget();
2670 updated = true; 2694 return false;
2671 } 2695 }
2672 else 2696 else
2673 { 2697 {
@@ -2680,8 +2704,6 @@ namespace OpenSim.Region.Framework.Scenes
2680 // to such forces, but the following simple approach seems to works fine. 2704 // to such forces, but the following simple approach seems to works fine.
2681 2705
2682 LocalVectorToTarget3D = LocalVectorToTarget3D * Quaternion.Inverse(Rotation); // change to avatar coords 2706 LocalVectorToTarget3D = LocalVectorToTarget3D * Quaternion.Inverse(Rotation); // change to avatar coords
2683 // Ignore z component of vector
2684// Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f);
2685 2707
2686 LocalVectorToTarget3D.Normalize(); 2708 LocalVectorToTarget3D.Normalize();
2687 2709
@@ -2771,6 +2793,7 @@ namespace OpenSim.Region.Framework.Scenes
2771 } 2793 }
2772 2794
2773 return updated; 2795 return updated;
2796// AddNewMovement(agent_control_v3);
2774 } 2797 }
2775 2798
2776 /// <summary> 2799 /// <summary>
@@ -2807,6 +2830,7 @@ namespace OpenSim.Region.Framework.Scenes
2807 || pos.Z < 0) 2830 || pos.Z < 0)
2808 return; 2831 return;
2809 2832
2833 float terrainHeight;
2810 Scene targetScene = m_scene; 2834 Scene targetScene = m_scene;
2811 // Get terrain height for sub-region in a megaregion if necessary 2835 // Get terrain height for sub-region in a megaregion if necessary
2812 if (regionCombinerModule != null) 2836 if (regionCombinerModule != null)
@@ -2819,18 +2843,15 @@ namespace OpenSim.Region.Framework.Scenes
2819 return; 2843 return;
2820 UUID target_regionID = target_region.RegionID; 2844 UUID target_regionID = target_region.RegionID;
2821 SceneManager.Instance.TryGetScene(target_region.RegionID, out targetScene); 2845 SceneManager.Instance.TryGetScene(target_region.RegionID, out targetScene);
2846 terrainHeight = (float)targetScene.Heightmap[(int)(pos.X % regionSize.X), (int)(pos.Y % regionSize.Y)];
2822 } 2847 }
2823 2848 else
2824 float terrainHeight = (float)targetScene.Heightmap[(int)(pos.X % regionSize.X), (int)(pos.Y % regionSize.Y)]; 2849 terrainHeight = m_scene.GetGroundHeight(pos.X, pos.Y);
2850
2825 // dont try to land underground 2851 // dont try to land underground
2826 terrainHeight += Appearance.AvatarHeight / 2; 2852 terrainHeight += Appearance.AvatarHeight * 0.5f + 0.2f;
2827
2828 pos.Z = Math.Max(terrainHeight, pos.Z);
2829 2853
2830 // Fudge factor. It appears that if one clicks "go here" on a piece of ground, the go here request is 2854 if(terrainHeight > pos.Z)
2831 // always slightly higher than the actual terrain height.
2832 // FIXME: This constrains NPC movements as well, so should be somewhere else.
2833 if (pos.Z - terrainHeight < 0.2)
2834 pos.Z = terrainHeight; 2855 pos.Z = terrainHeight;
2835 2856
2836// m_log.DebugFormat( 2857// m_log.DebugFormat(
@@ -2839,7 +2860,7 @@ namespace OpenSim.Region.Framework.Scenes
2839 2860
2840 if (noFly) 2861 if (noFly)
2841 Flying = false; 2862 Flying = false;
2842 else if (pos.Z > terrainHeight + Appearance.AvatarHeight / 2 || Flying) 2863 else if (pos.Z > terrainHeight || Flying)
2843 Flying = true; 2864 Flying = true;
2844 2865
2845 LandAtTarget = landAtTarget; 2866 LandAtTarget = landAtTarget;
@@ -2861,9 +2882,9 @@ namespace OpenSim.Region.Framework.Scenes
2861 Rotation = Quaternion.CreateFromEulers(angle); 2882 Rotation = Quaternion.CreateFromEulers(angle);
2862// m_log.DebugFormat("[SCENE PRESENCE]: Body rot for {0} set to {1}", Name, Rotation); 2883// m_log.DebugFormat("[SCENE PRESENCE]: Body rot for {0} set to {1}", Name, Rotation);
2863 2884
2864 Vector3 agent_control_v3 = new Vector3(); 2885 Vector3 control = Vector3.Zero;
2865 HandleMoveToTargetUpdate(1, ref agent_control_v3); 2886 if(HandleMoveToTargetUpdate(1f, ref control))
2866 AddNewMovement(agent_control_v3); 2887 AddNewMovement(control);
2867 } 2888 }
2868 2889
2869 /// <summary> 2890 /// <summary>
@@ -3526,6 +3547,13 @@ namespace OpenSim.Region.Framework.Scenes
3526 if (IsInTransit || IsLoggingIn) 3547 if (IsInTransit || IsLoggingIn)
3527 return; 3548 return;
3528 3549
3550 if(MovingToTarget)
3551 {
3552 Vector3 control = Vector3.Zero;
3553 if(HandleMoveToTargetUpdate(1f, ref control))
3554 AddNewMovement(control);
3555 }
3556
3529 if (Appearance.AvatarSize != m_lastSize) 3557 if (Appearance.AvatarSize != m_lastSize)
3530 SendAvatarDataToAllAgents(); 3558 SendAvatarDataToAllAgents();
3531 3559