77 lines
3.0 KiB
Java
77 lines
3.0 KiB
Java
package com.alttd.fishingevent.timer;
|
|
|
|
import com.alttd.fishingevent.config.Messages;
|
|
import com.alttd.fishingevent.scoreboard.ScoreboardManager;
|
|
import net.kyori.adventure.text.Component;
|
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
|
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
|
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
|
import org.bukkit.Server;
|
|
|
|
import java.time.Duration;
|
|
import java.time.Instant;
|
|
import java.util.concurrent.Executors;
|
|
import java.util.concurrent.ScheduledExecutorService;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
|
public class EventManager {
|
|
|
|
private static EventManager instance = null;
|
|
private boolean running = false;
|
|
private Instant startTime;
|
|
private Duration duration;
|
|
private EventAutoMessages eventAutoMessages;
|
|
private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
|
|
|
private EventManager() {}
|
|
|
|
public static EventManager getInstance() {
|
|
if (instance == null)
|
|
instance = new EventManager();
|
|
return instance;
|
|
}
|
|
|
|
public boolean startEvent(Server server, Duration duration) {
|
|
if (running)
|
|
return false;
|
|
running = true;
|
|
startTime = Instant.now();
|
|
this.duration = duration;
|
|
server.sendMessage(MiniMessage.miniMessage().deserialize(Messages.TIMER.EVENT_START, Placeholder.parsed("minutes", String.valueOf(duration.toMinutes()))));
|
|
eventAutoMessages = new EventAutoMessages(startTime, duration, server);
|
|
if (scheduler.isShutdown() || scheduler.isTerminated())
|
|
scheduler = Executors.newScheduledThreadPool(1);
|
|
scheduler.scheduleAtFixedRate(eventAutoMessages, 5, 1, TimeUnit.SECONDS);
|
|
return true;
|
|
}
|
|
|
|
public boolean isRunning() {
|
|
return running;
|
|
}
|
|
|
|
|
|
public void stop() {
|
|
if (!scheduler.isTerminated() && !scheduler.isShutdown()) {
|
|
scheduler.shutdownNow();
|
|
}
|
|
running = false;
|
|
}
|
|
|
|
protected void end(Server server) {
|
|
if (!scheduler.isTerminated() && !scheduler.isShutdown()) {
|
|
scheduler.shutdownNow();
|
|
}
|
|
running = false;
|
|
AtomicReference<Component> message = new AtomicReference<>(MiniMessage.miniMessage().deserialize(Messages.TIMER.EVENT_END));
|
|
ScoreboardManager.getInstance().getTop10().stream().limit(3).forEachOrdered(playerScore ->
|
|
message.set(message.get().append(Component.newline()).append(MiniMessage.miniMessage().deserialize(Messages.TIMER.WINNER_FORMAT, TagResolver.resolver(
|
|
Placeholder.component("player", playerScore.player().displayName()),
|
|
Placeholder.unparsed("rarity", playerScore.fish().getRarity().displayName()),
|
|
Placeholder.component("fish", playerScore.fish().fishName()),
|
|
Placeholder.parsed("length", String.format("%.2f", playerScore.biggestFish()))
|
|
)))));
|
|
server.sendMessage(message.get());
|
|
}
|
|
}
|