// 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); } } }