From efd228edfc6a83df1b427f410ed518d9288b6dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 18 Nov 2023 18:19:02 +0100 Subject: [PATCH] Updated countdown design and behavior --- .../adminMarker/AdminMarkerListener.java | 3 + .../spawn/appliances/countdown/Countdown.java | 68 +++++++++++++++++-- .../craftattack/spawn/util/ComponentUtil.java | 4 +- 3 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/adminMarker/AdminMarkerListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/adminMarker/AdminMarkerListener.java index fff2024..d76120d 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/adminMarker/AdminMarkerListener.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/adminMarker/AdminMarkerListener.java @@ -7,12 +7,15 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; +import java.util.Optional; + public class AdminMarkerListener extends ApplianceListener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { Player p = event.getPlayer(); + p.customName(Optional.ofNullable(p.customName()).orElse(p.displayName()).color(getPlayerColor(p))); p.displayName(p.displayName().color(getPlayerColor(p))); p.playerListName(p.playerListName().color(getPlayerColor(p))); } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/Countdown.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/Countdown.java index 3835211..ed3f0c2 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/Countdown.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/countdown/Countdown.java @@ -8,14 +8,19 @@ import eu.mhsl.craftattack.spawn.appliances.countdown.command.ProjectStartComman import eu.mhsl.craftattack.spawn.appliances.countdown.command.ProjectStartResetCommand; import eu.mhsl.craftattack.spawn.appliances.countdown.listener.PlayerInvincibleListener; import eu.mhsl.craftattack.spawn.config.Configuration; +import eu.mhsl.craftattack.spawn.util.ComponentUtil; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.Bukkit; -import org.bukkit.WorldBorder; +import org.bukkit.*; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Map; import java.util.function.Consumer; +import java.util.function.Function; + +import static java.util.Map.entry; public class Countdown extends Appliance { public Countdown() { @@ -25,6 +30,21 @@ public class Countdown extends Appliance { private int taskId = -1; private boolean isRunning = false; private int countDown; + + private final Map, Boolean> gamerulesAfterStart = Map.ofEntries( + entry(GameRule.DO_DAYLIGHT_CYCLE, true), + entry(GameRule.DO_INSOMNIA, true), + entry(GameRule.ANNOUNCE_ADVANCEMENTS, true), + entry(GameRule.DISABLE_RAIDS, false), + entry(GameRule.DO_FIRE_TICK, true), + entry(GameRule.DO_ENTITY_DROPS, true), + entry(GameRule.DO_PATROL_SPAWNING, true), + entry(GameRule.DO_TRADER_SPAWNING, true), + entry(GameRule.DO_WEATHER_CYCLE, true), + entry(GameRule.FALL_DAMAGE, true), + entry(GameRule.FIRE_DAMAGE, true) + ); + public void startCountdown() { if(!isEnabled()) return; if(isRunning) return; @@ -35,9 +55,19 @@ public class Countdown extends Appliance { if(this.countDown <= 0) { this.cancelCountdown(); this.projectStart(); + return; + } + + if(countDown <= 10 || countDown % 10 == 0) { + Bukkit.getOnlinePlayers().forEach(player -> player.sendMessage( + Component.text() + .append(ComponentUtil.createRainbowText("CraftAttack", 10)) + .append(Component.text(" startet in ", NamedTextColor.GOLD)) + .append(Component.text(this.countDown, NamedTextColor.AQUA)) + .append(Component.text(" sekunden.", NamedTextColor.GOLD)) + )); } - Bukkit.getOnlinePlayers().forEach(player -> player.sendMessage("Sekunden:" + this.countDown)); this.countDown--; }, 20, 20); } @@ -61,26 +91,50 @@ public class Countdown extends Appliance { public void projectStart() { setEnabled(false); - worldBorderModifier(worldBorder -> worldBorder.setSize(worldBorder.getMaxSize())); + worldIterator(World::getWorldBorder, worldBorder -> worldBorder.setSize(worldBorder.getMaxSize())); + worldIterator(world -> world, world -> setGamerules(gamerulesAfterStart, false)); + Bukkit.getOnlinePlayers().forEach(player -> { player.setFoodLevel(20); player.setHealth(20); player.playerListName(player.playerListName().color(NamedTextColor.AQUA)); + player.getPlayerProfile().clearProperties(); + player.getInventory().clear(); + player.setGameMode(GameMode.SURVIVAL); + player.setExp(0); + player.setLevel(0); + + player.sendMessage(Component.text("Viel Spaß!", NamedTextColor.GREEN)); }); + + Bukkit.getServer().advancementIterator().forEachRemaining( + advancement -> Bukkit.getOnlinePlayers().forEach( + player -> player.getAdvancementProgress(advancement).getAwardedCriteria().forEach( + criteria -> player.getAdvancementProgress(advancement).revokeCriteria(criteria) + ) + ) + ); + } public void restoreBeforeStart() { setEnabled(true); - worldBorderModifier(worldBorder -> { + worldIterator(World::getWorldBorder, worldBorder -> { worldBorder.setSize(localConfig().getLong("worldborder-before")); worldBorder.setWarningDistance(0); worldBorder.setDamageAmount(0); }); + + worldIterator(world -> world, world -> setGamerules(gamerulesAfterStart, true)); } - private void worldBorderModifier(Consumer worldBorder) { - Bukkit.getWorlds().forEach(world -> worldBorder.accept(world.getWorldBorder())); + private void setGamerules(Map, Boolean> rules, boolean inverse) { + rules.forEach((gameRule, value) -> worldIterator(world -> world, world -> world.setGameRule(gameRule, value ^ inverse))); + } + + private void worldIterator(Function selector, Consumer worldBorder) { + Bukkit.getWorlds().forEach(world -> worldBorder.accept(selector.apply(world))); } public boolean isRunning() { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/ComponentUtil.java b/src/main/java/eu/mhsl/craftattack/spawn/util/ComponentUtil.java index 4a9587f..2071824 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/ComponentUtil.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/util/ComponentUtil.java @@ -66,13 +66,13 @@ public class ComponentUtil { .build(); } - public static Component createRainbowText(String text) { + public static Component createRainbowText(String text, int step) { Component builder = Component.empty(); int hue = 0; for (char c : text.toCharArray()) { TextColor color = TextColor.color(Color.getHSBColor((float) hue / 360, 1, 1).getRGB()); builder = builder.append(Component.text(c).color(color)); - hue += 30; + hue += step; } return builder;