개인 자료란 (JE)

  서버 커뮤니티

Profile 김초록 대표칭호 없음

Gaegul__ 707a68c6f2c54d0bb6e3628cb711014f

Profile

질문하기 Java

서버 재접속 사 아이템이 먹통됩니다.

2022.04.20 조회 수 1209 추천 수 0
이해도 플러그인 
게임버전 (JE) 버킷 

player.getInventory().addItem(ItemManager.bronze)

구문으로 아이템을 얻고,

if (action.equals(Action.RIGHT_CLICK_AIR) && item.isSimilar(ItemManager.bronze)) 

이 아이템을 우클릭 하면 이벤트가 발생하도록 구문을 작성했습니다.

그런데 아이템을 받은 후에 바로 우클릭을 하면 

If문이 실행되지만, 서버를 재접속한 후에는 우클릭을 해도 if문이 실행되지 않습니다.

재접속 후 아이템을 얻는 구문을 실행하면

위 사진과 같이 겹쳐지지 않게 아이템이 생성됩니다. (1번 슬롯 : 재접속 전 아이템, 3번 슬롯: 재접속 후 얻은 아이템)

이런 현상이 발생하는 원인이 무엇일까요??




9개의 댓글

qsef1256
2022.04.21

ItemManager가 아이템을 어떻게 생성하나요? 문제는 거기 있는 것으로 보이네요.

javaDocs에 따르면 isSimliar는 아이템 양만 무시할 뿐이지, equals() 와 같다고 나와 있습니다.
겹쳐지지 않는 거에서도 보다시피, 재접시 모양만 같은 다른 아이템이 나오는 것 같네요.

김초록
2022.04.21
@qsef1256

public 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
@qsef1256

내부 데이터가 다른 것을 확인했습니다!

첨부해주신 글을 보면 답변으로 ``ItemMeta가 처리하지 않은 NBT 태그, byte[]로의 직렬화 및 base64 인코딩`` (구글번역기)

라고 적혀있는데, 이게 혹시 어떤 뜻인지 알 수 있을까요..?

qsef1256
2022.04.25
@김초록

ItemMeta 에 속해있지 않은 NBT 태그이며 byte[] 로 직렬화 되었고 base64로 다시 한번 인코딩 되었다로 해석하시면 될 것 같습니다.

 

직렬화란 데이터를 직렬로, 저장할 수 있는 포맷으로 변환한다고 생각하시면 됩니다. byte[] 에 맞게 변환되었다는 뜻이죠.

byte[] 가 byte 배열 이라는 건 알고 계시죠?

 

인코딩은 UTF-8 같은, 잘못 맞추면 글자 깨지는 그게 맞구요, base64 라는 인코딩 방식이 있습니다. 마크 내에서는 꽤 자주 쓰는데 이걸 쓰는 자세한 이유는 base64를 검색하시면 아실 수 있어요, 아무튼 크게 중요한 건 아니구요.

 

저도 여기에 크게 관심 있을 정도로 low-level 한건 아니라서 솔직히 이 이상으로 설명을 드리기는 어렵겠네요, 주로 라이브러리를 써왔던 터라

@qsef1256

헉 이미 충분한 설멍이 되었습니다! 감사합니다

 

 
/data get entity @s SelectedItem 명령어로 얻은 아이템 정보입니다.

첫번쨰 : /동전 명령어를 사용하여 얻은 아이템을 위 명령어를 이용해 얻은 값
두번쨰: 서버 재접속 후 첫번쨰 아이템을 위 명령어를 이용해 얻은 값


서버를 재접속 하면 아이템 값이 두번쨰 경우처럼 바뀌는데
이 때문에 재접속 후 아이템이 겹쳐지지 않았던 것 같습니다.

이걸 해결한 방법이 있을까요..?





김초록
2022.04.25
@김초록

추가로 아이템 생성 구문은 이렇게 됩니다!

ItemStack item = new ItemStack(Material.IRON_NUGGET, 1);
ItemMeta meta = item.getItemMeta();
meta.displayName(Component.text("§b실버 코인"));
meta.setCustomModelData(2);
item.setItemMeta(meta);
김초록
2022.04.25
@김초록

문제 해결했습니다.

Component가 아닌 String을 쓰거나, §b 같은 코드를 쓰지 않고 Component 자체 기능인 Color 기능을 이용해서 구문을 작성하니 해결됐습니다!
친절한 답변들 감사했습니다.