// this should be called only from other vehicles
        void IVehicle.Collide(IVehicle otherVehicle, VehicleCollisionInfo info)
        {
            if (Health == 0)
            {
                return;
            }

            float damage = info.Damage;

            // receive damage
            if (damage > 0)
            {
                // receive damage
                ReceiveDamage(Damage.CreateBulletDamage(
                                  damage, -Vector3.forward, info.CollisionPoint, info.CollisionNormal, info.Initiator));
            }

            // collide other with this, player don't send them damage
            var backInfo = new VehicleCollisionInfo();

            backInfo.ThisWithOther   = false;
            backInfo.Initiator       = Player.gameObject;
            backInfo.CollisionPoint  = info.CollisionPoint;
            backInfo.CollisionNormal = -info.CollisionNormal;

            otherVehicle.Collide(this, backInfo);

            // call event even if damage == 0
            OnVehicleCollision(otherVehicle, damage);
        }
        void OnCollisionEnter(Collision col)
        {
            var other = col.collider.GetComponent <IVehicle>();

            if (other != null)
            {
                VehicleCollisionInfo info = new VehicleCollisionInfo();

                // if driver is still alive,
                // then send full damage,
                // otherwise nothing
                info.Damage = State == EnemyVehicleState.Active ? data.CollisionDamage : 0;

                // set to true as other vehicle must call 'Collide' method
                // on this one with other data
                info.ThisWithOther = true;

                info.Initiator = gameObject;

                // there is always at least one contact,
                // so this check is unnecessary
                if (col.contacts.Length > 0)
                {
                    info.CollisionPoint  = col.contacts[0].point;
                    info.CollisionNormal = col.contacts[0].normal;
                }

                other.Collide(this, info);
            }
        }
        public void Collide(IVehicle other, VehicleCollisionInfo info)
        {
            ReceiveDamage(Damage.CreateBulletDamage(
                              info.Damage, Vector3.forward, transform.position, Vector3.up, null));

            if (info.ThisWithOther)
            {
                VehicleCollisionInfo backInfo = new VehicleCollisionInfo();
                backInfo.Damage = State == EnemyVehicleState.Active ? data.CollisionDamage : 0;

                // don't process it on other side (to prevent loop)
                backInfo.ThisWithOther = false;

                backInfo.Initiator = gameObject;

                backInfo.CollisionPoint  = info.CollisionPoint;
                backInfo.CollisionNormal = -info.CollisionNormal;

                other.Collide(this, backInfo);
            }

            DoVehicleCollision(info.Initiator);
        }