mantis 8250: make same changes to avatar move to target (still no new OSSL)

UbitUmarov [2020-05-19 14:59:53]
mantis 8250: make same changes to avatar move to target (still no new OSSL)
Filename
OpenSim/Region/Framework/Scenes/Scene.cs
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
OpenSim/Region/Framework/Scenes/ScenePresence.cs
OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 614769c..39f8fc9 100755
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -6285,71 +6285,6 @@ Environment.Exit(1);
             }
         }

-        /// This method deals with movement when an avatar is automatically moving (but this is distinct from the
-        /// autopilot that moves an avatar to a sit target!.
-        /// </summary>
-        /// <remarks>
-        /// This is not intended as a permament location for this method.
-        /// </remarks>
-        /// <param name="presence"></param>
-/* move to target is now done on presence update
-        private void HandleOnSignificantClientMovement(ScenePresence presence)
-        {
-            if (presence.MovingToTarget)
-            {
-                double distanceToTarget = Util.GetDistanceTo(presence.AbsolutePosition, presence.MoveToPositionTarget);
-//                            m_log.DebugFormat(
-//                                "[SCENE]: Abs pos of {0} is {1}, target {2}, distance {3}",
-//                                presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget, distanceToTarget);
-
-                // Check the error term of the current position in relation to the target position
-                if (distanceToTarget <= ScenePresence.SIGNIFICANT_MOVEMENT)
-                {
-                    // We are close enough to the target
-//                        m_log.DebugFormat("[SCENEE]: Stopping autopilot of  {0}", presence.Name);
-
-                    presence.Velocity = Vector3.Zero;
-                    presence.AbsolutePosition = presence.MoveToPositionTarget;
-                    presence.ResetMoveToTarget();
-
-                    if (presence.Flying)
-                    {
-                        // A horrible hack to stop the avatar dead in its tracks rather than having them overshoot
-                        // the target if flying.
-                        // We really need to be more subtle (slow the avatar as it approaches the target) or at
-                        // least be able to set collision status once, rather than 5 times to give it enough
-                        // weighting so that that PhysicsActor thinks it really is colliding.
-                        for (int i = 0; i < 5; i++)
-                            presence.IsColliding = true;
-
-                        if (presence.LandAtTarget)
-                            presence.Flying = false;
-
-//                            Vector3 targetPos = presence.MoveToPositionTarget;
-//                            float terrainHeight = (float)presence.Scene.Heightmap[(int)targetPos.X, (int)targetPos.Y];
-//                            if (targetPos.Z - terrainHeight < 0.2)
-//                            {
-//                                presence.Flying = false;
-//                            }
-                    }
-
-//                        m_log.DebugFormat(
-//                            "[SCENE]: AgentControlFlags {0}, MovementFlag {1} for {2}",
-//                            presence.AgentControlFlags, presence.MovementFlag, presence.Name);
-                }
-                else
-                {
-//                        m_log.DebugFormat(
-//                            "[SCENE]: Updating npc {0} at {1} for next movement to {2}",
-//                            presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget);
-
-                    Vector3 agent_control_v3 = new Vector3();
-                    presence.HandleMoveToTargetUpdate(1, ref agent_control_v3);
-                    presence.AddNewMovement(agent_control_v3);
-                }
-            }
-        }
-*/
         // manage and select spawn points in sequence
         public int SpawnPoint()
         {
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 0dc8f7b..13ad039 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2680,7 +2680,7 @@ namespace OpenSim.Region.Framework.Scenes
                     ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar);

                     if (avatar != null && !avatar.IsSatOnObject)
-                        avatar.MoveToTarget(target, false, false, tau);
+                        avatar.MoveToTarget(target, false, false, false, tau);
                 }
                 else
                 {
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 88ec659..a88c8c8 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3166,8 +3166,9 @@ namespace OpenSim.Region.Framework.Scenes

         public void MoveToTargetHandle(Vector3 pos, bool noFly, bool landAtTarget)
         {
-            MoveToTarget(pos, noFly, landAtTarget);
+            MoveToTarget(pos, noFly, false, landAtTarget);
         }
+
         /// <summary>
         /// Move to the given target over time.
         /// </summary>
@@ -3180,7 +3181,7 @@ namespace OpenSim.Region.Framework.Scenes
         /// <param name="landAtTarget">
         /// If true and the avatar starts flying during the move then land at the target.
         /// </param>
-        public void MoveToTarget(Vector3 pos, bool noFly, bool landAtTarget, float tau = -1f)
+        public void MoveToTarget(Vector3 pos, bool noFly, bool landAtTarget, bool running, float tau = -1f)
         {
             m_delayedStop = -1;

@@ -3218,19 +3219,14 @@ namespace OpenSim.Region.Framework.Scenes
 //                "[SCENE PRESENCE]: Avatar {0} set move to target {1} (terrain height {2}) in {3}",
 //                Name, pos, terrainHeight, m_scene.RegionInfo.RegionName);

-            terrainHeight += Appearance.AvatarHeight; // so 1.5 * AvatarHeight above ground at target
-            bool shouldfly = Flying;
-            if (noFly)
-                shouldfly = false;
-            else if (pos.Z > terrainHeight || Flying)
-                shouldfly = true;
+            bool shouldfly = noFly ? false : (Flying || (pos.Z > terrainHeight + Appearance.AvatarHeight));

             Vector3 localVectorToTarget3D = pos - AbsolutePosition;

 //            m_log.DebugFormat("[SCENE PRESENCE]: Local vector to target is {0},[1}", localVectorToTarget3D.X,localVectorToTarget3D.Y);

             m_movingToTarget = true;
-            LandAtTarget = landAtTarget;
+            LandAtTarget = landAtTarget & shouldfly;
             m_moveToPositionTarget = pos;
             if(tau > 0)
             {
@@ -3245,7 +3241,10 @@ namespace OpenSim.Region.Framework.Scenes
                 SetAlwaysRun = false;
             }
             else
+            {
                 m_moveToSpeed = 4.096f * m_speedModifier;
+                SetAlwaysRun = running;
+            }

             Flying = shouldfly;

diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
index ced82e6..0f47511 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
@@ -259,8 +259,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
 //                                sp.Name, pos, scene.RegionInfo.RegionName,
 //                                noFly, landAtTarget);

-                        sp.MoveToTarget(pos, noFly, landAtTarget);
-                        sp.SetAlwaysRun = running;
+                        sp.MoveToTarget(pos, noFly, landAtTarget, running);

                         return true;
                     }
ViewGit