/attribute: 기본값과 보정값, 그리고 자꾸 초기화되는 이유
기본값 설정은 영구적이지만, 보정값 설정은 그렇지 않습니다. 잘못된 연산 방식을 선택하면 초기화될 수 있습니다. 세 가지 연산 방식, 적용 순서, 그리고 슬롯 함정에 대해 알아봅니다.
/attribute는 세 가지 하위 명령을 가진 하나의 명령처럼 보입니다. 하지만 실제로는 우연히 이름만 공유하는 두 가지 다른 시스템이며, 이 둘을 혼동하는 것이 값이 자꾸 원래대로 돌아가는 이유입니다.
기본값 대 보정값
/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이 필요합니다.
세 가지 연산 방식과 적용 순서
| 연산 | 내용 | 적용 순서 |
|---|---|---|
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_multiplied_base이 복합적으로 작용하는 대신 가산적으로 누적되는 이유입니다.
보정값 ID는 이제 네임스페이스를 사용합니다
이전 버전에서는 UUID를 사용했습니다. 최신 버전에서는 네임스페이스 ID를 사용합니다:
/attribute @s minecraft:attack_damage modifier add my_pack:rage 5 add_value
동일한 ID로 두 번째 보정값을 추가하면 첫 번째 보정값이 누적되는 대신 교체됩니다. 이것이 버프를 새로 고치는 의도된 방식입니다. 먼저 제거할 필요가 없습니다.
장비 보정값은 엔티티가 아닌 아이템에 존재합니다
마법이 부여된 검의 피해 보너스는 attribute_modifiers 아이템 컴포넌트이며, 아이템이 올바른 슬롯에 있을 때만 적용됩니다:
/give @s diamond_sword[attribute_modifiers=[{type:"attack_damage",amount:5,
operation:"add_value",slot:"mainhand",id:"my:bonus"}]]
slot은 필수이며 흔한 실수입니다. 이를 생략하면 보정값이 모든 슬롯에 적용되어, 인벤토리에 있는 검이 그곳에 있는 동안 버프를 줍니다.
유효한 슬롯: mainhand, offhand, head, chest, legs, feet, armor, body, any.
값 읽어오기
/attribute @s minecraft:max_health get
는 유효한 총합이 아닌 기본값을 반환합니다. 보정값을 포함한 총합을 얻으려면 스코어보드에서 execute store result을 사용하고 그 값을 읽으세요.
슬롯이 설정된 아이템 컴포넌트 형식을 포함하여 이 모든 것을 엔티티 및 전투 명령 생성기에서 만들 수 있습니다.