이제 타이머 기능을 추가하여 플러그인을 마무리 짓도록 하겠습니다.
타이머는 보스바로 개발을 하였습니다.
클래스명은 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);
}
혹여나, 코드를 놓쳤거나 이해가 되지않으시다면
GitHub - iqpizza6349/Minecraft_Gacha
Contribute to iqpizza6349/Minecraft_Gacha development by creating an account on GitHub.
github.com
참고해주세요.
이상입니다. (시연영상은 스킵했습니다.)