* Added the ability to land automatically on prim by pressing the page down button when over them and colliding

* Reverted the avatar portion of the inter-penetration physics scene explosion management, it needs more work.
afrisby
Teravus Ovares 2007-12-26 00:57:37 +00:00
parent e9efd5bee2
commit e008c3e4a9
2 changed files with 58 additions and 9 deletions

View File

@ -85,6 +85,9 @@ namespace OpenSim.Region.Environment.Scenes
protected Vector3 m_CameraAtAxis = new Vector3(0, 0, 0); protected Vector3 m_CameraAtAxis = new Vector3(0, 0, 0);
protected Vector3 m_CameraLeftAxis = new Vector3(0, 0, 0); protected Vector3 m_CameraLeftAxis = new Vector3(0, 0, 0);
protected Vector3 m_CameraUpAxis = new Vector3(0, 0, 0); protected Vector3 m_CameraUpAxis = new Vector3(0, 0, 0);
private uint m_AgentControlFlags = (uint)0;
private LLQuaternion m_headrotation = new LLQuaternion();
private byte m_state = (byte)0;
// Agent's Draw distance. // Agent's Draw distance.
protected float m_DrawDistance = 0f; protected float m_DrawDistance = 0f;
@ -104,7 +107,8 @@ namespace OpenSim.Region.Environment.Scenes
DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS, DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG, DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS, DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
} }
/// <summary> /// <summary>
@ -360,6 +364,7 @@ namespace OpenSim.Region.Environment.Scenes
Dir_Vectors[3] = new Vector3(0, -1, 0); //RIGHT Dir_Vectors[3] = new Vector3(0, -1, 0); //RIGHT
Dir_Vectors[4] = new Vector3(0, 0, 1); //UP Dir_Vectors[4] = new Vector3(0, 0, 1); //UP
Dir_Vectors[5] = new Vector3(0, 0, -1); //DOWN Dir_Vectors[5] = new Vector3(0, 0, -1); //DOWN
Dir_Vectors[5] = new Vector3(0, 0, -0.5f); //DOWN_Nudge
} }
#endregion #endregion
@ -526,6 +531,12 @@ namespace OpenSim.Region.Environment.Scenes
public void StopMovement() public void StopMovement()
{ {
} }
public void StopFlying()
{
MainLog.Instance.Verbose("AGENT","VEL:" + Velocity.ToString());
AbsolutePosition = AbsolutePosition + new LLVector3(0, 0, (m_avHeight/2));
SendFullUpdateToAllClients();
}
public void AddNeighbourRegion(ulong regionHandle) public void AddNeighbourRegion(ulong regionHandle)
{ {
@ -637,6 +648,12 @@ namespace OpenSim.Region.Environment.Scenes
// m_parentID = (what should this be?) // m_parentID = (what should this be?)
SetMovementAnimation(Animations.AnimsLLUUID["SIT_GROUND"], 1); SetMovementAnimation(Animations.AnimsLLUUID["SIT_GROUND"], 1);
} }
// In the future, these values might need to go global.
// Here's where you get them.
// m_AgentControlFlags = flags;
// m_headrotation = agentData.AgentData.HeadRotation;
// m_state = agentData.AgentData.State;
if (m_allowMovement) if (m_allowMovement)
{ {
@ -685,7 +702,27 @@ namespace OpenSim.Region.Environment.Scenes
i++; i++;
} }
} }
// Cause the avatar to stop flying if it's colliding
// with something with the down arrow pressed.
// Skip if there's no physicsactor
if (m_physicsActor != null)
{
// Only do this if we're flying
if (m_physicsActor.Flying)
{
// Are the landing controls requirements filled?
bool controlland = (((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
// Are the collision requirements fulfilled?
bool colliding = (m_physicsActor.IsColliding == true);
if (m_physicsActor.Flying && colliding && controlland)
{
StopFlying();
}
}
}
if ((update_movementflag) || (update_rotation && DCFlagKeyPressed)) if ((update_movementflag) || (update_rotation && DCFlagKeyPressed))
{ {
AddNewMovement(agent_control_v3, q); AddNewMovement(agent_control_v3, q);
@ -947,7 +984,7 @@ namespace OpenSim.Region.Environment.Scenes
Console.WriteLine("DEBUG: AddNewMovement: child agent"); Console.WriteLine("DEBUG: AddNewMovement: child agent");
return; return;
} }
m_rotation = rotation;
NewForce newVelocity = new NewForce(); NewForce newVelocity = new NewForce();
Vector3 direc = rotation * vec; Vector3 direc = rotation * vec;
direc.Normalize(); direc.Normalize();
@ -956,6 +993,17 @@ namespace OpenSim.Region.Environment.Scenes
if (m_physicsActor.Flying) if (m_physicsActor.Flying)
{ {
direc *= 4; direc *= 4;
bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
bool colliding = (m_physicsActor.IsColliding==true);
if (controlland)
MainLog.Instance.Verbose("AGENT","landCommand");
if (colliding )
MainLog.Instance.Verbose("AGENT","colliding");
if (m_physicsActor.Flying && colliding && controlland)
{
StopFlying();
MainLog.Instance.Verbose("AGENT", "Stop FLying");
}
} }
else else
{ {
@ -971,6 +1019,7 @@ namespace OpenSim.Region.Environment.Scenes
SetMovementAnimation(Animations.AnimsLLUUID["JUMP"], 1); SetMovementAnimation(Animations.AnimsLLUUID["JUMP"], 1);
} }
} }
} }
newVelocity.X = direc.x; newVelocity.X = direc.x;

View File

@ -296,9 +296,9 @@ namespace OpenSim.Region.Physics.OdePlugin
if (p2.PhysicsActorType == (int)ActorTypes.Agent) if (p2.PhysicsActorType == (int)ActorTypes.Agent)
{ {
p2.CollidingObj = true; p2.CollidingObj = true;
contacts[i].depth = 0.003f; //contacts[i].depth = 0.003f;
p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 2.5f); //p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 2.5f);
contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p1.Size.X / 2), contacts[i].pos.Y + (p1.Size.Y / 2), contacts[i].pos.Z + (p1.Size.Z / 2)); //contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p1.Size.X / 2), contacts[i].pos.Y + (p1.Size.Y / 2), contacts[i].pos.Z + (p1.Size.Z / 2));
} }
else else
@ -308,13 +308,13 @@ namespace OpenSim.Region.Physics.OdePlugin
if (p1.PhysicsActorType == (int)ActorTypes.Agent) if (p1.PhysicsActorType == (int)ActorTypes.Agent)
{ {
p1.CollidingObj = true; p1.CollidingObj = true;
contacts[i].depth = 0.003f; //contacts[i].depth = 0.003f;
p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 2.5f); //p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 2.5f);
contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p2.Size.X / 2), contacts[i].pos.Y + (p2.Size.Y / 2), contacts[i].pos.Z + (p2.Size.Z / 2)); //contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p2.Size.X / 2), contacts[i].pos.Y + (p2.Size.Y / 2), contacts[i].pos.Z + (p2.Size.Z / 2));
} }
else else
{ {
contacts[i].depth = 0.0000000f; //contacts[i].depth = 0.0000000f;
} }
} }
// If you interpenetrate a prim with another prim // If you interpenetrate a prim with another prim