잠시 보고 가세용!이 포스트는 상속을 모르는 상태에서 보면 약간의 혼란이 발생합니다ㅏ.. 또한 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이 처리되게 되는거죠!
조심핸들러의 등록 순서에 따라서 결과가 달라질 수 있어요! 영상을 참고해 주세요!
여기까지 약간의 튜토리얼 이었습니다.