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.player.PlayerJoinEvent;
import java.util.Optional;
public class AdminMarkerListener extends ApplianceListener<AdminMarker> {
@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)));
}

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.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<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() {
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> worldBorder) {
Bukkit.getWorlds().forEach(world -> worldBorder.accept(world.getWorldBorder()));
private void setGamerules(Map<GameRule<Boolean>, Boolean> rules, boolean inverse) {
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() {

View File

@ -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;