From 9bae26044ad68dc1023048986075f088104927fd Mon Sep 17 00:00:00 2001 From: lars Date: Tue, 8 Apr 2025 19:00:49 +0200 Subject: [PATCH] added shrinking border appliance --- .../shrinkingBorder/ShrinkingBorder.java | 97 +++++++++++++++++++ .../ShrinkingBorderCommand.java | 61 ++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorder.java create mode 100644 varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderCommand.java diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorder.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorder.java new file mode 100644 index 0000000..b34abd4 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorder.java @@ -0,0 +1,97 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.shrinkingBorder; + +import eu.mhsl.craftattack.core.Main; +import eu.mhsl.craftattack.core.appliance.Appliance; +import eu.mhsl.craftattack.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.core.config.Configuration; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.WorldBorder; +import org.jetbrains.annotations.NotNull; + +import java.time.LocalTime; +import java.util.*; + +public class ShrinkingBorder extends Appliance { + private final String shrinkPerDayKey = "shrinkPerDay"; + private final String shrinkTimeKey = "shrinkTime"; + private final String minimumSizeKey = "minimumSize"; + public int shrinkPerDay; + public LocalTime shrinkTime; + public int minimumSize; + private final Timer timer = new Timer(); + private final Calendar calendar = Calendar.getInstance(TimeZone.getDefault()); + + private final WorldBorder overworldBorder = Bukkit.getWorlds().stream() + .filter(world -> world.getEnvironment().equals(World.Environment.NORMAL)) + .findFirst().orElseThrow().getWorldBorder(); + private final WorldBorder netherBorder = Bukkit.getWorlds().stream() + .filter(world -> world.getEnvironment().equals(World.Environment.NETHER)) + .findFirst().orElseThrow().getWorldBorder(); + + private class ShrinkBorderTask extends TimerTask { + @Override + public void run() { + Bukkit.getScheduler().runTask(Main.instance(), ShrinkingBorder.this::shrinkBorder); + + } + } + + public ShrinkingBorder() { + super("shrinkingBorder"); + this.shrinkPerDay = this.localConfig().getInt(this.shrinkPerDayKey, 10); + this.shrinkTime = LocalTime.parse(this.localConfig().getString(this.shrinkTimeKey, LocalTime.of(3, 0, 0).toString())); + this.minimumSize = this.localConfig().getInt(this.minimumSizeKey, 10); + + this.calendar.set(Calendar.HOUR_OF_DAY, this.shrinkTime.getHour()); + this.calendar.set(Calendar.MINUTE, this.shrinkTime.getMinute()); + this.calendar.set(Calendar.SECOND, this.shrinkTime.getSecond()); + + if(this.calendar.getTime().before(new Date(System.currentTimeMillis()))) { + this.calendar.add(Calendar.DAY_OF_MONTH, 1); + } + + this.timer.schedule(new ShrinkBorderTask(), this.calendar.getTime()); + } + + private void shrinkBorder() { + this.overworldBorder.setSize(Math.max(this.overworldBorder.getSize()-this.shrinkPerDay, this.minimumSize)); + this.netherBorder.setSize(Math.max(this.netherBorder.getSize()-this.shrinkPerDay, this.minimumSize)); + + this.calendar.add(Calendar.DAY_OF_MONTH, 1); + this.timer.schedule(new ShrinkBorderTask(), this.calendar.getTime()); + } + + public void changeOption(ShrinkingBorderCommand.Argument option, int value) { + switch (option) { + case MINIMUM_SIZE -> { + this.minimumSize = value; + this.localConfig().set(this.minimumSizeKey, value); + } + case SHRINK_PER_DAY -> { + this.shrinkPerDay = value; + this.localConfig().set(this.shrinkPerDayKey, value); + } + } + Configuration.saveChanges(); + } + + public int getOption(ShrinkingBorderCommand.Argument option) { + switch (option) { + case MINIMUM_SIZE -> { + return this.minimumSize; + } + case SHRINK_PER_DAY -> { + return this.shrinkPerDay; + } + default -> { + return 0; + } + } + } + + @Override + protected @NotNull List> commands() { + return List.of(new ShrinkingBorderCommand()); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderCommand.java new file mode 100644 index 0000000..6c91013 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/shrinkingBorder/ShrinkingBorderCommand.java @@ -0,0 +1,61 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.shrinkingBorder; + +import eu.mhsl.craftattack.core.appliance.ApplianceCommand; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.List; + +public class ShrinkingBorderCommand extends ApplianceCommand { + public enum Argument { + SHRINK_PER_DAY("shrinkPerDay"), + MINIMUM_SIZE("minimumSize"); + + public final String name; + + Argument(String friendlyName) { + this.name = friendlyName; + } + + static Argument fromString(String argument) { + return Arrays.stream(values()).filter(argument1 -> argument1.name.equals(argument)).findFirst().orElseThrow(); + } + } + + public ShrinkingBorderCommand() { + super("shrinkingBorder"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(args.length < 1 || args.length > 2) throw new Error("shrinkingBorder command needs one or two arguments"); + if(Arrays.stream(Argument.values()).noneMatch(argument -> argument.name.equals(args[0]))) throw new Error(String.format("argument %s does not exist", args[0])); + Argument option = Argument.fromString(args[0]); + + switch (args.length) { + case 1: + sender.sendMessage(String.format("%s is currently set to %d", args[0], this.getAppliance().getOption(option))); + break; + case 2: + try { + int value = Integer.parseInt(args[1]); + this.getAppliance().changeOption(option, value); + sender.sendMessage(String.format("%s is now set to %d", args[0], this.getAppliance().getOption(option))); + } catch (NumberFormatException e) { + throw new Error("second argument has to be an integer"); + } + break; + default: + throw new Error("shrinkingBorder command needs one or two arguments"); + } + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(args.length > 1) return List.of(); + return Arrays.stream(Argument.values()).map(argument -> argument.name).toList(); + } +}