if an NPC target is set to a ground location, then automatically land them when they get there.

This doesn't help where the target is a prim surface.  In these situations, it might be better to provide manual overrides so the script can control whethre an avatar flys there/lands, etc.
bulletsim
Justin Clark-Casey (justincc) 2011-08-04 03:08:35 +01:00
parent 54ce029342
commit 1918402cb1
2 changed files with 16 additions and 6 deletions

View File

@ -1537,8 +1537,7 @@ namespace OpenSim.Region.Framework.Scenes
if (update_movementflag if (update_movementflag
&& ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) == 0) && ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) == 0)
&& (m_parentID == 0) && (m_parentID == 0)
&& !SitGround && !SitGround)
&& !MovingToTarget)
Animator.UpdateMovementAnimations(); Animator.UpdateMovementAnimations();
} }
@ -1711,9 +1710,9 @@ namespace OpenSim.Region.Framework.Scenes
if (pos.Z - terrainHeight < 0.2) if (pos.Z - terrainHeight < 0.2)
pos.Z = terrainHeight; pos.Z = terrainHeight;
// m_log.DebugFormat( m_log.DebugFormat(
// "[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);
if (pos.Z > terrainHeight) if (pos.Z > terrainHeight)
PhysicsActor.Flying = true; PhysicsActor.Flying = true;

View File

@ -72,8 +72,19 @@ namespace OpenSim.Region.OptionalModules.World.NPC
// Check the error term of the current position in relation to the target position // Check the error term of the current position in relation to the target position
if (distanceToTarget <= ScenePresence.SIGNIFICANT_MOVEMENT) if (distanceToTarget <= ScenePresence.SIGNIFICANT_MOVEMENT)
{ {
m_log.DebugFormat("[NPC MODULE]: Stopping movement of npc {0}", presence.Name);
// We are close enough to the target // We are close enough to the target
m_log.DebugFormat("[NPC MODULE]: Stopping movement of npc {0}", presence.Name);
if (presence.PhysicsActor.Flying)
{
Vector3 targetPos = presence.MoveToPositionTarget;
float terrainHeight = (float)presence.Scene.Heightmap[(int)targetPos.X, (int)targetPos.Y];
if (targetPos.Z - terrainHeight < 0.2)
{
presence.PhysicsActor.Flying = false;
}
}
presence.Velocity = Vector3.Zero; presence.Velocity = Vector3.Zero;
presence.AbsolutePosition = presence.MoveToPositionTarget; presence.AbsolutePosition = presence.MoveToPositionTarget;
presence.ResetMoveToTarget(); presence.ResetMoveToTarget();