Compy's Blog
635 words
3 minutes
[Minecraft] 플러그인 커스텀 이벤트
2025-02-04
잠시 보고 가세용!

이 포스트는 상속을 모르는 상태에서 보면 약간의 혼란이 발생합니다ㅏ.. 또한 Bukkit의 Listener, EventListener, Event의 이해가 필요합니다.

일단 버킷에서는 많은 이벤트를 다 지원해준다. PlayerInteractEvent, PlayerJoinEvent … 등등 아주 많이 지원해준다.

그래서 뭐 딱히 만들 필요없다고 생각할 수 있지만.. 좀 까다롭게 로직을 만들고 싶을 때는 미리 패킷을 받고서 처리하면서 이벤트를 발생시켜 Listener에서 편하게 처리하도록 할 수 있다. 뭐 예를 들어보자

게임에 보스가 존재하는데 보스를 잡았다면 그 BossDeadEvent가 발생되도록 하여서 잡은 플레이어와 Boss의 종류를 event에 넣어서 보내면 Listener에서 처리할 때 필요한 값들이 다 들어있어서 처리가 편합니다.

그럼 그걸 어떻게 만들까요??? 한번 화이트 리스트 기능을 좀 이걸 이용해서 만들어 봅시다!

public class TestListener implementation Listener{
    @EventListener
    public void onJoin(PlayerJoinEvent e){
        Player player = e.getPlayer();
        
    }
}
public class WhiteListEvent extends Event implementation Cancellable{
    private static final HandlerList handlers = new HandlerList();
    private final Player player;

    private final ServerPlayer npc;
    private boolean cancelled;

    public WhiteListEvent(Player player) {
        this.player = player;
    }

    public Player getPlayer() {
        return player;
    }

    @Override
    public boolean isCancelled() {
        return cancelled;
    }

    @Override
    public void setCancelled(boolean cancel) {
        this.cancelled = cancel;
    }

    @Override
    public HandlerList getHandlers() {
        return handlers;
    }

    public static HandlerList getHandlerList() {
        return handlers;
    }
}

저는 이 이벤트를 캔슬 시킬 수 있도록 하려고 했습니다.

WhiteListManager에서 일단 처내도록 하고 있는데… 이때 다른 곳에서 이런 플레이어는 제외 시키자.. 이렇게 하도록 이요!

이거는 어떻게 발생시킬 수 있을까요??

@EventListener
public void onJoin(PlayerJoinEvent e){
    Player player = e.getPlayer();
    Bukkit.getScheduler().runTask(plugin, () -> {Bukkit.getPluginManager().callEvent(new WhiteListEvent(player));});
}

@EventListener
public void onWhiteListPlayerIn(WhiteListEvent e){
    e.getPlayer().kick();
}

Bukkit Scheduler를 호출해서 실행시키는 것은 main thread에서 처리되도록 안전하게 하는 것입니다.

이렇게 된다면 어떻게 받을 수 있느냐!!

@EventListener
public void onWhiteListPlayerIn(WhiteListEvent e){
    
}

이렇게 사용할 수 있어요!

그러면 WhiteListManager에서 처리된 플레이어면 cancel시키고 아니면 원래 실행되던 kick이 처리되게 되는거죠!

조심

핸들러의 등록 순서에 따라서 결과가 달라질 수 있어요! 영상을 참고해 주세요!


구현 영상

여기까지 약간의 튜토리얼 이었습니다.

[Minecraft] 플러그인 커스텀 이벤트
https://compy07.github.io/Blog/posts/development/bukkit/util/customevent/
Author
뒹굴뒹굴 이정훈 공부방
Published at
2025-02-04