[Minecraft plugin] 다른 클래스에서 스케줄러 하기

jong·2021년 3월 8일
0

취미

목록 보기
8/12

정말 이거 하나 때문에 하루를 날렸다. 일반적으로 Bukkit API에서 제공하는 스케줄러는 흔히 생각하는 Sleep 과는 전혀 다른 녀석이다.
솔직히 메인 클래스에서 사용하면 구현 자체는 매우 쉬운데, 메인 클레스에 여러 기능들을 다 집어넣으면 가독성도 구리고 프로젝트가 커지면 감당도 안 될 것 같아 처음부터 명령어용 클래스는 따로 만들기로 했는데, 초보자에겐 너무나 고비가 많았다..

Sleep을 사용하면 서버 자체가 멈춘다고 한다. 때문에 시도조차 안함.

다른 클래스에서 스케줄러 사용

메인 클래스 인스턴스 가져오기

Bukkit API에서 제공하는 스케줄러를 사용하려면 메인 클래스의 인스턴스가 필요하다. 이거 하나 때문에 하루를 날렸는데, 구글에 검색하면 다양한 방법이 나온다. 보통 메인 클래스에서 다른 클래스로 보내주는 것인데, 이러면 오류만 발생하고 결국 못 하였다.

BukkitScheduler scheduler = Bukkit.getPluginManager().getPlugin("Plugin Name")
참고

우리가 알아야 할 것은 위에 코드이다. 나에겐 구세주다. 댓글을 확인하다 발견한 코드인데, 이걸 통해서 가져오면 된다.

예시 코드

BukkitScheduler scheduler = Bukkit.getPluginManager().getPlugin("HotTimeEvent").getServer().getScheduler();
scheduler.scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("HotTimeEvent"), new Runnable() {
	@Override
    	public void run() {
		Bukkit.broadcastMessage("");
	}
}, 20L);

위 코드는 1초 뒤에 Bukkit.broadcastMessage("");가 작동한다. 때문에 이 뒤에 다른 내용이 있다면 해당 내용이 먼저 작동하고 1초 뒤에 본 내용이 작동하게 되는 것이다.

예제코드 2

해당 내용에 맞게 작성한 코드이다.

public class TestCommand implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command command, String s, String[] strings) {
        Bukkit.broadcastMessage("[ §cHotTime Event§f ] 곧 모든 유저에게 테스트 아이템을 지급합니다. 아이템 창을 비워주세요!"); //모든 유저에게 메시지 전송
        ItemStack item = new ItemStack(Material.matchMaterial("paper")); //종이 아이템 생성
        ItemMeta itemMeta = item.getItemMeta(); //아이템 메타 데이터 생성 및 미리 생성한 아이템 메타 데이터 가져오기기
        itemMeta.setDisplayName("§cHotTime Event!"); //아이템 이름 변경
        item.setItemMeta(itemMeta); //변경한 메타 아이템 입혀주기

        delayTimeInformation(5, 1);
        delayTimeInformation(4, 2);
        delayTimeInformation(3, 3);
        delayTimeInformation(2, 4);
        delayTimeInformation(1, 5);

        BukkitScheduler scheduler = Bukkit.getPluginManager().getPlugin("HotTimeEvent").getServer().getScheduler();
        scheduler.scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("HotTimeEvent"), new Runnable() {
            @Override
            public void run() {
                for (Player p : Bukkit.getOnlinePlayers()) { //모든 플레이어에게
                    p.getInventory().addItem(item); //플레이어에게 아이템 부여
                    p.sendMessage("[ §cHotTime Event§f ] " + p.getName() + " 님 아이템이 도착하였습니다."); //도착 메시지
                }
            }
        }, 6 * 20L);
        return true; //정상 작동
    }

    public void delayTimeInformation(int time, int delay) {
        BukkitScheduler scheduler = Bukkit.getPluginManager().getPlugin("HotTimeEvent").getServer().getScheduler();
        scheduler.scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("HotTimeEvent"), new Runnable() {
            @Override
            public void run() {
                Bukkit.broadcastMessage("[ §cHotTime Event§f ] " + time + "초 후!");
            }
        }, delay * 20L);
    }
}

임시로 테스트하느라 작성된 코드라 비효율적이고 지저분하다.
적어도 아이템이 안내 이후에 보내지는 것은 확인할 수 있다.

profile
공부 기록

0개의 댓글