From 848c3f02febf971ad3dc433d5c7528096a34cde0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Fri, 8 Dec 2023 23:56:33 +0100 Subject: [PATCH] Updated Projectstart to use generic Countdown --- .../java/eu/mhsl/craftattack/spawn/Main.java | 4 +- .../ProjectStart.java} | 151 ++++++++---------- .../command/ProjectStartCancelCommand.java | 8 +- .../command/ProjectStartCommand.java | 8 +- .../command/ProjectStartResetCommand.java | 6 +- .../listener/PlayerInvincibleListener.java | 6 +- .../spawn/appliances/restart/Restart.java | 23 +-- .../craftattack/spawn/util/Countdown.java | 61 +++++-- .../craftattack/spawn/util/IteratorUtil.java | 6 + 9 files changed, 155 insertions(+), 118 deletions(-) rename src/main/java/eu/mhsl/craftattack/spawn/appliances/{countdown/Countdown.java => projectStart/ProjectStart.java} (55%) rename src/main/java/eu/mhsl/craftattack/spawn/appliances/{countdown => projectStart}/command/ProjectStartCancelCommand.java (80%) rename src/main/java/eu/mhsl/craftattack/spawn/appliances/{countdown => projectStart}/command/ProjectStartCommand.java (76%) rename src/main/java/eu/mhsl/craftattack/spawn/appliances/{countdown => projectStart}/command/ProjectStartResetCommand.java (68%) rename src/main/java/eu/mhsl/craftattack/spawn/appliances/{countdown => projectStart}/listener/PlayerInvincibleListener.java (84%) diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java index 19f4839..ab91b43 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java @@ -3,7 +3,7 @@ package eu.mhsl.craftattack.spawn; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarker; import eu.mhsl.craftattack.spawn.appliances.chatMessages.ChatMessages; -import eu.mhsl.craftattack.spawn.appliances.countdown.Countdown; +import eu.mhsl.craftattack.spawn.appliances.projectStart.ProjectStart; import eu.mhsl.craftattack.spawn.appliances.debug.Debug; import eu.mhsl.craftattack.spawn.appliances.event.Event; import eu.mhsl.craftattack.spawn.appliances.help.Help; @@ -36,7 +36,7 @@ public final class Main extends JavaPlugin { new AdminMarker(), new WorldMuseum(), new TitleClear(), - new Countdown(), + new ProjectStart(), new Tablist(), new ChatMessages(), new Report(), diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/Countdown.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/ProjectStart.java similarity index 55% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/Countdown.java rename to src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/ProjectStart.java index b955cc1..6a7b3c4 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/Countdown.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/ProjectStart.java @@ -1,14 +1,14 @@ -package eu.mhsl.craftattack.spawn.appliances.countdown; +package eu.mhsl.craftattack.spawn.appliances.projectStart; -import eu.mhsl.craftattack.spawn.Main; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.countdown.command.ProjectStartCancelCommand; -import eu.mhsl.craftattack.spawn.appliances.countdown.command.ProjectStartCommand; -import eu.mhsl.craftattack.spawn.appliances.countdown.command.ProjectStartResetCommand; -import eu.mhsl.craftattack.spawn.appliances.countdown.listener.PlayerInvincibleListener; +import eu.mhsl.craftattack.spawn.appliances.projectStart.command.ProjectStartCancelCommand; +import eu.mhsl.craftattack.spawn.appliances.projectStart.command.ProjectStartCommand; +import eu.mhsl.craftattack.spawn.appliances.projectStart.command.ProjectStartResetCommand; +import eu.mhsl.craftattack.spawn.appliances.projectStart.listener.PlayerInvincibleListener; import eu.mhsl.craftattack.spawn.config.Configuration; import eu.mhsl.craftattack.spawn.util.ComponentUtil; +import eu.mhsl.craftattack.spawn.util.Countdown; import eu.mhsl.craftattack.spawn.util.IteratorUtil; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; @@ -19,27 +19,28 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Map; +import java.util.Objects; import static java.util.Map.entry; +import static org.bukkit.Sound.MUSIC_DISC_PIGSTEP; -public class Countdown extends Appliance { - public Countdown() { - super("countdown"); - } - - private int taskId = -1; - private boolean isRunning = false; - private final int countDownLength = localConfig().getInt("countdown"); - private int countDown; - +public class ProjectStart extends Appliance { + private final Countdown countdown = new Countdown(localConfig().getInt("countdown"), this::format, this::announce, this::projectStart); + private final int startMusicAt = 137; private int cycleState = 0; - private World world = Bukkit.getWorld("world"); - private List glassColors = List.of(Material.RED_STAINED_GLASS, Material.YELLOW_STAINED_GLASS, Material.GREEN_STAINED_GLASS, Material.BLUE_STAINED_GLASS); - private Material defaultGlassColor = Material.ORANGE_STAINED_GLASS; - private Location glassLocation = new Location(world, -224, 67, -368); + private final World world = Bukkit.getWorld("world"); + private final List glassColors = List.of( + Material.RED_STAINED_GLASS, + Material.YELLOW_STAINED_GLASS, + Material.GREEN_STAINED_GLASS, + Material.BLUE_STAINED_GLASS + ); + + private final Material defaultGlassColor = Material.ORANGE_STAINED_GLASS; + private final Location glassLocation = new Location(world, -224, 67, -368); // - private final Map, Boolean> gamerulesAfterStart = Map.ofEntries( + private final Map, Boolean> gameRulesAfterStart = Map.ofEntries( entry(GameRule.DO_DAYLIGHT_CYCLE, true), entry(GameRule.DO_INSOMNIA, true), entry(GameRule.ANNOUNCE_ADVANCEMENTS, true), @@ -53,74 +54,49 @@ public class Countdown extends Appliance { entry(GameRule.FIRE_DAMAGE, true) ); + public ProjectStart() { + super("countdown"); + + this.countdown.addCustomAnnouncement( + new Countdown.CustomAnnouncements( + counter -> counter == startMusicAt, + counter -> { + Objects.requireNonNull(world) + .playSound(glassLocation, MUSIC_DISC_PIGSTEP, SoundCategory.RECORDS, 500f, 1f); + } + ) + ); + } + + private Component format(Countdown.AnnouncementData data) { + return Component.text() + .append(ComponentUtil.createRainbowText("CraftAttack", 10)) + .append(Component.text(" startet in ", NamedTextColor.GOLD)) + .append(Component.text(data.count(), NamedTextColor.AQUA)) + .append(Component.text(" " + data.unit() + "!", NamedTextColor.GOLD)) + .build(); + } + + private void announce(Component message) { + cycleBeacon(); + IteratorUtil.onlinePlayers(player -> player.sendMessage(message)); + } + public void startCountdown() { if(!isEnabled()) return; - if(isRunning) return; - - this.countDown = countDownLength; - int startMusicAfter = 43; - this.isRunning = true; - this.taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.instance(), () -> { - if(this.countDown <= 0) { - this.cancelCountdown(); - this.projectStart(); - return; - } - - if(countDown == countDownLength - startMusicAfter) { - world.playSound(glassLocation, org.bukkit.Sound.MUSIC_DISC_PIGSTEP, SoundCategory.RECORDS, 500f, 1f); - } - - if(countDown > 60 && countDown % 60 == 0) { - sendStartMessage(countDown / 60, "Minuten"); - } - - if(countDown <= 60 && (countDown <= 10 || countDown % 10 == 0)) { - sendStartMessage(countDown, "Sekunden"); - } - - this.countDown--; - }, 20, 20); - } - - private void sendStartMessage(int timeLeft, String unit) { - cycleBeacon(); - Bukkit.getOnlinePlayers().forEach(player -> player.sendMessage( - Component.text() - .append(ComponentUtil.createRainbowText("CraftAttack", 10)) - .append(Component.text(" startet in ", NamedTextColor.GOLD)) - .append(Component.text(timeLeft, NamedTextColor.AQUA)) - .append(Component.text(" " + unit + "!", NamedTextColor.GOLD)) - )); - } - - private void cycleBeacon() { - glassLocation.getBlock().setType(glassColors.get(cycleState)); - cycleState++; - if(cycleState >= glassColors.size()) cycleState = 0; + this.countdown.start(); } public void cancelCountdown() { - if(taskId == -1) return; - Bukkit.getScheduler().cancelTask(this.taskId); - this.isRunning = false; + this.countdown.cancel(); this.restoreBeforeStart(); } - public boolean isEnabled() { - return localConfig().getBoolean("enabled"); - } - - public void setEnabled(boolean enabled) { - localConfig().set("enabled", enabled); - Configuration.saveChanges(); - } - public void projectStart() { setEnabled(false); IteratorUtil.worlds(World::getWorldBorder, worldBorder -> worldBorder.setSize(worldBorder.getMaxSize())); - IteratorUtil.worlds(world -> setGamerules(gamerulesAfterStart, false)); + IteratorUtil.worlds(world -> IteratorUtil.setGameRules(gameRulesAfterStart, false)); Bukkit.getOnlinePlayers().forEach(player -> { player.setFoodLevel(20); @@ -155,17 +131,28 @@ public class Countdown extends Appliance { worldBorder.setDamageAmount(0); }); - IteratorUtil.worlds(world -> world, world -> setGamerules(gamerulesAfterStart, true)); + IteratorUtil.worlds(world -> world, world -> IteratorUtil.setGameRules(gameRulesAfterStart, true)); glassLocation.getBlock().setType(defaultGlassColor); } - private void setGamerules(Map, Boolean> rules, boolean inverse) { - rules.forEach((gameRule, value) -> IteratorUtil.worlds(world -> world.setGameRule(gameRule, value ^ inverse))); + private void cycleBeacon() { + glassLocation.getBlock().setType(glassColors.get(cycleState)); + cycleState++; + if(cycleState >= glassColors.size()) cycleState = 0; } - public boolean isRunning() { - return isRunning; + public boolean isEnabled() { + return localConfig().getBoolean("enabled"); + } + + public void setEnabled(boolean enabled) { + localConfig().set("enabled", enabled); + Configuration.saveChanges(); + } + + public Countdown getCountdown() { + return countdown; } @Override diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/command/ProjectStartCancelCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/command/ProjectStartCancelCommand.java similarity index 80% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/command/ProjectStartCancelCommand.java rename to src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/command/ProjectStartCancelCommand.java index 87c2468..d099612 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/command/ProjectStartCancelCommand.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/command/ProjectStartCancelCommand.java @@ -1,21 +1,21 @@ -package eu.mhsl.craftattack.spawn.appliances.countdown.command; +package eu.mhsl.craftattack.spawn.appliances.projectStart.command; import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.countdown.Countdown; +import eu.mhsl.craftattack.spawn.appliances.projectStart.ProjectStart; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; -public class ProjectStartCancelCommand extends ApplianceCommand { +public class ProjectStartCancelCommand extends ApplianceCommand { public ProjectStartCancelCommand() { super("projectStartCancel"); } @Override protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if(getAppliance().isRunning()) { + if(getAppliance().getCountdown().isRunning()) { getAppliance().cancelCountdown(); sender.sendMessage(Component.text("Countdown cancelled successfully!").color(NamedTextColor.GREEN)); } else { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/command/ProjectStartCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/command/ProjectStartCommand.java similarity index 76% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/command/ProjectStartCommand.java rename to src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/command/ProjectStartCommand.java index 63bc986..507bea5 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/command/ProjectStartCommand.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/command/ProjectStartCommand.java @@ -1,14 +1,14 @@ -package eu.mhsl.craftattack.spawn.appliances.countdown.command; +package eu.mhsl.craftattack.spawn.appliances.projectStart.command; import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.countdown.Countdown; +import eu.mhsl.craftattack.spawn.appliances.projectStart.ProjectStart; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; -public class ProjectStartCommand extends ApplianceCommand { +public class ProjectStartCommand extends ApplianceCommand { public ProjectStartCommand() { super("projectStart"); } @@ -20,7 +20,7 @@ public class ProjectStartCommand extends ApplianceCommand { return; } - if(getAppliance().isRunning()) { + if(getAppliance().getCountdown().isRunning()) { sender.sendMessage(Component.text("Countdown already running!").color(NamedTextColor.RED)); return; } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/command/ProjectStartResetCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/command/ProjectStartResetCommand.java similarity index 68% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/command/ProjectStartResetCommand.java rename to src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/command/ProjectStartResetCommand.java index 87d36c2..8110d44 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/command/ProjectStartResetCommand.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/command/ProjectStartResetCommand.java @@ -1,12 +1,12 @@ -package eu.mhsl.craftattack.spawn.appliances.countdown.command; +package eu.mhsl.craftattack.spawn.appliances.projectStart.command; import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.countdown.Countdown; +import eu.mhsl.craftattack.spawn.appliances.projectStart.ProjectStart; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; -public class ProjectStartResetCommand extends ApplianceCommand { +public class ProjectStartResetCommand extends ApplianceCommand { public ProjectStartResetCommand() { super("projectStartReset"); } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/listener/PlayerInvincibleListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/listener/PlayerInvincibleListener.java similarity index 84% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/listener/PlayerInvincibleListener.java rename to src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/listener/PlayerInvincibleListener.java index 734855a..4fd1c30 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/listener/PlayerInvincibleListener.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/listener/PlayerInvincibleListener.java @@ -1,14 +1,14 @@ -package eu.mhsl.craftattack.spawn.appliances.countdown.listener; +package eu.mhsl.craftattack.spawn.appliances.projectStart.listener; import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.countdown.Countdown; +import eu.mhsl.craftattack.spawn.appliances.projectStart.ProjectStart; import io.papermc.paper.event.player.PrePlayerAttackEntityEvent; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; -public class PlayerInvincibleListener extends ApplianceListener { +public class PlayerInvincibleListener extends ApplianceListener { @EventHandler public void onDamage(EntityDamageEvent event) { if(event.getEntity() instanceof Player) event.setCancelled(getAppliance().isEnabled()); diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/Restart.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/Restart.java index 2796d73..69347aa 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/Restart.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/restart/Restart.java @@ -14,10 +14,10 @@ import org.jetbrains.annotations.NotNull; import java.util.List; public class Restart extends Appliance { - private Countdown countdown; + private final Countdown countdown; public Restart() { - this.countdown = new Countdown(60, this::announce, this::onDone); + this.countdown = new Countdown(60, this::format, this::announce, this::onDone); } public void scheduleRestart() { @@ -36,15 +36,16 @@ public class Restart extends Appliance { } } - private void announce(int secondsLeft) { - IteratorUtil.onlinePlayers(player -> { - player.sendMessage( - Component.text() - .append(Component.text("Serverneustart in ", NamedTextColor.DARK_RED)) - .append(Component.text(secondsLeft, NamedTextColor.RED)) - .append(Component.text(" Sekunden!", NamedTextColor.DARK_RED)) - ); - }); + private Component format(Countdown.AnnouncementData data) { + return Component.text() + .append(Component.text("Serverneustart in ", NamedTextColor.DARK_RED)) + .append(Component.text(data.count(), NamedTextColor.RED)) + .append(Component.text(" " + data.unit() + "!", NamedTextColor.DARK_RED)) + .build(); + } + + private void announce(Component message) { + IteratorUtil.onlinePlayers(player -> player.sendMessage(message)); } private void onDone() { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/Countdown.java b/src/main/java/eu/mhsl/craftattack/spawn/util/Countdown.java index 64419ba..5202f4e 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/Countdown.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/util/Countdown.java @@ -1,23 +1,55 @@ package eu.mhsl.craftattack.spawn.util; import eu.mhsl.craftattack.spawn.Main; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; +import java.util.ArrayList; +import java.util.List; import java.util.function.Consumer; +import java.util.function.Function; public class Countdown { private final int countdownFrom; private boolean running; private int taskId; private int current; - private final Consumer announcement; + private final Consumer announcementConsumer; + private final Function announcementBuilder; + private Function defaultAnnouncements; + private final List customAnnouncements = new ArrayList<>(); private final Runnable onDone; - public Countdown(int countdownFrom, Consumer announcement, Runnable onDone) { + + public record AnnouncementData(int count, String unit) {} + public record CustomAnnouncements(Function test, Consumer task) {} + + public Countdown(int countdownFrom, Function announcementBuilder, Consumer announcementConsumer, Runnable onDone) { this.countdownFrom = countdownFrom; this.current = countdownFrom; - this.announcement = announcement; + this.announcementBuilder = announcementBuilder; + this.announcementConsumer = announcementConsumer; this.onDone = onDone; + + this.defaultAnnouncements = count -> { + if(current > 60 && current % 60 == 0) { + return new AnnouncementData(current / 60, "Minuten"); + } + + if(current <= 60 && (current <= 10 || current % 10 == 0)) { + return new AnnouncementData(current, "Sekunden"); + } + + return null; + }; + } + + public void addCustomAnnouncement(CustomAnnouncements announcement) { + this.customAnnouncements.add(announcement); + } + + public void setDefaultAnnouncements(Function defaultAnnouncement) { + this.defaultAnnouncements = defaultAnnouncement; } public void start() { @@ -34,14 +66,17 @@ public class Countdown { this.current = countdownFrom; } - public boolean isDone() { - return current <= 0; - } - private void tick() { - if(current <= 60 && (current <= 10 || current % 10 == 0)) { - this.announcement.accept(current); + AnnouncementData defaultAnnouncementData = this.defaultAnnouncements.apply(current); + if(defaultAnnouncementData != null) { + this.announcementConsumer.accept(this.announcementBuilder.apply(defaultAnnouncementData)); } + + customAnnouncements + .stream() + .filter(a -> a.test.apply(current)) + .forEach(a -> a.task.accept(current)); + this.current--; if(isDone()) { @@ -49,4 +84,12 @@ public class Countdown { this.cancel(); } } + + public boolean isDone() { + return current <= 0; + } + + public boolean isRunning() { + return this.running; + } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/IteratorUtil.java b/src/main/java/eu/mhsl/craftattack/spawn/util/IteratorUtil.java index a5100ba..1606072 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/IteratorUtil.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/util/IteratorUtil.java @@ -1,9 +1,11 @@ package eu.mhsl.craftattack.spawn.util; import org.bukkit.Bukkit; +import org.bukkit.GameRule; import org.bukkit.World; import org.bukkit.entity.Player; +import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; @@ -19,4 +21,8 @@ public class IteratorUtil { public static void onlinePlayers(Consumer player) { Bukkit.getOnlinePlayers().forEach(player); } + + public static void setGameRules(Map, Boolean> rules, boolean inverse) { + rules.forEach((gameRule, value) -> IteratorUtil.worlds(world -> world.setGameRule(gameRule, value ^ inverse))); + } }