/attribute: 기본값과 수정자(modifier), 그리고 값이 계속 초기화되는 이유
기본값을 설정하면 영구적이고 수정자를 설정하면 그렇지 않습니다 — 잘못된 연산을 고르지 않는 한. 세 가지 연산, 적용 순서, 그리고 슬롯 함정. 수정자 id가 이제 네임스페이스를 쓰는 점도 다룹니다.
/attribute는 하나의 명령어에 세 개의 하위 명령어가 있는 것처럼 보입니다. 하지만 실제로는 이름만 공유할 뿐 서로 다른 두 시스템이며, 이를 혼동하면 값이 계속 원래대로 돌아갑니다.
기본값 vs 수정자
/attribute @s minecraft:max_health base set 40
/attribute @s minecraft:max_health modifier add my_buff 20 add_value
base set는 엔티티 자체의 값을 덮어씁니다. 리로드 후에도 유지되며, 다른base set외에는 아무것도 제거하지 못합니다.modifier add는 이름이 붙은 조정값을 그 위에 쌓습니다. 기본값과 마찬가지로 엔티티와 함께 저장되고, id를 가지며, 그 id로 제거할 수 있습니다.
변경 사항이 사라지지 않는다면, base set를 사용해서 base reset가 필요하거나, modifier remove <id>가 필요한 수정자를 추가한 것입니다.
세 가지 연산과 적용 순서
| 연산 | 하는 일 | 적용 시점 |
|---|---|---|
add_value | 값 + n | 첫 번째 |
add_multiplied_base | 값 + (기본값 × n) | 두 번째 |
add_multiplied_total | 누적 합계 × (1 + n) | 마지막 |
순서는 고정되어 있으며 중요합니다. 기본값 20에서 시작하여 add_value 10와 add_multiplied_total 0.5를 적용하면:
20 → 30 → 45 not 20 → 30 → 30 + 10 = 40
add_multiplied_base는 add_value 수정자가 더해진 후에 기본값에 곱합니다 — 누적 합계가 아니라 — 그래서 두 개를 적용하면 복리로 쌓이지 않고 선형으로 더해집니다.
수정자 id는 이제 네임스페이스를 사용합니다
예전 버전에서는 UUID를 사용했습니다. 최신 버전에서는 네임스페이스 id를 사용합니다:
/attribute @s minecraft:attack_damage modifier add my_pack:rage 5 add_value
같은 id로 두 번째 수정자를 추가하면 쌓이거나 대체되는 대신 "Modifier … is already present" 오류와 함께 실패합니다. 버프를 갱신하려면 먼저 modifier remove로 제거하세요.
장비 수정자는 엔티티가 아니라 아이템에 있습니다
검의 공격력 보너스는 attribute_modifiers 아이템 컴포넌트이며, 아이템이 올바른 슬롯에 있을 때만 적용됩니다:
/give @s diamond_sword[attribute_modifiers=[{type:"attack_damage",amount:5,
operation:"add_value",slot:"mainhand",id:"my:bonus"}]]
slot를 빠뜨리는 것이 흔한 실수입니다. 기본값이 any이므로, 수정자가 모든 장비 슬롯에 적용됩니다 — 검이 주 손이 아니라 보조 손이나 방어구 슬롯에서도 버프를 줍니다.
유효한 슬롯: mainhand, offhand, hand, head, chest, legs, feet, armor, body, saddle, any.
값 다시 읽기
/attribute @s minecraft:max_health get
는 수정자를 포함한 실효 총합을 반환합니다. /attribute @s minecraft:max_health base get는 기본값만 반환합니다.
슬롯이 설정된 아이템 컴포넌트 형식을 포함하여 이 모든 것을 Entity & Combat Command Builder에서 만들 수 있습니다.