mantis 8250: make same changes to avatar move to target (still no new OSSL)
parent
28b22a4fc1
commit
aca62392ac
|
@ -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
|
// manage and select spawn points in sequence
|
||||||
public int SpawnPoint()
|
public int SpawnPoint()
|
||||||
{
|
{
|
||||||
|
|
|
@ -2680,7 +2680,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar);
|
ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar);
|
||||||
|
|
||||||
if (avatar != null && !avatar.IsSatOnObject)
|
if (avatar != null && !avatar.IsSatOnObject)
|
||||||
avatar.MoveToTarget(target, false, false, tau);
|
avatar.MoveToTarget(target, false, false, false, tau);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -3166,8 +3166,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public void MoveToTargetHandle(Vector3 pos, bool noFly, bool landAtTarget)
|
public void MoveToTargetHandle(Vector3 pos, bool noFly, bool landAtTarget)
|
||||||
{
|
{
|
||||||
MoveToTarget(pos, noFly, landAtTarget);
|
MoveToTarget(pos, noFly, false, landAtTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Move to the given target over time.
|
/// Move to the given target over time.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -3180,7 +3181,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="landAtTarget">
|
/// <param name="landAtTarget">
|
||||||
/// If true and the avatar starts flying during the move then land at the target.
|
/// If true and the avatar starts flying during the move then land at the target.
|
||||||
/// </param>
|
/// </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;
|
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}",
|
// "[SCENE PRESENCE]: Avatar {0} set move to target {1} (terrain height {2}) in {3}",
|
||||||
// Name, pos, terrainHeight, m_scene.RegionInfo.RegionName);
|
// Name, pos, terrainHeight, m_scene.RegionInfo.RegionName);
|
||||||
|
|
||||||
terrainHeight += Appearance.AvatarHeight; // so 1.5 * AvatarHeight above ground at target
|
bool shouldfly = noFly ? false : (Flying || (pos.Z > terrainHeight + Appearance.AvatarHeight));
|
||||||
bool shouldfly = Flying;
|
|
||||||
if (noFly)
|
|
||||||
shouldfly = false;
|
|
||||||
else if (pos.Z > terrainHeight || Flying)
|
|
||||||
shouldfly = true;
|
|
||||||
|
|
||||||
Vector3 localVectorToTarget3D = pos - AbsolutePosition;
|
Vector3 localVectorToTarget3D = pos - AbsolutePosition;
|
||||||
|
|
||||||
// m_log.DebugFormat("[SCENE PRESENCE]: Local vector to target is {0},[1}", localVectorToTarget3D.X,localVectorToTarget3D.Y);
|
// m_log.DebugFormat("[SCENE PRESENCE]: Local vector to target is {0},[1}", localVectorToTarget3D.X,localVectorToTarget3D.Y);
|
||||||
|
|
||||||
m_movingToTarget = true;
|
m_movingToTarget = true;
|
||||||
LandAtTarget = landAtTarget;
|
LandAtTarget = landAtTarget & shouldfly;
|
||||||
m_moveToPositionTarget = pos;
|
m_moveToPositionTarget = pos;
|
||||||
if(tau > 0)
|
if(tau > 0)
|
||||||
{
|
{
|
||||||
|
@ -3245,7 +3241,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
SetAlwaysRun = false;
|
SetAlwaysRun = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
m_moveToSpeed = 4.096f * m_speedModifier;
|
m_moveToSpeed = 4.096f * m_speedModifier;
|
||||||
|
SetAlwaysRun = running;
|
||||||
|
}
|
||||||
|
|
||||||
Flying = shouldfly;
|
Flying = shouldfly;
|
||||||
|
|
||||||
|
|
|
@ -259,8 +259,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
// sp.Name, pos, scene.RegionInfo.RegionName,
|
// sp.Name, pos, scene.RegionInfo.RegionName,
|
||||||
// noFly, landAtTarget);
|
// noFly, landAtTarget);
|
||||||
|
|
||||||
sp.MoveToTarget(pos, noFly, landAtTarget);
|
sp.MoveToTarget(pos, noFly, landAtTarget, running);
|
||||||
sp.SetAlwaysRun = running;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue