개인 자료란 (JE)

  서버 커뮤니티

Profile roa9618 대표칭호 없음

roa9618 abf6f3e8f8c74484917f9b816bc5ff06

Profile

질문하기 Java

인벤토리 클릭 이벤트 질문드립니다.

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

public class ConfigScreenManager {
    public static String guiName = "Config";
    private static final Inventory gui;
    private static int guiSize = 9;

    public static ItemStack stack(Material material, String name, String... lore) {
        ItemStack item = new ItemStack(material);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(name);
        meta.setLore(Arrays.asList(lore));
        item.setItemMeta(meta);
        return item;
    }

    public static void openGUI(Player p) {
        for (int i = 0; i < guiSize - 2; i++) {
            ItemStack ex = stack(Material.PAPER, "testSet " + (i + 1), "test lore of line " + (i + 1));
            gui.setItem(i, ex);
        }
        ItemStack resetItem = stack(Material.RED_WOOL, ChatColor.RED + "설정 초기화", ChatColor.GRAY + "클릭 시 모든 설정을 초기화");
        ItemStack exitItem = stack(Material.BARRIER, ChatColor.RED + "Exit");
        gui.setItem(7, resetItem);
        gui.setItem(8, exitItem);
        p.openInventory(gui);
    }

    @EventHandler
    public void onClick(InventoryClickEvent e) {
        if (!e.getInventory().equals(gui)) {
            return;
        }
        if (e.getCurrentItem() == null) {
            return;
        }
        if (e.getCurrentItem().getItemMeta() == null) {
            return;
        }
        if (e.getCurrentItem().getItemMeta().getDisplayName() == null) {
            return;
        }
        e.setCancelled(true);
        Player p = (Player) e.getWhoClicked();
    }

    static {
        gui = Bukkit.createInventory(null, guiSize, guiName);
    }
}

현재 미니 게임 플러그인을 제작중입니다.

게임을 설정할 수 있는 gui를 만들고 있습니다.

stack 함수와 openGUI 함수를 이용하여 커스텀 인벤토리를 생성, 아이템도 넣었습니다.

커맨드를 생성한 클래스에서 openGUI 함수를 불러오면 인벤토리가 잘 열리고 아이템도 원하는 위치에 잘 들어간 것을 확인할 수 있었습니다.

인벤토리에 들어간 아이템들을 클릭하면 어떠한 구문을 실행하기 위해 InventoryClickEvent를 이용하여 구문을 짜고 있으나 직접적인 에러는 없지만 제가 원하는 행동이 실행되지 않는 것 같습니다.

onClick 함수를 보시면 인벤토리 내에서 어떠한 아이템을 클릭했을 때 e.setCancelled(true)를 이용하여 이벤트 취소 즉, 인벤토리 내에 있는 아이템을 들고가지 못하게 하고싶은데 계속 가져가집니다 ㅠㅠ 

구글링으로 외국인 분들이 쓰신튜토리얼부터 비슷한 기능이 있는 다른 플러그인에서 사용하는 구문까지 따라해봤는데 진행이 되질 않네요.. 

인벤토리를 생성하고 여는 구문들 중에서 이상한 구문이 있을수도 있다고 판단되어 같이 코드에 포함시켰습니다.

도와주시면 감사하겠습니다.

10개의 댓글

A_bins
2021.10.27

님이 원하는 cancel 상황이 이 if에 알맞는지부터 확인해보시는게..

 

 

if (!e.getInventory().equals(gui)) {

return;

}

if (e.getCurrentItem() == null) {

return;

}

if (e.getCurrentItem().getItemMeta() == null) {

return;

}

if (e.getCurrentItem().getItemMeta().getDisplayName() == null) {

return;

}

roa9618
2021.10.27
@A_bins

확인해봐야겠네요..! 그런데 조건문과 상관없이 조건문에 포함되어있지 않은 e.setCancelled 구문은 실행되어야 하는거 아닌가요...?

A_bins
2021.10.27
@roa9618

라고 생각하시면 저 if문은 어떻게 만드셨는지 의문이긴 하네요..

A_bins
2021.10.27
@A_bins

님이 작성하신 if문은 원래의 if에서 반대의 조건으로 작성한건데..

roa9618
2021.10.27
@A_bins

결론은 제가 이벤트 등록을 안시켜놔서 아무런 반응이 없던거였습니다.. 도움 주셔서 감사합니다 :)

허두
2021.10.27
@roa9618

엌 이벤트 등록을 안했을줄이야... 항상 답은 가까이에 있지요 :)

A_bins
2021.10.27
@roa9618

다행이군욘..

RANK0816
2021.10.27

인벤토리가 다른게 아닐까요? 한번 if !e.getInventory().equals(gui) 안에 확인하는거 해보시고 그래도 안되시면 다시 불러주세요.

roa9618
2021.10.27
@RANK0816

확인해보고 다시 답글 달겠습니다.. !!

roa9618
2021.10.27
@RANK0816

해결했습니다..! 조건문과 관계없이 제가 Main 클래스에 이벤트 등록을 안해놔서 인식을 못한 것 같습니다..!

뉴스 및 창작물
/files/thumbnails/762/770/003/262x150.crop.jpg?20240418073724

레드스톤

T.B.H (고민중독) | 노트블럭 버전 | NoteBlock Cover [한국어 영어 중국어 가사 추가]

노트블럭전문가

2024-04-18

0

/files/thumbnails/218/767/003/262x150.crop.jpg?20240412130213

레드스톤

우리의 꿈 - 원피스 오프닝

노트블럭전문가

2024-04-12

0

/files/thumbnails/505/766/003/262x150.crop.jpg?20240411122306

레드스톤

기동전사 건담 수성의 마녀 | 노트블럭 커버 1

노트블럭전문가

2024-04-11

1

/files/thumbnails/932/765/003/262x150.crop.jpg?20240410124459

레드스톤

마인크래프트 노트블록으로 만든 『 밤양갱 (Bam Yang Gang) 』

노트블럭전문가

2024-04-10

0

/files/thumbnails/403/765/003/262x150.crop.jpg?20240409190538

레드스톤

마인크래프트 노트블록으로 만든 『 밤양갱 (Bam Yang Gang) 』

Sonttukk

2024-04-09

4