허두
한마포 커뮤니티 매니저
HURDOO 2b370e4f33334fd5af2d1419cfe356a7
이해도 | 플러그인 |
---|---|
게임버전 (JE) | 버킷 |
플러그인 만지기 시작한지 얼마 안 된 초중수입니다...
이번에 경제 플러그인에 한번 도전해보려고 하는데
플레이어들의 돈들은 모두 config.yml에 Money_닉네임 으로 int 형식으로 저장을 했고,
바다의 심장을 웅크린 채(LShift)로 바닥에 떨어뜨리면
플레이어의 손에서 (바다의 심장 개수+1)*10 만큼 config.yml에 추가하려고 하는데...
@EventHandler public void exchange(PlayerDropItemEvent e) { Player p = e.getPlayer(); if(e.getItemDrop().getItemStack() == new ItemStack(Material.HEART_OF_THE_SEA) && p.isSneaking()) { int n = p.getInventory().getItemInMainHand().getAmount(); p.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); getConfig().set("Money_" + p.getName(), getConfig().getInt("Money_" + p.getName()) + (n+1)*10); saveConfig(); Item i = e.getItemDrop(); i.remove(); } }
이렇게 했는데도 실행이 안되어서... (다른 이벤트들은 모두 실행이 잘됩니다!)
바다의 심장을 왼손에 드는 것으로 이벤트를 바꾸었는데도...
@EventHandler public void onHOS(PlayerSwapHandItemsEvent ev) { ItemStack is = ev.getOffHandItem(); if(is == new ItemStack(Material.HEART_OF_THE_SEA)) { int n = ev.getOffHandItem().getAmount(); ev.setOffHandItem(new ItemStack(Material.AIR)); getConfig().set("Money_" + ev.getPlayer().getName(), getConfig().getInt("Money_" + ev.getPlayer().getName()) + (n+1)*10); saveConfig(); } }
이것조차 실행이 안되더라고요..
문법적 하자는 없는것 같은데...
혹시 논리적 오류가 있나요? 고수님들 부탁드립니다ㅜㅜ
허두
2020.02.08엇 뭐지 코드 마크다운으로 달면 되는거 아니었나요..?ㅠㅠ
허두
2020.02.08아 코드 형식이 따로 있군요!
wysohn
2020.02.09if(e.getItemDrop().getItemStack() == new ItemStack(Material.HEART_OF_THE_SEA) && p.isSneaking())
이 구문은 항상 false가 됩니다
== 연산자는 왼쪽과 오른쪽의 객체가 같은지만 확인하기때문에 같은 ItemStack 이라도 같은 객체가 아니라면 항상 false가 나옵니다
쉽게는 둘다 따로 변수에 저장해서 Logger 등으로 프린트 해보시면 둘의 해쉬코드가 다르게 나오는걸 알 수 있습니다.
equals를 사용하시거나 직접 native 형(int boolean double Enum 등) 값을 비교해야합니다. 해당 부분은 getType 으로 직접 Material (Enum) 을 가져오신뒤에 비교하시면 될것같습니다
허두
2020.02.09으앗 ItemStack에 그런 비밀이...!
친절한 설명 감사합니다 :D
wysohn
2020.02.10추가로 ItemStack 뿐만이 아니라 native 형이 아닌 모든 객체는 저렇다고 생각 하시면 됩니다. 한번 읽어보시는걸 추천드려요: https://jeong-pro.tistory.com/172
허두
2020.02.10ㄴ네넹 감사합니다..! :)
펜델(skyneton)
2020.02.26if(e.getItemDrop().getItemStack() == new ItemStack(Material.HEART_OF_THE_SEA) && p.isSneaking())
->
if(e.getItemDrop().getItemStack().getType() = Material.HEART_OR_THE_SEA && e.getPlayer().isSneaking())
허두
2020.02.26오옹 이러는 방법도 있군요 감사합니다!