diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimer.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimer.java index 268ed93..84009e5 100644 --- a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimer.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimer.java @@ -6,6 +6,7 @@ import eu.mhsl.craftattack.spawn.core.Main; import eu.mhsl.craftattack.spawn.core.api.server.HttpServer; import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.core.config.Configuration; import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.Teams; import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.VaroTeam; import org.jetbrains.annotations.NotNull; @@ -29,9 +30,18 @@ public class PlayTimer extends Appliance { private final Path saveFile = Paths.get(Main.instance().getDataFolder().getAbsolutePath() + "/playtime.json"); public PlayTimer() { + super("playTimer"); this.load(); } + public void changeEnabled(boolean enabled) { + this.localConfig().set("enableTicketing", enabled); + Configuration.saveChanges(); + } + public boolean isEnabled() { + return this.localConfig().getBoolean("enableTicketing", true); + } + private void load() { if (!Files.exists(this.saveFile)) return; try (Reader reader = Files.newBufferedReader(this.saveFile)) { @@ -99,6 +109,9 @@ public class PlayTimer extends Appliance { @Override protected @NotNull List> commands() { - return List.of(new PlayTimerCommand()); + return List.of( + new PlayTimerCommand(), + new TicketingCommand() + ); } } diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimerCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimerCommand.java index 9757190..5452453 100644 --- a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimerCommand.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimerCommand.java @@ -21,7 +21,7 @@ public class PlayTimerCommand extends ApplianceCommand { } @Override - protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) throws Exception { + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (args.length < 3) throw new Error("Usage: playTimer [amount]"); String mode = args[0].toLowerCase(); @@ -37,7 +37,7 @@ public class PlayTimerCommand extends ApplianceCommand { case "team" -> teamAppliance.findTeamByName(identifier); case "incallbyone" -> { this.getAppliance().incrementAll(); - throw new Error("Incremented all Teams by one!"); + throw new Error("KEIN FEHLER!: Incremented all Teams by one!"); } default -> throw new Error("Ungültiger Modus: " + mode + ". Erlaubt: user | team"); }; diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/TicketingCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/TicketingCommand.java new file mode 100644 index 0000000..b253f20 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/TicketingCommand.java @@ -0,0 +1,41 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.playTimer; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams.Teams; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class TicketingCommand extends ApplianceCommand { + public TicketingCommand() { + super("ticketing"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + sender.sendMessage(String.format("Ticketing was %b", this.getAppliance().isEnabled())); + if(args.length < 1) + throw new Error("Stop Ticketing with 'stop' or start ticketing (now subtracting one) and start team-countdown with 'start'"); + + switch(args[0]) { + case "stop" -> this.getAppliance().changeEnabled(false); + case "start" -> { + this.getAppliance().changeEnabled(true); + Main.instance().getAppliance(Teams.class).getAllTeams().forEach(team -> { + boolean isAllowed = this.getAppliance().tryConsumeTicket(team); + if(!isAllowed) { + Main.logger().warning(String.format("Team %s already on Server, Ticketing got enabled but no Tickets were left! KICKING!", team.name)); + team.kickTeam(); + } + + team.startCountDown(); + }); + sender.sendMessage(String.format("Ticketing (ticket reduction on join) is now %b", this.getAppliance().isEnabled())); + } + default -> sender.sendMessage("Unknown command"); + } + + sender.sendMessage(String.format("Ticketing is now %b", this.getAppliance().isEnabled())); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java index 56ab8e5..5970859 100644 --- a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java @@ -3,12 +3,9 @@ package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams; import eu.mhsl.craftattack.spawn.core.Main; import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.core.util.text.Countdown; import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; import eu.mhsl.craftattack.spawn.common.appliances.metaGameplay.displayName.DisplayName; import eu.mhsl.craftattack.spawn.varo.api.repositories.TeamRepository; -import eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks.TeamTasks; -import eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks.tasks.CountdownTeamTask; import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.joinProtection.JoinProtection; import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.playTimer.PlayTimer; import net.kyori.adventure.text.Component; @@ -119,11 +116,15 @@ public class Teams extends Appliance implements DisplayName.Prefixed { if(team == null) throw new IllegalStateException("Player must be in a Team"); PlayTimer playTimer = Main.instance().getAppliance(PlayTimer.class); - boolean isAllowed = playTimer.tryConsumeTicket(team); - if(!isAllowed) { - Main.logger().warning(String.format("Team %s joined, but got denied from Ticketing. Team will be kicked!", team.name)); - team.kickTeam(teamNoPlaytime); - return; + if(playTimer.isEnabled()) { + boolean isAllowed = playTimer.tryConsumeTicket(team); + if(!isAllowed) { + Main.logger().warning(String.format("Team %s joined, but got denied from Ticketing. Team will be kicked!", team.name)); + team.kickTeam(teamNoPlaytime); + return; + } + } else { + Main.logger().info(String.format("Allowing team %s to join, because PlayTimer is not active. Not subtracting from PlayTimer!", team.name)); } int leftTickets = playTimer.getTickets(team); @@ -153,32 +154,7 @@ public class Teams extends Appliance implements DisplayName.Prefixed { .findAny() .ifPresentOrElse( member -> team.kickTeam(teamNotCompleteInfo), - () -> { - Main.logger().info(String.format("Starting Time countdown for Team %s with %d", team.name, PlayTimer.PLAYTIME_MINUTES)); - CountdownTeamTask countdown = new CountdownTeamTask( - 60 * PlayTimer.PLAYTIME_MINUTES, - announcementData -> Component.text( - String.format("Es verbleiben noch %d %s Spielzeit!", announcementData.count(), announcementData.unit()), - NamedTextColor.RED - ), - component -> team.getOnlinePlayers().forEach(player -> player.sendMessage(component)), - team::timeOverKick - ); - countdown.setDefaultAnnouncements(count -> { - if(count > 300) return null; - if(count > 60 && count % 60 == 0) { - return new Countdown.AnnouncementData(count / 60, "Minuten"); - } - - if(count <= 30 && (count <= 10 || count % 10 == 0)) { - return new Countdown.AnnouncementData(count, "Sekunden"); - } - - return null; - }); - countdown.start(); - this.queryAppliance(TeamTasks.class).addTask(team, TeamTasks.Type.TIME_KICK, countdown); - } + team::startCountDown ), Ticks.TICKS_PER_SECOND * (JoinProtection.resistanceDuration / 2) ); diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/VaroTeam.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/VaroTeam.java index 7b3da58..687e461 100644 --- a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/VaroTeam.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/VaroTeam.java @@ -1,9 +1,14 @@ package eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.teams; import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.util.text.Countdown; import eu.mhsl.craftattack.spawn.core.util.text.DisconnectInfo; import eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks.TeamTasks; +import eu.mhsl.craftattack.spawn.varo.appliances.internal.teamTasks.tasks.CountdownTeamTask; import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.fightDetector.FightDetector; +import eu.mhsl.craftattack.spawn.varo.appliances.metaGameplay.playTimer.PlayTimer; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.util.Ticks; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; @@ -68,6 +73,38 @@ public class VaroTeam { .toList(); } + public void startCountDown() { + if(!Main.instance().getAppliance(PlayTimer.class).isEnabled()) { + Main.logger().warning(String.format("PlayTimer for %s not started, because it is deactivated!", this.name)); + return; + } + + Main.logger().info(String.format("Starting Time countdown for Team %s with %d", this.name, PlayTimer.PLAYTIME_MINUTES)); + CountdownTeamTask countdown = new CountdownTeamTask( + 60 * PlayTimer.PLAYTIME_MINUTES, + announcementData -> Component.text( + String.format("Es verbleiben noch %d %s Spielzeit!", announcementData.count(), announcementData.unit()), + NamedTextColor.RED + ), + component -> this.getOnlinePlayers().forEach(player -> player.sendMessage(component)), + this::timeOverKick + ); + countdown.setDefaultAnnouncements(count -> { + if(count > 300) return null; + if(count > 60 && count % 60 == 0) { + return new Countdown.AnnouncementData(count / 60, "Minuten"); + } + + if(count <= 30 && (count <= 10 || count % 10 == 0)) { + return new Countdown.AnnouncementData(count, "Sekunden"); + } + + return null; + }); + countdown.start(); + Main.instance().getAppliance(TeamTasks.class).addTask(this, TeamTasks.Type.TIME_KICK, countdown); + } + public void kickTeam(DisconnectInfo disconnectInfo) { this.getOnlinePlayers() .forEach(player -> player.kick(disconnectInfo.getComponent()));