피해와 상태 효과
피해 이벤트
// 한 번에 100 이상의 피해는 막음
mod.events().register(EntityEvents.ALLOW_DAMAGE, (entity, damage) -> damage.amount() < 100);
// 마법 피해를 절반으로 줄임
mod.events().register(EntityEvents.MODIFY_DAMAGE, (entity, damage) ->
damage.type().equals(ResourceId.minecraft("magic")) ? damage.amount() / 2 : damage.amount());
mod.events().register(EntityEvents.DIED, (entity, cause) ->
LOGGER.info("{} died ({})", entity.name(), cause.type()));
| 이벤트 | 리스너 | 뜻 |
|---|---|---|
ALLOW_DAMAGE | (LivingEntityView, DamageInfo) -> boolean | false를 돌려주면 피해를 취소 |
MODIFY_DAMAGE | (LivingEntityView, DamageInfo) -> float | 피해량을 바꿈 |
DIED | (LivingEntityView, DamageInfo) -> void | 사망한 뒤 |
DamageInfo는 type()(피해 유형 ID), amount(), attacker()를 제공합니다. 모든 리스너는 서버 스레드에서 호출됩니다.
- 피해량 수정:
ALLOW_DAMAGE에서 취소되지 않은 피해의 양을 리스너가 등록한 순서대로 바꿉니다. 피해량이 0 이하가 되면 피해가 취소됩니다. - 바뀐 양으로 게임의 피해 처리를 다시 호출하므로, 갑옷과 저항 효과는 바뀐 양을 기준으로 적용됩니다.
피해 주기
living.hurt(5); // 일반 피해. 취소되면 false를 반환
living.hurt(ResourceId.of("my_mod", "zap"), 3); // 데이터로 정의한 피해 유형
피해 유형은 데이터 팩의 data/<mod>/damage_type/<name>.json에 바닐라 형식으로 정의합니다.
상태 효과
mod.content().effect("glowing_heart", new EffectDefinition(EffectCategory.BENEFICIAL, 0xFFD54F, 20,
(entity, amplifier) -> entity.setHealth(entity.health() + 1)));
living.addEffect(ResourceId.of("my_mod", "glowing_heart"), 100, 0); // 틱, 증폭
living.hasEffect(ResourceId.minecraft("glowing"));
EffectDefinition(category, color, tickInterval, behavior)의 인수는 순서대로 분류, 색, 몇 틱마다 동작할지, 동작(EffectBehavior.onTick)입니다.- 동작은 서버 스레드에서 실행됩니다.
- 효과 아이콘은
assets/<mod>/textures/mob_effect/<name>.png에 둡니다.