잡다한 개발/마크플러그인

마크 가챠 5편

오잎 클로버 2021. 11. 30. 10:30
728x90

이제 타이머 기능을 추가하여 플러그인을 마무리 짓도록 하겠습니다.

타이머는 보스바로 개발을 하였습니다.

 

클래스명은 BossBarManagement 로 

생성자 호출시, 타이머 기능을 수행하도록 합니다,

 

public class BossBarManagement {

    public Plugin plugin;
    public static int time = 60;

    public static final HashMap<UUID, Long> timer = new HashMap<>(); // 고유 아이디, addedTime
    public static final HashMap<UUID, BossBar> userBossBars = new HashMap<>(); // 고유 아이디, BossBar

    public BossBarManagement(Player player, Plugin plugin) {
        this.plugin = plugin;

        overrideBossBar(player);
        run(player);
    }

    public static void overrideBossBar(Player player) {
        timer.put(player.getUniqueId(), System.currentTimeMillis() / 1000); // 초기값
        BossBar bossBar = Bukkit.createBossBar("timer", BarColor.BLUE, BarStyle.SOLID, BarFlag.PLAY_BOSS_MUSIC);
        bossBar.setVisible(true);
        bossBar.addPlayer(player);
        userBossBars.put(player.getUniqueId(), bossBar);
    }

    public BossBar getBossBar(Player player) {
        return userBossBars.get(player.getUniqueId());
    }

    public Long getAddedTime(Player player) {
        return timer.get(player.getUniqueId());
    }

    public void run(Player player) {
        Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> {
            BossBar bossBar = getBossBar(player);
            long addedTime = getAddedTime(player);
            // 아직 가챠를 사용하지 않았다면 -> 보스바 null
            // 가챠 사용 당시에 보스바를 재정의

            if (bossBar != null && addedTime >= 0) {
                double timeLeft = addedTime + time - System.currentTimeMillis() / 1000;
                double progress = timeLeft / time;

                if (timeLeft <= 0) {
                    bossBar.setVisible(false);
                    userBossBars.replace(player.getUniqueId(), null);
                    timer.replace(player.getUniqueId(), -1L);
                    GachaBox.createGachaBox(player);
                    return;
                }
                bossBar.addPlayer(player);
                bossBar.setProgress(progress);

                int sec = (int) timeLeft;
                int min = sec / 60;
                int hour = min / 60;
                sec %= 60;
                min %= 60;

                if (timeLeft > 3600) {
                    bossBar.setTitle(ChatColor.BOLD + "" + hour + "시간 " + min + "분 " + sec + "초 남았습니다.");
                }
                else if (timeLeft > 60) {
                    bossBar.setTitle(ChatColor.BOLD + "" + min + "분 " + sec + "초 남았습니다");
                }
                else {
                    bossBar.setTitle(ChatColor.BOLD + "" + timeLeft + "초 남았습니다.");
                }
            }
        }, 0L, 0L);
    }

}

overrideBossBar 메소드는 보스바를 제정의를 하는 메소드입니다.

그리고 run 메소드는 계속 실행하되, 보스바에 직접적인 영향은 보스바가 null이 아닐 때만 사용할 수 있다.

 

제가 4편에서 지금까지 개발하였던 것을 시연영상을 올렸습니다.

하지만, 제가 3편에서 다루어었야할 것을 다루지 않아 지금이라도 다루도록 하겠습니다.

 

EventListener 클래스를 만들어 마크 자체 이벤트를 받을 수 있는 클래스를 만듭니다.

public class EventListener implements Listener {

    private final Plugin plugin;

    public EventListener(Plugin plugin) {
        this.plugin = plugin;
    }

}

그리고 이 생성자는 플레이어가 서버에 입장했을 때, 호출하도록 하기 위해

 

EventHandler를 추가하여 이벤트가 발생했을 때, 작동할 메소드들을 작성합니다.

@EventHandler
public void onPlayerJoinEvent(PlayerJoinEvent event) {
    event.setJoinMessage("Hello, " + event.getPlayer().getName());
    new BossBarManagement(event.getPlayer(), this.plugin);
}

그리고 가챠 상자와 상호작용 이벤트 처리

@EventHandler
public void onPlayerInteractEvent(PlayerInteractEvent event) {
    // 해당 특수 셜커 상자 이벤트 처리
    GachaBox.interactBox(event.getPlayer(), event, this.plugin);
}

마지막으로 가챠 상자 설치는 막아두기 위한 이벤트 처리를 합니다.

@EventHandler
public void onBlockPlaceEvent(BlockPlaceEvent event) {
    Player player = event.getPlayer();
    if (player.getInventory().getItemInMainHand().getType() == Material.SHULKER_BOX
            && player.getInventory().getItemInMainHand().containsEnchantment(Enchantment.LUCK)) {
        event.setCancelled(true);
    }
}

 

이제 GachaBoxResult 클래스로 돌아가서

생성자 내에 run 메소드 영역에 overrideBossBar 메소드를 호출하여 가챠 상자를 사용하였을 때, 다시 타이머를 작동하도록 합니다.

public GachaBoxResult(Player player, Plugin plugin) {
    Random random = new Random();
    new BukkitRunnable() {
        int count = 0;

        @Override
        public void run() {
            int r = random.nextInt(objectList.size());
            Object o = objectList.get(r);
            String next = String.valueOf(o);

            if (count > 50) {
                result(player, o);
                BossBarManagement.overrideBossBar(player);
                this.cancel();
            }
            else {
                player.sendTitle("가챠 상자 여는 중", next, 0, 3, 0);
                count++;
            }
        }
    }.runTaskTimer(plugin, 3L, 3L);
}

 

혹여나, 코드를 놓쳤거나 이해가 되지않으시다면 

https://github.com/iqpizza6349/Minecraft_Gacha/tree/master/src/main/java/com/tistory/workshop6349/minecraft_gacha

 

GitHub - iqpizza6349/Minecraft_Gacha

Contribute to iqpizza6349/Minecraft_Gacha development by creating an account on GitHub.

github.com

참고해주세요.

 

이상입니다. (시연영상은 스킵했습니다.)

'잡다한 개발 > 마크플러그인' 카테고리의 다른 글

마크 가챠 4편  (0) 2021.11.25
마크 가챠 3편  (0) 2021.11.23
마크 가챠 2편  (0) 2021.11.20
마크 가챠 1편  (0) 2021.11.20
마크 가챠 0편  (0) 2021.11.19