* Tweak the StopFlying() method in LLClientView to fabricate a suitable landing collision plane regardless of the actual physics situation. position.Z - AvatarHeight / 6f

soprefactor
Teravus Ovares (Dan Olivares) 2010-06-11 21:46:01 -04:00
parent c8ed972443
commit 99f2a1c347
1 changed files with 36 additions and 21 deletions

View File

@ -11845,6 +11845,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
public void StopFlying(ISceneEntity p)
{
if (p is ScenePresence)
{
ScenePresence presence = p as ScenePresence;
// It turns out to get the agent to stop flying, you have to feed it stop flying velocities
@ -11863,6 +11865,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
presence.AbsolutePosition = pos;
// attach a suitable collision plane regardless of the actual situation to force the LLClient to land.
// Collision plane below the avatar's position a 6th of the avatar's height is suitable.
// Mind you, that this method doesn't get called if the avatar's velocity magnitude is greater then a
// certain amount.. because the LLClient wouldn't land in that situation anyway.
// why are we still testing for this really old height value default???
if (presence.Appearance.AvatarHeight != 127.0f)
presence.CollisionPlane = new Vector4(0, 0, 0, pos.Z - presence.Appearance.AvatarHeight/6f);
else
presence.CollisionPlane = new Vector4(0, 0, 0, pos.Z - (1.56f/6f));
ImprovedTerseObjectUpdatePacket.ObjectDataBlock block =
CreateImprovedTerseBlock(p, false);
@ -11878,6 +11892,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
packet.ObjectData[0] = block;
OutPacket(packet, ThrottleOutPacketType.Task, true);
}
//ControllingClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
// AbsolutePosition, Velocity, Vector3.Zero, m_bodyRot, new Vector4(0,0,1,AbsolutePosition.Z - 0.5f), m_uuid, null, GetUpdatePriority(ControllingClient)));