Plugin_TechD ce85c15886f64ce9b6f9170a4348769d
강좌 자바 에디션(JE) 플러그인 개발
[Spigot] ItemStack 과 Block 그리고 PersistentDataContainer
분야 | 플러그인 |
---|---|
장르 | 개발자 툴, 정보전달 |
게임버전 | 모든버전 |
API | 스피곳, 페이퍼 |
Team Paradox의 글입니다.
Spigot 에는 ItemStack 과 Block 그리고 PersistentDataContainer가 있다.
ItemStack은 인벤토리에 한 칸을 차지하는 아이템을 뜻하는데 이름에서 알 수 있듯이
Item - Stack 아이템들의 개수도 ItemStack 안에 포함된다.
64개의 흙 블럭을 32개씩 두개로 나누는 순간, 1개의 ItemStack이 2개의 ItemStack으로 나뉜다.
그럼 흙은 뭐냐? ItemStack의 Material 이다.
이 ItemStack 은, 정글나무 원목을 Material 로 하는 개수가 5개인
1개의 ItemStack 이다.
이 공백 아이템칸은, Spigot 1.20.x 버전에 따르면
Material 을 Air 로 갖는 개수가 0개인
1개의 ItemStack 이다.
Material 과 Item Stack 에 관계를 이해하기 힘들었던 사람에게 도움이 되길 바란다.
ItemStack 은 신기하고 유용한 기능이 있는데,
Plugin이 reload 되거나 껐다가 켜져도 영구적인 데이터를 보관할 수 있다.
이러한 데이터를 담고있는 컨테이너가 있는데
이것이 바로 Persistent Data Container 이다. (이하 PDC)
PDC는
이렇게 불러올 수 있는데 itemStack의 itemMeta 안에 들어가있다.
여담으로 Player 도 PDC를 갖고 있는데, player.getPersistentDataContainer() 를 통해 바로 불러올 수 있다.
ItemMeta 도 PDC처럼 영구 데이터를 보관한다. (아이템 이름, 아이템 Lore, enchante 등... 이 itemMeta 에 포함된다.)
PDC는 세 개의 argument를 받는데, namespacedKey, type 그리고 값을 받는다.
간단하게 말하면 key - value 값인데 type 을 추가해주라는 말과 같다. (오래된 구식 언어들의 형태)
namespacedKey는 한 서버 안에 여러 플러그인들이 존재할 때, 충돌을 방지하기 위해 있는것으로 보인다. (plugin을 참조하고 있다.)
그리고 type에는 string, integer, integer_array 등 많은 타입들이 있고 (java의 모든 기본 타입들이 있진 않지만 충분하다고 생각된다)
값은 type에 해당하는 값을 잘 넣어주면 된다.
그렇다면 Block은 뭘까?
아까 위에 정글나무 원목을 Material로하는 ItemStack을 설치하는 순간 Block이 된다.
그러면 둘이 같은 것이 아닐까?
ItemStack 중에는 Material 이 설치 가능한 것이 있고, 가능하지 않은 것들이 있다. (Sword는 설치가 불가능)
그렇다면 모든 Block들은 ItemStack 이 될 수 있는가?
가능하다. 하지만 Block과 ItemStack 에는 가장 큰 차이점이 있는데,
Block에는 PDC가 존재하지 않는다.
따라서 DB 를 따로 두어야 영구적인 데이터를 보관할 수 있다.
예를 들어 스포너를 설치했는데 커스텀 몬스터가 나왔으면 한다.
열심히 스포너 ItemStack 의 PDC에 데이터를 담아서 설치를 해주었는데
커스텀한 몬스터가 나오지 않는다면
ItemStack 을 설치하는 순간 설치된 Block에는 아이템의 PDC가 사라진다는것을 기억해줬으면 좋겠다.
물론 손에 계속 아이템을 들고있다면 아이템에는 데이터가 남아있다.
그러면 뭐 어떻게 해줘야 커스텀 몬스터를 소환할 수 있는데?
몬스터 스폰 이벤트를 받고, 이벤트의 발생 스포너를 갖고와서 DB의 데이터를 읽어주어야한다.
커스텀 스포너 만들기는 다음 글에서...
댓글이 없습니다.
새로운 댓글을 등록해 주세요!