/// <summary> /// Give the actor hitting the other and the other a chance /// to respond to impact. /// </summary> /// <param name="mover"></param> /// <param name="hitInfo"></param> private void ApplyCollision(Mover mover, HitInfo hitInfo) { Debug.Assert(hitInfo.Other != null); if (mover.Owner.ActorHoldingThis == hitInfo.Other) { /// I'm touching what's holding me. return; } if (hitInfo.Other.ActorHoldingThis == mover.Owner) { /// I'm touching what I'm holding. return; } if (InGame.inGame.IsPickedUp(mover.Owner) && InGame.inGame.LastClonedThing == hitInfo.Other) { // Don't collide the selected object with the recent clone. clearLastClonedThing = false; return; } mover.Owner.ApplyCollisions(ref hitInfo); AdjustDelta(mover, hitInfo); GameActor other = hitInfo.Other; // The ordering of tests can change so we need to check if either of // the acotrs involved are missiles. if (mover.Owner is CruiseMissile || other is CruiseMissile) { // Actor has been hit by cruise missile. // Yes, it kind of sucks to have this here but none of the collision // information is stored on the Actor so we have to use it while we have it. // Note that we don't allow missiles to hit their launcher. if (other is CruiseMissile) { MissileChassis mc = other.Chassis as MissileChassis; if (mc != null && mc.Launcher != mover.Owner) { mc.HitTarget(mover.Owner, hitInfo); } } else { MissileChassis mc = mover.Owner.Chassis as MissileChassis; if (mc != null && mc.Launcher != other) { mc.HitTarget(other, hitInfo); } } } else { // Normal path that happens when two actors bump. hitInfo.Center = hitInfo.Struck; hitInfo.Normal = -hitInfo.Normal; hitInfo.Other = mover.Owner; hitInfo.Offset = MakeOffset(hitInfo, other.CollisionRadius); other.ApplyCollisions(ref hitInfo); AdjustDelta(hitInfo.OtherMover, hitInfo); } } // end of ApplyCollision()