01. 선택자 - 대상 지정하기 [Minecraft Command]

doi, ywbird·2023년 5월 4일
1
post-thumbnail

마인크래프트 커맨드에서 가장 중요한 것중 하나는 대상 지정입니다.
거의 모든 커맨드는 그 명령어를 누구에게 어떻게 실행할지 정해야하기 때문입니다.

기초

기본적인 선택자

@s 자신을 지정

현재 이 명령을 실행하고 있는 대상(자신)을 지정할때에는 @s를 사용합니다.
다음과 같이 사용할 수 있습니다.

teleport @s 10 60 10

이렇게 플레이어가 사용하게 되면 10 60 10의 위치로 순간이동 하게 됩니다.

물론 아래와 같이 @s 없이 사용할 수도 있지만 커맨드 작업을 하다보면 필수로 자신을 선택해야하는 때가 옵니다.
teleport 10 60 10

@a 모든 플레이어를 지정

모든 플레이어를 지정할때에는 @a를 사용합니다.
다음과 같이 사용할 수 있습니다.

teleport @a 10 60 10

이렇게 사용하게 되면 모든 플레이어가 10 60 10의 위치로 순간이동 하게 됩니다.

@e 모든 엔티티 지정

모든 엔티티를 지정할때에는 @e를 사용합니다.
다음과 같이 사용할 수 있습니다.

teleport @e 10 60 10

이렇게 사용하게 되면 모든 엔티티가 10 60 10의 위치로 순간이동 하게 됩니다.

@p 가장 가까운 플레이어 지정

가장 가까운 플레이어를 지정할때에는 @p를 사용합니다.
다음과 같이 사용할 수 있습니다.

teleport @p 10 60 10

이렇게 사용하게 되면 가장 가까운 플레이어가 10 60 10의 위치로 순간이동 하게 됩니다.

@p를 플레이어가 사용하게되면 당연하게도 자신을 선택하게 됩니다.
하지만 커맨드 블럭에 입력하고 사용하게 되면 멀티 플레이 전용 맵을 제작할때 큰 도움이 되죠.

@r 랜덤한 플레이어 지정

랜덤한 플레이어를 지정할때에는 @r을 사용합니다.
물론 싱글 플레이에서 사용한다면 자신을 선택하게 되겠죠.
다음과 같이 사용할 수 있습니다.

teleport @r 10 60 10

이렇게 사용하게 되면 랜덤한 플레이어가 10 60 10의 위치로 순간이동 하게 됩니다.

고급

응용이 가능한 조건들

모든 선택자뒤에는 []를 붙여 조건을 만족하는 대상만을 지정할 수 있습니다.
또, 조건 앞에 !를 붙여 그 조건을 만족하지 않는 대상을 선택할 수도 있습니다.
(물론 충족되는 없다면 아무것도 선택되지 않습니다.)

@e[type=minecraft:armor_stand]
아머스탠드만을 선택

@e[type=!minecraft:armor_stand]
아머스탠드를 제외하고 선택

또한 여러 조건을 ,을 이용해 여러 조건을 걸 수도 있습니다.

위에서는 예시로 type을 사용했지만 종류가 총 스물 한가지이기 때문에 중요한것을 제외하고는 간단히 설명하고 넘어가겠습니다.

advancements

도전과제를 기준으로 플레이어 선택합니다.
(도전과제는 플레이어만 달성할 수 있기 때문에 실행시 플레이어만 감지됩니다.)

