private void PhysicsCollisionUpdate(EventArgs e)
{
if (e == null)
return;
//if ((Math.Abs(Velocity.X) > 0.1e-9f) || (Math.Abs(Velocity.Y) > 0.1e-9f))
// The Physics Scene will send updates every 500 ms grep: m_physicsActor.SubscribeEvents(
// as of this comment the interval is set in AddToPhysicalScene
if (Animator!=null)
Animator.UpdateMovementAnimations();
CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList;
CollisionPlane = Vector4.UnitW;
if (coldata.Count != 0 && Animator != null)
{
switch (Animator.CurrentMovementAnimation)
{
case "STAND":
case "WALK":
case "RUN":
case "CROUCH":
case "CROUCHWALK":
{
ContactPoint lowest;
lowest.SurfaceNormal = Vector3.Zero;
lowest.Position = Vector3.Zero;
lowest.Position.Z = Single.NaN;
foreach (ContactPoint contact in coldata.Values)
{
if (Single.IsNaN(lowest.Position.Z) || contact.Position.Z < lowest.Position.Z)
{
lowest = contact;
}
}
CollisionPlane = new Vector4(-lowest.SurfaceNormal, -Vector3.Dot(lowest.Position, lowest.SurfaceNormal));
}
break;
}
}
if (m_invulnerable)
return;
float starthealth = Health;
uint killerObj = 0;
foreach (uint localid in coldata.Keys)
{
SceneObjectPart part = Scene.GetSceneObjectPart(localid);
if (part != null && part.ParentGroup.Damage != -1.0f)
Health -= part.ParentGroup.Damage;
else
{
if (coldata[localid].PenetrationDepth >= 0.10f)
Health -= coldata[localid].PenetrationDepth * 5.0f;
}
if (Health <= 0.0f)
{
if (localid != 0)
killerObj = localid;
}
//m_log.Debug("[AVATAR]: Collision with localid: " + localid.ToString() + " at depth: " + coldata[localid].ToString());
}
//Health = 100;
if (!m_invulnerable)
{
if (starthealth != Health)
{
ControllingClient.SendHealth(Health);
}
if (m_health <= 0)
m_scene.EventManager.TriggerAvatarKill(killerObj, this);
}
}