// TODO: This should be in a separate system
  @ReceiveEvent(components = {HealthComponent.class})
  public void onLand(VerticalCollisionEvent event, EntityRef entity) {
    HealthComponent health = entity.getComponent(HealthComponent.class);

    if (event.getVelocity().y < 0 && -event.getVelocity().y > health.fallingDamageSpeedThreshold) {
      int damage =
          (int)
              ((-event.getVelocity().y - health.fallingDamageSpeedThreshold)
                  * health.excessSpeedDamageMultiplier);
      if (damage > 0) {
        checkDamage(
            entity, damage, EngineDamageTypes.PHYSICAL.get(), EntityRef.NULL, EntityRef.NULL);
      }
    }
  }
  static void damageEntity(AttackEvent event, EntityRef targetEntity) {
    int damage = 1;
    Prefab damageType = EngineDamageTypes.PHYSICAL.get();
    // Calculate damage from item
    ItemComponent item = event.getDirectCause().getComponent(ItemComponent.class);
    if (item != null) {
      damage = item.baseDamage;
      if (item.damageType != null) {
        damageType = item.damageType;
      }
    }

    targetEntity.send(
        new DoDamageEvent(damage, damageType, event.getInstigator(), event.getDirectCause()));
    // consume the event so that the health system can take priority over default engine behavior
    event.consume();
  }
  @ReceiveEvent(components = {HealthComponent.class})
  public void onCrash(HorizontalCollisionEvent event, EntityRef entity) {
    HealthComponent health = entity.getComponent(HealthComponent.class);

    Vector3f vel = new Vector3f(event.getVelocity());
    vel.y = 0;
    float speed = vel.length();

    if (speed > health.horizontalDamageSpeedThreshold) {
      int damage =
          (int)
              ((speed - health.horizontalDamageSpeedThreshold)
                  * health.excessSpeedDamageMultiplier);
      if (damage > 0) {
        checkDamage(
            entity, damage, EngineDamageTypes.PHYSICAL.get(), EntityRef.NULL, EntityRef.NULL);
      }
    }
  }