Implemented timer and commands to start/stop the event
Prevent players from fishing while the event is not active
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
package com.alttd.fishingevent.timer;
|
||||
|
||||
import com.alttd.fishingevent.config.Messages;
|
||||
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.List;
|
||||
|
||||
public class EventAutoMessages implements Runnable {
|
||||
|
||||
private final Instant eventStart;
|
||||
private final Duration eventDuration;
|
||||
private final Server server;
|
||||
private Instant lastTimeNotified = Instant.now();
|
||||
private final List<Integer> minutesList = List.of(30, 15, 10, 5, 2, 1);
|
||||
private final List<Integer> secondsList = List.of(30, 20, 10);
|
||||
|
||||
public EventAutoMessages(Instant eventStart, Duration eventDuration, Server server) {
|
||||
this.eventStart = eventStart;
|
||||
this.eventDuration = eventDuration;
|
||||
this.server = server;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
Instant currentTime = Instant.now();
|
||||
Duration timeElapsed = Duration.between(eventStart, currentTime);
|
||||
Duration timeRemaining = eventDuration.minus(timeElapsed);
|
||||
Duration timeSinceLastNotification = Duration.between(lastTimeNotified, currentTime);
|
||||
|
||||
if (timeRemaining.isZero() || timeRemaining.isNegative()) {
|
||||
EventManager.getInstance().end(server);
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if secondsRemaining matches one of the specified intervals
|
||||
// or if any intervals were missed since the last notification
|
||||
if (timeSinceLastNotification.toSeconds() > 5 && timeRemaining.toSecondsPart() < 2) {
|
||||
if (timeRemaining.toHours() > 0) {
|
||||
printTimeRemaining(timeRemaining);
|
||||
} else if (minutesList.contains(timeRemaining.toMinutesPart())) {
|
||||
printTimeRemaining(timeRemaining);
|
||||
} else if (secondsList.contains(timeRemaining.toSecondsPart())) {
|
||||
printTimeRemaining(timeRemaining);
|
||||
}
|
||||
} else if (timeRemaining.toSeconds() <= 5) {
|
||||
printTimeRemaining(timeRemaining);
|
||||
}
|
||||
}
|
||||
|
||||
private void printTimeRemaining(Duration timeRemaining) {
|
||||
TagResolver tagResolver;
|
||||
lastTimeNotified = Instant.now();
|
||||
|
||||
if (timeRemaining.toHours() > 0)
|
||||
tagResolver = TagResolver.resolver(Placeholder.parsed("time_unit", "hours"), Placeholder.parsed("time", String.valueOf(timeRemaining.toHoursPart())));
|
||||
else if (timeRemaining.toMinutes() > 0)
|
||||
tagResolver = TagResolver.resolver(Placeholder.parsed("time_unit", "minutes"), Placeholder.parsed("time", String.valueOf(timeRemaining.toMinutesPart())));
|
||||
else
|
||||
tagResolver = TagResolver.resolver(Placeholder.parsed("time_unit", "seconds"), Placeholder.parsed("time", String.valueOf(timeRemaining.toSecondsPart())));
|
||||
server.broadcast(MiniMessage.miniMessage().deserialize(Messages.TIMER.TIME_REMAINING, tagResolver));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user