Vhone dc73ee51d49946dabf4f634c6e3ce5c6
분야 | 스크립트 |
---|---|
게임버전 | 모든버전 |
API | 스피곳, 페이퍼 |
자료글 | https://github.com/SkriptLang/Skript |
Item과 ItemType의 차이
스크립트를 처음 배우거나 어느정도 다를 줄 아는 분들도 Item과 ItemType의 차이를 잘 모르시는 분들이 많을겁니다.
이 개념은 플러그인(자바)에는 없는 스크립트만의 고유한 개념인데요.
스크립트에서는 두 타입을 이렇게 설명합니다
Item은 결정된 하나의 데이터 타입으로 한개의 데이터를 의미한다.
ItemType은 결정되지 않은 데이터 타입으로 넓은 범위의 데이터를 의미한다.
설명만 보면 잘 이해가 되지 않는데 몇가지 예문들 통해 그 차이를 알아보도록 하겠습니다.
비교 순서만 바꾸었을 뿐인데
# 세팅 set {_i.1} to red wool block named "빨간색 양모" set {_i.2} to red wool block # 1 {_i.1} is red wool block # 2 {_i.1} is {_i.2} # 3 {_i.2} is {_i.1}
1~3번의 조건문에서 각각 어떤 결과가 나올까요?
{_i.1} 변수에는 이름을 지정한 빨간색 양모 블록을 저장했고
{_i.2} 변수에는 그냥 빨간색 양모 블록만 저장했습니다.
1번은 '같다'가 나옵니다.
빨간색 양모 블록에 이름만 지정했기 때문에 빨간색 양모 블록과 같은 걸까요?
이름을 지정한 빨간색 양모 블록은 Item 입니다.
스크립트에 정의된 aliases를 그대로 쓴 red wool block은 ItemType 입니다.
위에서 정의했듯이 ItemType은 넓은 범위의 데이터를 의미한다고 했습니다.
red wool block은 모든 종류의 빨간색 양털 블록을 의미합니다.
그렇기 때문에 이름이 정해진 블록이라할 지라도 같다고 나오죠.
2번도 '같다'가 나옵니다.
1번과 마찬가지로 ItemType을 변수에 저장한 것이기 때문에 같다고 나옵니다.
3번은 '다르다'가 나옵니다.
그런데 3번은 다르다고 나옵니다. 그냥 비교 순서만 바꿨을 뿐인데 말이죠.
앞서 말했듯이 ItemType은 범위의 데이터를 의미하기 때문에
한개의 데이터를 의미하는 Item은 ItemType과 같을 수 없습니다.
좀 더 명확하게는 Item은 ItemType을 포함할 수 없다는 거죠.
어떤것이 Item이고 어떤것이 ItemType일까?
스크립트에서 'red wool block'이라고 aliases를 적으면 그것은 ItemType입니다. 모든 aliases는 ItemType입니다.
그러나 [Named Item], [Enchant Item]와 같이 메타를 추가하는 모든 익스프레션은 Item을 반환합니다.
그렇기 때문에 이름을 가진 빨간 양모 블록은 Item이 된 것입니다.
스크립트가 어렵다고 느껴지는 이유는 명확한 타입 비교를 하지 않기 때문입니다.
스크립트는 같은 일을 하는 코드도 여러개의 패턴을 가지고 있고, 패턴에 사용되는 타입 역시 여러 타입이 혼용될 수 있습니다.
까다로운 타입 비교를 하는 자바에 비해서 느슨한 타입 비교를 한다는 것이죠.
예를 들어 아래와 같은 코드입니다.
바로 위에 링크한 Named Item이나 Enchant Item의 패턴을 보면 ItemType이 필요하다고 명시되어있습니다.
그리고 익스프레션을 사용한 {_i.1} 변수는 명확히 Item이라는 것을 알고 있죠.
{_i.1} 변수를 ItemType으로 사용하면 어떻게 될까요.
set {_i.3} to {_i.1} named "양모로 양모를"
{_i.3} 변수도 {_i.1} 변수와 마찬가지로 "양모로 양모를"이라는 이름을 가진 빨간색 양모 블럭이 됩니다.
ItemType이 필요한 패턴에서 Item을 사용했는데도 불구하고 정상적으로 동작을 하죠.
스크립트는 데이터의 타입을 패턴에 맞게끔 변경하여 동작하게 되어있습니다.
Item이라 할지라도 패턴에서 ItemType이 필요하다면 변경하여 동작하죠.
이러한 느슨한 타입 비교 방식을 사용하기 때문에 이것을 이해하지 못한 유저들은 복잡하고 어렵게 느끼게 됩니다.
그래서 ItemType이 정확히 뭔데?
단 하나의 값을 의미하는 Item은 앞서 말했듯이 익스프레션을 사용한 값입니다.
특정 슬롯에 있는 아이템이라던지, 플레이어의 손에 있는 아이템, 인벤토리에 있는 아이템, 땅에 떨어진 아이템 등등
익스프레션을 통해 얻을 수 있는 모든 아이템 데이터는 Item입니다.
반대로 스크립트에서 정의한 Aliases의 값은 모두 ItemType입니다.
스크립트의 aliases 옵션으로 정의한 것도 모두 ItemType이죠.
aliases 옵션의 예제를 하나 보시죠.
aliases: wood_sign = minecraft:acacia_sign, minecraft:birch_sign, minecraft:dark_oak_sign, minecraft:jungle_sign, minecraft:oak_sign, minecraft:spruce_sign wood_door = minecraft:acacia_door, minecraft:birch_door, minecraft:dark_oak_door, minecraft:jungle_door, minecraft:oak_door, minecraft:spruce_door wood_tool = minecraft:wooden_sword, minecraft:wooden_shovel, minecraft:wooden_pickaxe, minecraft:wooden_axe, minecraft:wooden_hoe fuel_1 = wood_sign, wood_door, wood_tool
wood_sign, wood_door, wood_tool 이 세가지 모두 여러개의 아이템을 포함합니다. 범위를 가지는 ItemType이라는 의미죠.
wood_sign는 모든 표지판을, wood_door는 모든 나무문을, wood_tool는 모든 나무도구를 의미합니다.
그리고 나서 fuel_1이 그 모든 것들을 포함합니다.
wood_sign을 메세지로 출력하면 아래처럼 나옵니다.
acacia wood slab, birch wood slab, dark oak wood slab, jungle wood slab, oak wood slab or spruce wood slab
이것을 보니 ItemType이 무엇인지 아시겠나요?
ItemType은 다른 ItemType들과 or로 묶일 수 있습니다.
이것과 마찬가지로 하나의 ItemType은 여러개의 Item을 의미합니다.
요약
1. Item은 명확한 한개의 데이터를 의미한다.
2. ItemType은 넓은 범위의 데이터를 의미한다.
3. 넓은 범위란 OR 연산을 이용한 비교로써 일부만 같아도 '같다'를 반환한다.
4. ItemType이 Item을 포괄한다고 볼 수 있다.
* 예를들어 ItemType으로 인벤토리의 아이템 개수를 세면 메타데이터와 상관없이 모든 종류가 찾아진다.
* 완전히 일치하는 아이템을 찾기위해선 Item으로 비교하여 개수를 세야 한다.
A_bins
2021.06.08자바나 코틀린으로 따지자면 ItemType은 Material의 enum Class를 말하는거고 Item은 ItemStack을 의미 하는거 같네요! ItemStack은 하나하나가 객체값을 가지고 있어서 이런식으로 비교할 순 없고 ItemStack.getType(), ItemStack.type 으로 비교 가능한데 이러한 점에서는 스크립트가 조금 모호한 점이 있는거 같네욘
스크립터브혼
2021.06.10Type of 익스프레션으로 Item을 ItemType으로 변환 할 수 있는데, 이 변환으로 탈락하는 메타데이터는 이름과 로어 뿐입니다.
커스텀 모델데이터, 어트리뷰트, 플래그 같은값은 ItemType도 가질 수 있다는 의미인데요. 이 부분이 좀 애매하죠.
또, aliases를 정의할때 NBT 태그를 사용할 수 있어서 ItemType의 메타데이터에 기본값을 넣을 수 있습니다.
이런 ItemType은 Item과 비교할 때 자신이 가지고 있는 메타데이터까지 일치하는지 확인합니다.
이런점에서 스크립트의 ItemType은 Material과는 조금 다르다고 할 수 있죠.
스크립트의 소스를 직접 확인해본 것은 아니라서 어떻게 구현되어 있는지는 잘 모르겠습니다.
어찌보면 장점이기도하고, 배우는 사람입장에서는 참 난해한 개념인것 같아요.