김초록
대표칭호 없음
Gaegul__ 707a68c6f2c54d0bb6e3628cb711014f
이해도 | 플러그인 |
---|---|
게임버전 (JE) | 버킷 |
player.getInventory().addItem(ItemManager.bronze)
구문으로 아이템을 얻고,
if (action.equals(Action.RIGHT_CLICK_AIR) && item.isSimilar(ItemManager.bronze))
이 아이템을 우클릭 하면 이벤트가 발생하도록 구문을 작성했습니다.
그런데 아이템을 받은 후에 바로 우클릭을 하면
If문이 실행되지만, 서버를 재접속한 후에는 우클릭을 해도 if문이 실행되지 않습니다.
재접속 후 아이템을 얻는 구문을 실행하면
위 사진과 같이 겹쳐지지 않게 아이템이 생성됩니다. (1번 슬롯 : 재접속 전 아이템, 3번 슬롯: 재접속 후 얻은 아이템)
이런 현상이 발생하는 원인이 무엇일까요??
qsef1256
2022.04.21ItemManager가 아이템을 어떻게 생성하나요? 문제는 거기 있는 것으로 보이네요.
javaDocs에 따르면 isSimliar는 아이템 양만 무시할 뿐이지, equals() 와 같다고 나와 있습니다.
겹쳐지지 않는 거에서도 보다시피, 재접시 모양만 같은 다른 아이템이 나오는 것 같네요.
김초록
2022.04.21public class ItemManager {
public static ItemStack bronze;
public static void init() {
createBronze();
private static void createBronze() {
ItemStack item = new ItemStack(Material.IRON_NUGGET, 1);
ItemMeta meta = item.getItemMeta();
meta.displayName(Component.text("§7브론즈 코인"));
meta.setCustomModelData(1);
item.setItemMeta(meta);
bronze = item;
}
}
이런 식으로 구성되어있습니다!
재접속 전에는 이벤트가 잘 작동하는데..
재접속만 하면 왜 아이템이 먹통이 되는걸까요...
qsef1256
2022.04.21서바이벌 모드에서도 똑같이 안되나요?
지금 사진은 크리에이티브 에서 찍으신 걸로 보입니다.
크리에이티브랑 서바이벌이랑 내부적으로 좀 다르게 처리됩니다. 예를 들어 다수의 인벤토리 이벤트는 크리에이티브에서 실행되지 않기도 합니다.
qsef1256
2022.04.21그게 아니라면
https://www.spigotmc.org/threads/problems-with-itemstacks-not-stacking.133899/
참고하셔서 이 값이 다른지 한번 체크해보세요.
김초록
2022.04.23내부 데이터가 다른 것을 확인했습니다!
첨부해주신 글을 보면 답변으로 ``ItemMeta가 처리하지 않은 NBT 태그, byte[]로의 직렬화 및 base64 인코딩`` (구글번역기)
라고 적혀있는데, 이게 혹시 어떤 뜻인지 알 수 있을까요..?
qsef1256
2022.04.25ItemMeta 에 속해있지 않은 NBT 태그이며 byte[] 로 직렬화 되었고 base64로 다시 한번 인코딩 되었다로 해석하시면 될 것 같습니다.
직렬화란 데이터를 직렬로, 저장할 수 있는 포맷으로 변환한다고 생각하시면 됩니다. byte[] 에 맞게 변환되었다는 뜻이죠.
byte[] 가 byte 배열 이라는 건 알고 계시죠?
인코딩은 UTF-8 같은, 잘못 맞추면 글자 깨지는 그게 맞구요, base64 라는 인코딩 방식이 있습니다. 마크 내에서는 꽤 자주 쓰는데 이걸 쓰는 자세한 이유는 base64를 검색하시면 아실 수 있어요, 아무튼 크게 중요한 건 아니구요.
저도 여기에 크게 관심 있을 정도로 low-level 한건 아니라서 솔직히 이 이상으로 설명을 드리기는 어렵겠네요, 주로 라이브러리를 써왔던 터라
김초록
2022.04.25헉 이미 충분한 설멍이 되었습니다! 감사합니다
/data get entity @s SelectedItem
명령어로 얻은 아이템 정보입니다.첫번쨰 : /동전 명령어를 사용하여 얻은 아이템을 위 명령어를 이용해 얻은 값
두번쨰: 서버 재접속 후 첫번쨰 아이템을 위 명령어를 이용해 얻은 값
김초록
2022.04.25추가로 아이템 생성 구문은 이렇게 됩니다!
김초록
2022.04.25문제 해결했습니다.
Component가 아닌 String을 쓰거나, §b 같은 코드를 쓰지 않고 Component 자체 기능인 Color 기능을 이용해서 구문을 작성하니 해결됐습니다!
친절한 답변들 감사했습니다.