응 아니야

안녕하세요. 당이천입니다.

 

마인크래프트 명령어의 꽃.. 은 execute지만 아무튼 비스무리하게 중요한 /data에 대해서 알아봅니다. 글 하나로 마무리 하기에는 내용이 많고 짚고 갈만한 사소한 정보나 팁이 있으므로 장을 절로 나누었습니다.

 

이번 절은 제 1절로써 get을 먼저 다룹니다.

 

/data get은 '엔티티 또는 블록엔티티 또는 저장공간'에 저장된 값을 반환해주는 명령어입니다. 즉, 조회입니다.

조회할 값을 입력하고 경로대로 찾아가면 원하는 값에 접근할 수 있습니다.

 

아주 많이 아쉽게도.. 플레이어의 값은 조회만 가능하고 수정은 불가능합니다. 모장이 안 해준다고 하네요. 보안이나 저연령층 보호가 목적이지 않을까 생각해봅니다.

 

아무튼 get은 data 명령어의 하위 인자로써 merge / modify / remove와 함께 있습니다.

 

/data get

하위 인자로 block, entity, storage가 있는데 차례로 블록엔티티, 엔티티, 저장소입니다.

 

/data get block

블록엔티티 조회부터 알아봅니다. 하위 인자로는 좌표값과 경로값 그리고 스케일이 있습니다. 좌표는 xyz, 경로는 JSON 형식의 nbt입니다. 스케일은 저번 attribute 장에서 말씀드렸듯 반환값 뻥튀기입니다.

 

블록엔티티가 뭔지부터 알아야합니다. 블록엔티티는 블록처럼 설치하되 엔티티처럼 정보를 가진 블록을 말합니다. 플레이어와의 상호작용이 주된 목적입니다. 상자도 침대로 벨도 전달체도 그림도 블록엔티티입니다.

 

목록은 아래와 같습니다.

 

목록목록목록목록목록목록목록목록목록목록목록목록목록목록목록

 

/data get block ? ? ?

블록엔티티에 뭐가 있는지 알아봤으니 하나를 골라서 조회해보겠습니다.

절대좌표 0.0 0.0 0.0

상대좌표 ~ ~ ~

시점좌표 ^ ^ ^

모두를 허용합니다.

16 -63 -6 절대좌표를 선택했고 이곳에 상자를 설치하여 조회합니다.

/data get block 16 -63 -6을 입력해봅니다.

아무것도 없는 상자의 데이터를 읽어왔습니다. xyz 값과 id, 아이템의 정보가 담겨있습니다.

각종 아이템을 집어넣고

다시 조회해봅니다.

 

0슬롯부터 3슬롯까지 아이템의 id와 갯수를 조회했습니다.

 

이번에는 '수선'이 부여된 다이아몬드 검을 넣어봤습니다. 태그값에 인챈트먼트 중 1레벨의 mending이라는 마법이 부여되었음을 조회했습니다. (damage는 내구도가 있는 아이템이 손상된 정도. 즉, 닳은 내구도를 말합니다.)

 

좌표값 뒤에 경로(path)라는 인자가 있다고 했습니다. 필수는 아니지만 저장된 값이 많아 읽기 힘들거나 찾기 힘들 때 사용하면 좋습니다.

 

경로는 JSON 문법을 따르며 위에서 아래로 하나씩 찾아들어가는 방식입니다. 마치 나무 기둥에서 가지, 잎으로 하나씩 찾아가는 느낌이죠.

 

블록 데이터가 {}로 감싸져있으므로 다른 값 없이 /data get block 16 -63 -6 x를 입력하면 16을 반환합니다.

 

x, y, z, id, Items가 최상위값이므로 

/data get block 16 -63 -6 x

/data get block 16 -63 -6 y

/data get block 16 -63 -6 z

/data get block 16 -63 -6 id

/data get block 16 -63 -6 Items

처럼 하나의 경로만 입력하면 값을 조회할 수 있습니다.

 

