Updated countdown design and behavior

This commit is contained in:
Elias Müller 2023-11-18 18:19:02 +01:00
parent 5786b2409e
commit efd228edfc
3 changed files with 66 additions and 9 deletions

View File

@ -7,12 +7,15 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import java.util.Optional;
public class AdminMarkerListener extends ApplianceListener<AdminMarker> { public class AdminMarkerListener extends ApplianceListener<AdminMarker> {
@EventHandler @EventHandler
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
Player p = event.getPlayer(); Player p = event.getPlayer();
p.customName(Optional.ofNullable(p.customName()).orElse(p.displayName()).color(getPlayerColor(p)));
p.displayName(p.displayName().color(getPlayerColor(p))); p.displayName(p.displayName().color(getPlayerColor(p)));
p.playerListName(p.playerListName().color(getPlayerColor(p))); p.playerListName(p.playerListName().color(getPlayerColor(p)));
} }

View File

@ -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.command.ProjectStartResetCommand;
import eu.mhsl.craftattack.spawn.appliances.countdown.listener.PlayerInvincibleListener; import eu.mhsl.craftattack.spawn.appliances.countdown.listener.PlayerInvincibleListener;
import eu.mhsl.craftattack.spawn.config.Configuration; 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 net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit; import org.bukkit.*;
import org.bukkit.WorldBorder;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function;
import static java.util.Map.entry;
public class Countdown extends Appliance { public class Countdown extends Appliance {
public Countdown() { public Countdown() {
@ -25,6 +30,21 @@ public class Countdown extends Appliance {
private int taskId = -1; private int taskId = -1;
private boolean isRunning = false; private boolean isRunning = false;
private int countDown; private int countDown;
private final Map<GameRule<Boolean>, 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() { public void startCountdown() {
if(!isEnabled()) return; if(!isEnabled()) return;
if(isRunning) return; if(isRunning) return;
@ -35,9 +55,19 @@ public class Countdown extends Appliance {
if(this.countDown <= 0) { if(this.countDown <= 0) {
this.cancelCountdown(); this.cancelCountdown();
this.projectStart(); 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--; this.countDown--;
}, 20, 20); }, 20, 20);
} }
@ -61,26 +91,50 @@ public class Countdown extends Appliance {
public void projectStart() { public void projectStart() {
setEnabled(false); 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 -> { Bukkit.getOnlinePlayers().forEach(player -> {
player.setFoodLevel(20); player.setFoodLevel(20);
player.setHealth(20); player.setHealth(20);
player.playerListName(player.playerListName().color(NamedTextColor.AQUA)); 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() { public void restoreBeforeStart() {
setEnabled(true); setEnabled(true);
worldBorderModifier(worldBorder -> { worldIterator(World::getWorldBorder, worldBorder -> {
worldBorder.setSize(localConfig().getLong("worldborder-before")); worldBorder.setSize(localConfig().getLong("worldborder-before"));
worldBorder.setWarningDistance(0); worldBorder.setWarningDistance(0);
worldBorder.setDamageAmount(0); worldBorder.setDamageAmount(0);
}); });
worldIterator(world -> world, world -> setGamerules(gamerulesAfterStart, true));
} }
private void worldBorderModifier(Consumer<WorldBorder> worldBorder) { private void setGamerules(Map<GameRule<Boolean>, Boolean> rules, boolean inverse) {
Bukkit.getWorlds().forEach(world -> worldBorder.accept(world.getWorldBorder())); rules.forEach((gameRule, value) -> worldIterator(world -> world, world -> world.setGameRule(gameRule, value ^ inverse)));
}
private <T> void worldIterator(Function<World, T> selector, Consumer<T> worldBorder) {
Bukkit.getWorlds().forEach(world -> worldBorder.accept(selector.apply(world)));
} }
public boolean isRunning() { public boolean isRunning() {

View File

@ -66,13 +66,13 @@ public class ComponentUtil {
.build(); .build();
} }
public static Component createRainbowText(String text) { public static Component createRainbowText(String text, int step) {
Component builder = Component.empty(); Component builder = Component.empty();
int hue = 0; int hue = 0;
for (char c : text.toCharArray()) { for (char c : text.toCharArray()) {
TextColor color = TextColor.color(Color.getHSBColor((float) hue / 360, 1, 1).getRGB()); TextColor color = TextColor.color(Color.getHSBColor((float) hue / 360, 1, 1).getRGB());
builder = builder.append(Component.text(c).color(color)); builder = builder.append(Component.text(c).color(color));
hue += 30; hue += step;
} }
return builder; return builder;