@a[advancements={story/root=true} 이렇게 마인크래프트를 처음 시작하면 받는 도전과제인 story/root를 받은 엔티티(플레이어)만 구별해 낼 수 있습니다.

@a[advancements={adventure/kill_all_mobs={zombie=true}}] 이렇게 모든 적대적 몹을 죽이는 도전과제중 좀비를 죽여본 플레이어만 선택하는등, 도전과제에 포함된 일부를 선택할 수도 있습니다.

모든 도전과제 정리

distance

여러 커맨드에서 거리나 반경등 자주 쓰이는 선택자로, 거리를 기준으로 선택합니다.

@e[distance=5]
정확히 5블록 떨어져있는 모든 엔티티를 선택합니다.
이경우 소수점도 용납하지 않고 정확히 5칸 떨어져있는 엔티티만을 탐지합니다.

하지만 위처럼 정확히 탐지하는것을 크게 쓸모가 없기때문에 마인크래프트는 범위 선택을 지원합니다.

@e[distance=..5]
5칸 이내에 있는 모든 엔티티를 탐지합니다.

@e[distance=2..5]
2칸 초과, 5칸 이내에 있는 모든 엔티티를 탐지합니다.

n..m을 통해 n 초과, m이하의 범위를 탐지할 수 있습니다.

물론 소수점도 가능합니다.
@e[distance=2.1..5.6]
2.1칸 초과, 5.6칸 이내에 있는 모든 엔티티를 탐지합니다.

gamemode

플레이어의 게임모드를 기준으로 선택합니다.

@a[gamemode=adventure]
gamemode설명
adventure어드벤처 모드인 플레이어만을 선택합니다.
creative크리에이티브 모드인 플레이어만을 선택합니다.
spectator관전자 모드인 플레이어만을 선택합니다.
survival서바이벌 모드인 플레이어만을 선택합니다.
!adventure어드벤처 모드인 플레이어를 제외하고 선택합니다.
!creative크리에이티브 모드인 플레이어를 제외하고 선택합니다.
!spectator관전자 모드인 플레이어를 제외하고 선택합니다.
!survival서바이벌 모드인 플레이어를 제외하고 선택합니다.

level

레벨을 기준으로 플레이어를 선택합니다.

@a[level=5]
정확히 5레벨인 플레이어를 선택합니다.

distance와 마찬가지로 범위 선택이 가능합니다.

@e[level=30..]
레벨이 30 이상인 플레이어만 선택합니다.

limit

자주 쓰이는 조건중 하나로 선택될때 개수의 제한을 걸어줍니다.

@a[limit=5]
5개만을 선택합니다.

사실 이것 만으로는 잘 쓰이지 않고 바로 다음에 설명할 sort와 함께 쓰이는 경우가 대부분입니다.

sort

선택하는 순서를 정합니다.
이 조건만 있어서는 큰 변화가 없고, limit과 함께 쓰면 진가를 발휘합니다.

  • sort=nearest — 거리가 가장 가까운 순서대로 정렬됩니다. (@p에 기본으로 사용됩니다.)
  • sort=furthest — 거리가 가장 먼 순서대로 정렬됩니다.
  • sort=random — 랜덤으로 정렬합니다. (@r에 기본으로 사용됩니다.)
  • sort=arbitrary — 정렬하지 않습니다. 일반적으로 게임이 처리하는 순서대로 선택됩니다. (@e@a에 사용됩니다.)

@e[limit=1,sort=nearest]
가장 가까운 엔티티 하나를 선택합니다.

@e[limit=4,sort=random]
아무 엔티티 4개를 선택합니다.

name

이름을 기준으로 엔티티를 선택합니다.
플레이어는 물론 CustomName을 설정한 엔티티또한 선택할 수 있습니다.

@e[name=steve]
이름이 steve인 엔티티를 선택합니다.

nbt

nbt를 기준으로 엔티티를 선택합니다.
nbt는 선택 조건중 가장 어렵다고 해도 무방하지만 한번 알고나면 쉽기도 합니다.

마인크래프트는 여러 데이터를 nbt형식으로 저장하는데, 예를 들어 아래와 같습니다.

아래는 아머스탠드의 기본 nbt입니다.
아머스탠드 nbt

nbt는 자바의 데이터 타입을 따라갑니다.
https://www.w3schools.com/java/java_data_types.asp

@e[nbt={Small:1b},type=armor_stand]
Small1b인 아머스탠드를 선택합니다.
(작은 아머스탠드를 선택합니다.)

아니면 아래 처럼 해당 부분이 존재하는지만 확인도가능합니다.
@e[nbt={attack:{}}
attack 오브젝트가 존재하는 엔티티를 선택합니다.

predicate

predicate은 데이터팩으로만 생성할 수 있는 일종의 감지 기능입니다.
predicate을 이용해 유저가 웅크리고 있는지, 팀이 무었인지등 여러가지를 알아 낼 수 있고, predicate으로만 알아낼 수 있는것도 있습니다.

한 포스팅에 담기에는 많은 내용이니 잘 나와있는 유튜브 링크를 첨부하겠습니다.
https://youtu.be/lvMCaPOF-mU

만약 test:is_sneaking이라는 predicate을 통과하는 유저를 선택하고 싶다면 다음과 같이 할 수 있습니다.
@a[predicate=test:is_sneaking]

scores

scores는 마인크래프트의 데이터 저장 시스템인 scoreboard의 score를 기준으로 엔티티를 선택합니다.

@e[scores={count=1}]
count 스코어가 1인 엔티티를 선택합니다.

@e[scores={count=1,death=4}]
count 스코어가 1이고, death가 4인 엔티티를 선택합니다.

이것도 범위 선택이 가능합니다.

@e[scores={count=1..10}]
count 스코어가 1초과, 10이하인 엔티티를 선택합니다.

tag

tag를 기준으로 엔티티를 선택합니다.

@e[tag=initial]
태그가 initial인 엔티티를 선택합니다.

@e[tag=zombie,tag=horse]
태그가 zombie와 horse인 엔티티를 선택합니다.

team

team을 기준으로 엔티티를 선택합니다.

@e[tag=BLUE]
팀이 BLUE인 엔티티를 선택합니다.

type

type을 기준으로 엔티티를 선택합니다.

@e[type=minecraft:armor_stand]

type이 minecraft:armor_stand인 엔티티를 선택합니다.

x,y,z,dx,dy,dx

좌표를 기준으로 엔티티를 선택합니다.

@e[x=a,dx=m,z=b,dz=m]
x좌표가 a이상 a+m 이하, z좌표가 b이상 b+n 이하인 엔티티를 선택합니다.

x-dx-z-dz

이 경우 엔티티의 좌표가 기준이 아닌 엔티티의 히트박스를 기준으로 합니다.
이렇게 히트박스가 범위에 닿기만 해도 감지되는 것입니다.

x-dx-z-dz-2

예제에서는 x, dx, z, dz만 사용하였지만 물론 y, dy또한 가능합니다.

여기서 좌표는 상대좌표(~)가 아닌 절대 좌표를 사용해야합니다.
또, 좌표를 1같이 입력하면 자동으로 1.5로 조정되므로, 정확히 1을 사용하고싶다면 1.0을 사용해야합니다.

마무리

이번 포스팅으로 왠만한 선택자는 사용하실 수 있으실 겁니다.
긴 글 읽어주셔서 감사합니다.

참고

profile
I'm boring.

0개의 댓글