주의할 것이 하나 있습니다. 이 경로 인자에서 대소문자를 구분합니다. items는 조회할 수 없고 Items는 조회할 수 있습니다. 반드시 대소문자를 확인하세요.

 

숫자와 다르게 문자열은 쌍따옴표(")로 감싸져서 값이 반환되는데 상관없습니다. minecraft:chest가 맞습니다.

이제 저장된 아이템을 가지고 하위 경로로 찾아가보겠습니다. 점(.)으로 구분합니다.

 

찾기 전에 주의할 점이 하나 더 있습니다. 중괄호가 여럿이면 대괄호로 감싸져있다는 것입니다.

 

Items도 마찬가지로 아이템들을 하나씩 중괄호로 감싸고 있고 쉼표로 구분하고 이 아이템들 모두는 하나의 대괄호로 묶여있습니다.

[로 시작해서 {Slot: 0b, 식입니다. [{},{},{},{},{}] 이런 모양입니다 맞죠?

 

마법부여도 여러개 할 수 있으므로 개행과 띄어쓰기를 넣어서 풀어서 보자면 아래와 같은 모습입니다.

{

Slot: 4b,

id:"minecraft:diamond_sword",

Count: 1b,

tag:

    {
    Damage: 0,

    Enchantments:

        [

            {

            lvl: 1s,

            id: "minecraft:mending"

            }

        ]

    }

}

 

수선이 중괄호안에, 중괄호는 대괄호 안에 들어있습니다. 내구성 3을 또 부여한다면 어떨까요?

 

{

Slot: 4b,

id:"minecraft:diamond_sword",

Count: 1b,

tag:

    {
    Damage: 0,

    Enchantments:

        [

            {

            lvl: 1s,

            id: "minecraft:mending"

            },

            {

            lvl: 3s,

            id: "minecraft:unbreaking"

            }

        ]

    }

}

 

이런 모습이 되겠습니다. 하나씩 써가며 원하는 값을 향해.. 가보겠습니다.

 

경로의 이름이 있는 경우에는 이름을 쓰고 대괄호로 감싸진 경우에는 인덱스(0,1,2,3,4,5 등등 순서를 말함)를 넣어줘야합니다. 경로를 지정한 경우 하나만 읽을 수 있기 때문입니다.

 

또한 경로의 높고 낮음은 점으로 구분하고, 태그 안에 고저의 차이가 없는 값이 여러개일 때는 조회하고자 하는 값의 인덱스에 대괄호를 감싸줘야합니다.

 

/data get block 16 -63 -6 Items 뒤에 넣을 값은 .[]이며 []는 모두를 조회하는 것이니

하나만 읽도록 /data get block 16 -63 -6 Items.[4]가 되어야합니다. (값은 5개있고 인덱스는 0부터 시작하므로)

 

네 4번 인덱스의 다이아몬드 검만을 조회했습니다.

여기선 [대괄호]가 감싸지 않으므로

/data get block 16 -63 -6 Items.[4].Slot

/data get block 16 -63 -6 Items.[4].id

/data get block 16 -63 -6 Items.[4].Count

/data get block 16 -63 -6 Items.[4].tag

처럼 곧바로 경로의 이름을 입력하면 됩니다.

 

마지막 명령어 tag를 입력해보았습니다. 하위 경로에 데미지와 인첸트먼트가 나옵니다.

 

/data get block 16 -63 -6 Items.[4].tag.Enchantments를 입력하여 대괄호를 또 만납니다.

 

수선을 보려면 /data get block 16 -63 -6 Items.[4].tag.Enchantments.[0]

내구성 3을 보려면 /data get block 16 -63 -6 Items.[4].tag.Enchantments.[1]이 됩니다.

 

저는 내구성 3의 레벨을 최종 선택했습니다.

 

이것이 '상세조회' 방법입니다. 아이템에 nbt태그가 많고 길수록 더 x같아지므로 자주 해보는 것이 좋습니다.

 

또한 인덱스 값은 문자열 자동정렬 문제로 nbt가 업데이트될 때 갑자기 뒤바뀔 수 있으므로 인덱스 이외의 값을 미리 조회하여여 일치함을 확인(조건)하는 것이 좋습니다.

 

※조회된 숫자 뒤에 s,d,f 등이 붙는데 데이터 타입입니다. 컴퓨터 메모리에 값을 저장할 때 어떤 유형으로 저장했느냐를 가리킵니다. 컴퓨터 메모리의 공간은 유한합니다. 따라서 한정된 공간에서 작업을 해야하며 작업 시 빠르고 효율적인 공간 활용이 필요합니다. 이 활용성을 극대화하기 위해 작업 시 필요한 만큼만 공간을 할당해주도록 유형을 미리 정의합니다. 이것이 데이터 타입입니다. 인챈트 레벨이 2천이든 2억이든 무슨 차이가 있겠습니까?

 

블록을 조회해봤습니다.

 

/data get entity

엔티티는.. 블록 그리고 블록엔티티를 제외한 것 중에, 플레이어와 상호작용이 가능한 개체를 말합니다. 돼지도 엔티티 플레이어도 엔티티 드랍된 아이템도 엔티티 엔더드래곤이 뱉은 브레스도 엔티티 떨어지고 있는 블록도 엔티티 점화된 tnt도 엔티티 보트도 엔티티.. 아무튼 뭐 좀 움직인다 싶으면 엔티티입니다.

 

엔티티도 블록과 똑같습니다.

 

block 인자를 entity로 고쳐쓰면 끝이고 하위 인자는 대상선택인자이므로 대상을 선택한 다음 위에서 보았듯 하나씩 찾아가면 됩니다.

 

/data get entity @e[type=pig,limit=1,sort=nearest]

저는 저와 가장 가까운 돼지 1마리를 선택했습니다.

 

/attribute 때 보았던 특성값도 보이고, 안장(Saddle) 유무도 보이고 엔티티의 고유번호(uuid)나 현재체력(health)이 9인 것, 위치(Pos)값도 보입니다.

 

※ 모든 엔티티가 똑같은 값을 가지고 있지는 않습니다. 조금씩 다른 값을 가지고 있죠. 또한 같은 값을 가지고 있더라도 누구는 적용되고 누구는 적용되지 않는 경우도 있습니다.

 

하지만 아무리 많은 정보가 있더라도 천천히.. 하나씩 찾아들어가면 원하는 값을 얻을 수 있습니다. 방법을 알잖아요? 지금 바로 해보세요. 잘 찾으셨나요?

 

찾기 힘드셨나요? 이쯤에서 좋은 팁을 하나 알려드리겠습니다.

 

저렇게 정리되지 않은 JSON은 읽기 어렵습니다. 뭐가 위고 아래인지 구분 못해먹겠습니다. json 문법에 맞춰서 정리해주는 사이트가 있습니다. 그 사이트에 저 값을 넣어 정리해보겠습니다. 구문분석을 해주는 (제이슨 파서라고 불리는 것 같습니다.)

 

우선 사이트 링크부터 알려드립니다.

 

http://json.parser.online.fr/

 

저 사이트를 일단 켜놓고, 돼지의 값을 가져와야합니다. 돼지를 바라보고 F3+i를 누릅니다.

그러면 복사가 됩니다. 다만 '서버 측'이기 때문에 /data 명령어를 사용할 수 있는 권한(op)을 가지고 있어야합니다. 없으면 좌표정도만 복사됩니다.

 

/summon minecraft:pig 16.50 -62.13 -5.50 {Brain: {memories: {}}, HurtByTimestamp: 0, Attributes: [{Base: 0.25d, Name: "minecraft:generic.movement_speed"}, {Base: 16.0d, Modifiers: [{Amount: 0.10852864974996444d, Operation: 1, UUID: [I; -536039904, -851621472, -1748761247, -665936480], Name: "Random spawn bonus"}], Name: "minecraft:generic.follow_range"}], Invulnerable: 0b, FallFlying: 0b, ForcedAge: 0, PortalCooldown: 0, AbsorptionAmount: 0.0f, Saddle: 0b, FallDistance: 0.0f, InLove: 0, DeathTime: 0s, HandDropChances: [0.085f, 0.085f], PersistenceRequired: 0b, Age: 0, Motion: [0.0d, -0.0784000015258789d, 0.0d], Health: 10.0f, LeftHanded: 0b, Air: 300s, OnGround: 1b, Rotation: [140.57782f, 0.42461935f], HandItems: [{}, {}], ArmorDropChances: [0.085f, 0.085f, 0.085f, 0.085f], Fire: -1s, ArmorItems: [{}, {}, {}, {}], CanPickUpLoot: 0b, HurtTime: 0s}

 

돼지 소환 명령어로 복사되기 때문에 /summon minecraft:pig 16.50 -62.13 -5.50 부분을 지우고 맨앞과 맨뒤에 있는 {중괄호} 부분만 남겨서 parser 사이트에 붙여넣습니다.

 

그러면 화면 오른쪽에 잘 정리된 상태로 값이 출력됩니다. 저걸 보고 경로를 완성하시면 편합니다.

 

attributes가 많은 정보를 담고 있으니 그 중에서 랜덤 스폰 보너스 특성의 uuid 또 그 중에서 -66으로 시작하는 마지막 값을 조회해보겠습니다.

 

대괄호에 유의해서 하나씩 찾아가면 아래와 같은 명령어로 조회할 수 있습니다.

 

/data get entity @e[type=pig,limit=1,sort=nearest] Attributes.[1].Modifiers.[0].UUID.[3]

 

마지막으로 스케일까지 붙여주면 되지만, 스케일은 앞에서도 설명드렸다시피 뻥튀기 값입니다. 스킵합니다.

 

엔티티 조회를 알아봤습니다.

 

/data get storage

이제 하나 남은 저장소.. 스토리지에 대해서 알아봅니다.

스토리지에는 하위 인자가 3개있습니다. 타겟경로 그리고 스케일입니다.

스케일은 익히 알고 타겟은 저장된 파일의 이름, 경로는 Attributes.[1]같은 값입니다.

 

/data get storage <arg>

타겟은 저장소의 이름입니다.

/data get storage test

최초에는 저장된 값이 없기(?) 때문에 무엇을 입력하더라도 {}라는 값만을 반환합니다.

 

{중괄호}?

 

블록엔티티나 엔티티에서 보았듯 이 저장소 역시 json 문법을 따른다는 뜻입니다.

 

조회를 위해서 /data merge storage test {abc:"def"}를 입력해서 저장소를 임시로 수정했습니다.

수정된 저장소의 값을 한 번 볼까요?

네. 입력한대로 {abc: "def"}라는 값이 그대로 저장된 것을 확인할 수 있습니다.

 

/data get storage test <arg>

그럼 경로를 입력해서 def만 뽑아볼까요?

네. block과 entity에서 사용했던 그대로 경로를 콕 집어 똑같이 조회할 수 있습니다.

엔티티나 블록이 보여서는 안 되는 맵에서 따로 저장할 값이 있다면 저장소를 사용하는 것이 좋습니다.

 

이 저장소는 엔티티나 블록에 저장되는 것이 아닌 서버에 파일형태로 저장됩니다.

 

싱글플레이인 경우 경로는

마인크래프트 설치폴더/saves/맵이름/data

입니다.

 

파일 이름은

command_storage_minecraft.dat

입니다.

 

사실 이 get이란 인자는 '어딘가 저장된 값을 플레이어가 확인할 수 있다'는 기능 자체도 쓸만하지만 execute store result에서 더 자주 그리고 중요하게 쓰는 인자입니다. 어떻게 쓰이는지는 execute에서 알려드리겠습니다.

 

get block과 entity 그리고 storage까지 알아봤습니다. 어디에 저장하느냐의 차이일 뿐 사실 조회하는 방법은 똑같아서 길게 설명할 것은 없었습니다. 그래서 저장소 부분은 짧게 쓰고 마무리 했습니다.

 

감사합니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band