개인 자료란 (JE)

  서버 커뮤니티

Profile 허두 한마포 커뮤니티 매니저

HURDOO 2b370e4f33334fd5af2d1419cfe356a7

Profile

이해도 플러그인 
게임버전 (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();
	}
}


이것조차 실행이 안되더라고요..


문법적 하자는 없는것 같은데...

혹시 논리적 오류가 있나요? 고수님들 부탁드립니다ㅜㅜ





8개의 댓글

허두
2020.02.08

엇 뭐지 코드 마크다운으로 달면 되는거 아니었나요..?ㅠㅠ

허두
2020.02.08
@허두

아 코드 형식이 따로 있군요!

wysohn
2020.02.09

if(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
@wysohn

으앗 ItemStack에 그런 비밀이...!

친절한 설명 감사합니다 :D

wysohn
2020.02.10
@허두

추가로 ItemStack 뿐만이 아니라 native 형이 아닌 모든 객체는 저렇다고 생각 하시면 됩니다. 한번 읽어보시는걸 추천드려요: https://jeong-pro.tistory.com/172

허두
2020.02.10
@wysohn

ㄴ네넹 감사합니다..! :)

펜델(skyneton)
2020.02.26

if(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
@펜델(skyneton)

오옹 이러는 방법도 있군요 감사합니다!