본문으로 건너뛰기
버전: Minecraft 26.2

피해와 상태 효과

피해 이벤트​

// 한 번에 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) -> booleanfalse를 돌려주면 피해를 취소
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에 둡니다.
Buy me a coffee