마인크래프트의 선택자 세부 조건 중, 엔티티의 nbt를 검사하는 nbt={} 인자가 존재합니다. 해당 엔티티의 nbt 기능과 자료형만 충분히 숙지한다면, 꽤나 편리하게 사용할 수 있습니다.

예를 들어, “투명한 갑옷 거치대”는 다음 조건으로 탐색할 수 있습니다.

또한, !(조건 뒤집기)를 삽입할 수 있으며, “조용하지 않은 모든 엔티티”는 다음 조건으로 탐색할 수 있습니다.

그러나 nbt={}는 생각보다 매우, 매우 성능을 하락시킵니다. 간단하게 tag 세부 조건과 비교해 보겠습니다.

🤔 뭔가 이상하군요. 왜 이렇게 차이가 나는 걸까요?

우선 nbt={} 인자를 구성하는 코드를 살펴보도록 합시다.

image.png

3번째 줄에 현재 작성된 nbt={} 구문을 compoundtag에 저장하는 동작을 수행하는 것을 확인할 수 있습니다.

이후(5번째 줄), compoundtag2 변수에 nbt={} 구문이 적용되는 엔티티의 nbt를 새 CompoundTag 객체를 생성해 saveWithoutId 메서드(직역하면 id 없이, 즉, Passengers를 제외한 nbt를 저장한다는 의미. 즉, 얘가 랙의 주원인)를 실행합니다.

다음으로 플레이어면서, 어떤 아이템을 들고 있다면, 특수 nbtSelectedItem을 삽입합니다.

최종적으로 compareNbt 메서드를 실행해 boolean을 반환합니다.

참고로 하단의 entityselectorparser6 -> { return true; } 람다함수는 이 인자가 중복 사용될 수 있는지를 설정합니다. nbt={}의 경우에는 중첩하여, 이용할 수 있습니다. (e. g. [nbt={Silent:1b}, nbt={OnGround:1b}, nbt={Invisible:1b}]) 이렇게 중복 사용하면 성능을 더욱 저하시킵니다. [MC-257155]

saveWithoutId