From 09e8e298a78cd6f660d6efce6f4fe19b181beb2a Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 22 Mar 2026 17:16:58 +0100 Subject: [PATCH 1/4] rewrite contest system launch + add WeeklyEvent for more flexibility --- src/main/java/fr/openmc/core/OMCPlugin.java | 2 +- .../city/sub/notation/NotationManager.java | 2 +- .../scoreboards/sb/MainScoreboard.java | 35 +++-- .../weeklyevents/WeeklyEventsManager.java | 131 ++++++++++++++++++ .../contents/contest/Contest.java | 34 +++++ .../contents/contest/ContestPhase.java | 125 +++++++++++++++++ .../contest/commands/ContestCommand.java | 102 +++++++------- .../ColorContestAutoComplete.java | 4 +- .../ContestPhaseAutoComplete.java | 20 +++ .../TradeContestAutoComplete.java | 4 +- .../contest/events}/ContestEndEvent.java | 8 +- .../listeners/ContestIntractEvents.java | 2 +- .../contest/managers/ContestManager.java | 106 +++----------- .../managers/ContestPlayerManager.java | 4 +- .../contest/managers/TradeYMLManager.java | 10 +- .../contest/menu/ContributionMenu.java | 6 +- .../contents}/contest/menu/MoreInfoMenu.java | 12 +- .../contents}/contest/menu/TradeMenu.java | 8 +- .../contents}/contest/menu/VoteMenu.java | 6 +- .../contents/contest/models/ContestData.java} | 25 ++-- .../contest/models/ContestPlayer.java | 2 +- .../weeklyevents/models/WeeklyEvent.java | 13 ++ .../weeklyevents/models/WeeklyEventPhase.java | 15 ++ .../weeklyevents/models/WeeklyEventsData.java | 29 ++++ .../core/features/mainmenu/menus/Page1.java | 15 +- .../quests/quests/WinContestQuest.java | 2 +- .../java/fr/openmc/core/utils/DateUtils.java | 4 +- .../fr/openmc/core/utils/ParticleUtils.java | 11 +- .../core/utils/database/DatabaseManager.java | 4 +- 29 files changed, 525 insertions(+), 216 deletions(-) create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/Contest.java create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/ContestPhase.java rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/commands/ContestCommand.java (53%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/commands/autocomplete/ColorContestAutoComplete.java (73%) create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/commands/autocomplete/TradeContestAutoComplete.java (73%) rename src/main/java/fr/openmc/core/features/{contest => events/weeklyevents/contents/contest/events}/ContestEndEvent.java (83%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/listeners/ContestIntractEvents.java (89%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/managers/ContestManager.java (87%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/managers/ContestPlayerManager.java (97%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/managers/TradeYMLManager.java (96%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/menu/ContributionMenu.java (96%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/menu/MoreInfoMenu.java (86%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/menu/TradeMenu.java (96%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/menu/VoteMenu.java (97%) rename src/main/java/fr/openmc/core/features/{contest/models/Contest.java => events/weeklyevents/contents/contest/models/ContestData.java} (83%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/models/ContestPlayer.java (93%) create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEvent.java create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventPhase.java create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventsData.java diff --git a/src/main/java/fr/openmc/core/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java index 30d956fca..1a28e1e94 100644 --- a/src/main/java/fr/openmc/core/OMCPlugin.java +++ b/src/main/java/fr/openmc/core/OMCPlugin.java @@ -15,7 +15,6 @@ import fr.openmc.core.features.city.sub.notation.NotationManager; import fr.openmc.core.features.city.sub.statistics.CityStatisticsManager; import fr.openmc.core.features.city.sub.war.WarManager; -import fr.openmc.core.features.contest.managers.ContestManager; import fr.openmc.core.features.cube.multiblocks.MultiBlockManager; import fr.openmc.core.features.displays.TabList; import fr.openmc.core.features.displays.bossbar.BossbarManager; @@ -26,6 +25,7 @@ import fr.openmc.core.features.economy.BankManager; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.features.events.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; import fr.openmc.core.features.homes.HomesManager; import fr.openmc.core.features.homes.icons.HomeIconCacheManager; import fr.openmc.core.features.leaderboards.LeaderboardManager; diff --git a/src/main/java/fr/openmc/core/features/city/sub/notation/NotationManager.java b/src/main/java/fr/openmc/core/features/city/sub/notation/NotationManager.java index 5f9db1242..a4fff03a2 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/notation/NotationManager.java +++ b/src/main/java/fr/openmc/core/features/city/sub/notation/NotationManager.java @@ -338,7 +338,7 @@ public static void giveReward(String weekStr) { * Planifie l'exécution de la tâche de minuit qui calcule les scores et attribue les récompenses. */ private static void scheduleMidnightTask() { - long delayInTicks = DateUtils.getSecondsUntilDayOfWeekMidnight(APPLY_NOTATION_DAY) * 20; + long delayInTicks = DateUtils.getSecondsUntilDayOfWeekTime(APPLY_NOTATION_DAY, 0, 0, 0) * 20; Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> { if (!isApplied) { String weekStr = DateUtils.getWeekFormat(); diff --git a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java index 92d08fca7..68da27b08 100644 --- a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java +++ b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java @@ -9,11 +9,14 @@ import fr.openmc.api.scoreboard.SternalBoard; import fr.openmc.core.features.city.City; import fr.openmc.core.features.city.CityManager; -import fr.openmc.core.features.contest.managers.ContestManager; -import fr.openmc.core.features.contest.models.Contest; import fr.openmc.core.features.displays.scoreboards.BaseScoreboard; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.features.events.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; import fr.openmc.core.utils.DateUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -40,19 +43,21 @@ public void update(Player player, SternalBoard board) { List lines = new ArrayList<>(getDefaultLines(player)); // Contest - Contest data = ContestManager.data; - if (data.getPhase() != 1) { - lines.add(MiniMessage.miniMessage().deserialize("%s".formatted(textToSmall("contest"))).decoration(TextDecoration.BOLD, true)); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall(data.getCamp1()), data.getColor1AsNamedTextColor())) - .append(text(textToSmall(" VS "), NamedTextColor.GRAY)) - .append(text(textToSmall(data.getCamp2()), data.getColor2AsNamedTextColor())) - ); - lines.add(Component.text(" • ", NamedTextColor.DARK_GRAY) - .append(Component.text(textToSmall("fin:"), NamedTextColor.GRAY)) - .appendSpace() - .append(text(DateUtils.getTimeUntilNextDay(DayOfWeek.MONDAY), TextColor.color(0xFF8F06))) - ); + if (WeeklyEventsManager.getCurrentEvent() instanceof Contest) { + ContestData data = ContestManager.data; + if (WeeklyEventsManager.getCurrentPhase() != ContestPhase.VOTE_CAMP.getPhase()) { + lines.add(MiniMessage.miniMessage().deserialize("%s".formatted(textToSmall("contest"))).decoration(TextDecoration.BOLD, true)); + lines.add(text(" • ", NamedTextColor.DARK_GRAY) + .append(text(textToSmall(data.getCamp1()), data.getColor1AsNamedTextColor())) + .append(text(textToSmall(" VS "), NamedTextColor.GRAY)) + .append(text(textToSmall(data.getCamp2()), data.getColor2AsNamedTextColor())) + ); + lines.add(Component.text(" • ", NamedTextColor.DARK_GRAY) + .append(Component.text(textToSmall("fin:"), NamedTextColor.GRAY)) + .appendSpace() + .append(text(DateUtils.getTimeUntilNextDay(DayOfWeek.MONDAY), TextColor.color(0xFF8F06))) + ); + } } lines.add(empty()); diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java new file mode 100644 index 000000000..68af54535 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java @@ -0,0 +1,131 @@ +package fr.openmc.core.features.events.weeklyevents; + +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.support.ConnectionSource; +import com.j256.ormlite.table.TableUtils; +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEvent; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventsData; +import fr.openmc.core.utils.DateUtils; +import org.bukkit.Bukkit; + +import java.sql.SQLException; +import java.util.List; + +public class WeeklyEventsManager { + + private static final List EVENTS = List.of( + new Contest() + ); + + private static Dao dao; + private static WeeklyEventsData data; + + public static void initDB(ConnectionSource connectionSource) throws SQLException { + dao = DaoManager.createDao(connectionSource, WeeklyEventsData.class); + TableUtils.createTableIfNotExists(connectionSource, WeeklyEventsData.class); + + data = load(); + scheduleNextPhase(); + } + + public static WeeklyEventsData load() { + try { + WeeklyEventsData data = dao.queryForId(1); + if (data == null) { + data = new WeeklyEventsData(0, 0); + dao.create(data); + } + return data; + } catch (SQLException e) { + throw new RuntimeException("Erreur lors du chargement de WeeklyEventData", e); + } + } + + public static void save(WeeklyEventsData data) { + try { + dao.createOrUpdate(data); + } catch (SQLException e) { + throw new RuntimeException("Erreur lors de la sauvegarde de WeeklyEventData", e); + } + } + + public static WeeklyEvent getCurrentEvent() { + return EVENTS.get(data.getCurrentEventIndex()); + } + + public static WeeklyEventPhase getCurrentPhase() { + List phases = getCurrentEvent().getPhases(); + int index = data.getCurrentPhaseIndex(); + if (index < 0 || index >= phases.size()) return null; + return phases.get(index); + } + + public static void scheduleNextPhase() { + WeeklyEventPhase nextPhase = findNextPhase(); + if (nextPhase == null) return; + + long delayTicks = DateUtils.getSecondsUntilDayOfWeekTime( + nextPhase.getStartDay(), + nextPhase.getStartHour(), + nextPhase.getStartMinutes(), + 0 + ) * 20L; + + if (delayTicks <= 0) { + runPhase(nextPhase); + return; + } + + Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> { + runPhase(nextPhase); + scheduleNextPhase(); + }, delayTicks); + } + + private static void runPhase(WeeklyEventPhase phase) { + Runnable action = phase.runAction(); + if (action != null) action.run(); + + List phases = getCurrentEvent().getPhases(); + int nextPhaseIndex = data.getCurrentPhaseIndex() + 1; + + if (nextPhaseIndex >= phases.size()) { + advanceToNextEvent(); + } else { + data.setCurrentPhaseIndex(nextPhaseIndex); + save(data); + } + } + + private static void advanceToNextEvent() { + int nextIndex = (data.getCurrentEventIndex() + 1) % EVENTS.size(); + data.setCurrentEventIndex(nextIndex); + data.setCurrentPhaseIndex(0); + save(data); + + OMCPlugin.getInstance().getSLF4JLogger().info("[WeeklyEvents] Passage à l'event suivant : {}", getCurrentEvent().getName().toString()); + } + + private static WeeklyEventPhase findNextPhase() { + WeeklyEvent event = getCurrentEvent(); + List phases = event.getPhases(); + + int phaseStart = data.getCurrentPhaseIndex(); + + for (int i = phaseStart; i < phases.size(); i++) { + WeeklyEventPhase phase = phases.get(i); + long delay = DateUtils.getSecondsUntilDayOfWeekTime( + phase.getStartDay(), + phase.getStartHour(), + phase.getStartMinutes(), + 0 + ); + if (delay >= 0) return phase; + } + return null; + } +} diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/Contest.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/Contest.java new file mode 100644 index 000000000..ab8068dfb --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/Contest.java @@ -0,0 +1,34 @@ +package fr.openmc.core.features.events.weeklyevents.contents.contest; + +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEvent; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; +import fr.openmc.core.registry.items.CustomItemRegistry; +import net.kyori.adventure.text.Component; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; +import java.util.List; + +public class Contest extends WeeklyEvent { + @Override + public Component getName() { + return Component.text("Contest"); + } + + @Override + public List getDescription() { + return List.of( + Component.text("Contest") + ); + } + + @Override + public ItemStack getIcon() { + return CustomItemRegistry.getByName("omc_contest:contest_shell").getBest(); + } + + @Override + public List getPhases() { + return Arrays.stream(ContestPhase.values()).map(ContestPhase::getPhase).toList(); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/ContestPhase.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/ContestPhase.java new file mode 100644 index 000000000..8d90ea3d4 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/ContestPhase.java @@ -0,0 +1,125 @@ +package fr.openmc.core.features.events.weeklyevents.contents.contest; + +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; +import lombok.Getter; +import net.kyori.adventure.text.Component; + +import java.time.DayOfWeek; +import java.util.Arrays; +import java.util.List; + +@Getter +public enum ContestPhase { + VOTE_CAMP(new WeeklyEventPhase() { + @Override + public Component getName() { + return Component.text("Les votes"); + } + + @Override + public List getDescription() { + return Arrays.asList( + Component.text("§7Tout les vendredi, le contest commence"), + Component.text("§7Et les votes s'ouvrent, et il faut choisir"), + Component.text("§7Entre 2 camps, une ambience se crée dans le spawn...") + ); + } + + @Override + public DayOfWeek getStartDay() { + return DayOfWeek.FRIDAY; + } + + @Override + public int getStartHour() { + return 0; + } + + @Override + public int getStartMinutes() { + return 0; + } + + @Override + public Runnable runAction() { + return ContestManager::initPhase1; + } + }), + TRADE_PHASE(new WeeklyEventPhase() { + @Override + public Component getName() { + return Component.text("L'affrontement"); + } + + @Override + public List getDescription() { + return Arrays.asList( + Component.text("§7La nuit tombe sur le spawn pendant 2 jours"), + Component.text("§7Que la fête commence !"), + Component.text("§7Des trades sont disponible"), + Component.text("§7Donnant des coquillages de contest !")); + } + + @Override + public DayOfWeek getStartDay() { + return DayOfWeek.SATURDAY; + } + + @Override + public int getStartHour() { + return 0; + } + + @Override + public int getStartMinutes() { + return 0; + } + + @Override + public Runnable runAction() { + return ContestManager::initPhase2; + } + }), + END_PHASE(new WeeklyEventPhase() { + @Override + public Component getName() { + return Component.text("Les résultats"); + } + + @Override + public List getDescription() { + return Arrays.asList( + Component.text("§7Le levé de soleil sur le spawn !"), + Component.text("§7Les résultats tombent, et un camp"), + Component.text("§7sera gagnant. Et des récompenses seront attribuées"), + Component.text(("§7à chacun."))); + } + + @Override + public DayOfWeek getStartDay() { + return DayOfWeek.MONDAY; + } + + @Override + public int getStartHour() { + return 0; + } + + @Override + public int getStartMinutes() { + return 0; + } + + @Override + public Runnable runAction() { + return ContestManager::initPhase3; + } + }) + ; + + private final WeeklyEventPhase phase; + ContestPhase(WeeklyEventPhase phase) { + this.phase = phase; + } +} diff --git a/src/main/java/fr/openmc/core/features/contest/commands/ContestCommand.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/ContestCommand.java similarity index 53% rename from src/main/java/fr/openmc/core/features/contest/commands/ContestCommand.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/ContestCommand.java index 608af262f..fce84a395 100644 --- a/src/main/java/fr/openmc/core/features/contest/commands/ContestCommand.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/ContestCommand.java @@ -1,13 +1,19 @@ -package fr.openmc.core.features.contest.commands; +package fr.openmc.core.features.events.weeklyevents.contents.contest.commands; import fr.openmc.core.commands.autocomplete.OnlinePlayerAutoComplete; -import fr.openmc.core.features.contest.commands.autocomplete.ColorContestAutoComplete; -import fr.openmc.core.features.contest.commands.autocomplete.TradeContestAutoComplete; -import fr.openmc.core.features.contest.managers.ContestManager; -import fr.openmc.core.features.contest.managers.ContestPlayerManager; -import fr.openmc.core.features.contest.managers.TradeYMLManager; -import fr.openmc.core.features.contest.menu.ContributionMenu; -import fr.openmc.core.features.contest.menu.VoteMenu; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete.ColorContestAutoComplete; +import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete.ContestPhaseAutoComplete; +import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete.TradeContestAutoComplete; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestPlayerManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.TradeYMLManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.ContributionMenu; +import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.VoteMenu; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEvent; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; import fr.openmc.core.utils.DateUtils; import fr.openmc.core.utils.messages.MessageType; import fr.openmc.core.utils.messages.MessagesManager; @@ -18,9 +24,10 @@ import revxrsal.commands.annotation.*; import revxrsal.commands.bukkit.annotation.CommandPermission; -import java.time.DayOfWeek; -import java.time.format.DateTimeFormatter; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Map; @Command("contest") @Description("Ouvre l'interface des festivals, et quand un festival commence, vous pouvez choisir votre camp") @@ -28,19 +35,24 @@ public class ContestCommand { @Cooldown(4) @CommandPlaceholder() public static void mainCommand(Player player) { - int phase = ContestManager.data.getPhase(); - if ((phase >= 2 && ContestManager.dataPlayer.get(player.getUniqueId()) == null) || (phase == 2)) { - VoteMenu menu = new VoteMenu(player); - menu.open(); - } else if (phase == 3 && ContestManager.dataPlayer.get(player.getUniqueId()) != null) { - ContributionMenu menu = new ContributionMenu(player); - menu.open(); + WeeklyEvent currentEvent = WeeklyEventsManager.getCurrentEvent(); + WeeklyEventPhase currentPhase = WeeklyEventsManager.getCurrentPhase(); - } else { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E", Locale.FRENCH); - DayOfWeek dayStartContestOfWeek = DayOfWeek.from(formatter.parse(ContestManager.data.getStartdate())); + if (!(currentEvent instanceof Contest)) { + MessagesManager.sendMessage(player, Component.text("§cIl n'y a aucun Contest en ce moment !"), Prefix.CONTEST, MessageType.ERROR, true); + return; + } + + WeeklyEventPhase votePhase = ContestPhase.VOTE_CAMP.getPhase(); + WeeklyEventPhase tradePhase = ContestPhase.TRADE_PHASE.getPhase(); - int days = (dayStartContestOfWeek.getValue() - DateUtils.getCurrentDayOfWeek().getValue() + 7) % 7; + if (currentPhase == votePhase || (currentPhase == tradePhase && ContestManager.dataPlayer.get(player.getUniqueId()) == null)) { + new VoteMenu(player).open(); + } else if (currentPhase == tradePhase && ContestManager.dataPlayer.get(player.getUniqueId()) != null) { + new ContributionMenu(player).open(); + } else { + int days = (ContestPhase.VOTE_CAMP.getPhase().getStartDay().getValue() + - DateUtils.getCurrentDayOfWeek().getValue() + 7) % 7; MessagesManager.sendMessage(player, Component.text("§cIl n'y a aucun Contest ! Revenez dans " + days + " jour(s)."), Prefix.CONTEST, MessageType.ERROR, true); } @@ -49,18 +61,8 @@ public static void mainCommand(Player player) { @Subcommand("setphase") @Description("Permet de lancer une procédure de phase") @CommandPermission("omc.admin.commands.contest.setphase") - public void setPhase(@Named("phase") @Suggest({"1", "2", "3"}) Integer phase) { - switch(phase) { - case 2: - ContestManager.initPhase2(); - break; - case 3: - ContestManager.initPhase3(); - break; - default: - ContestManager.initPhase1(); - break; - } + public void setPhase(@Named("phase") @SuggestWith(ContestPhaseAutoComplete.class) String phase) { + ContestPhase.valueOf(phase).getPhase().runAction().run(); } @Subcommand("setcontest") @@ -73,19 +75,23 @@ public void setContest( @Named("nom du camp 2") String camp2, @Named("couleur du camp 2") @SuggestWith(ColorContestAutoComplete.class) String color2 ) { - int phase = ContestManager.data.getPhase(); - if (phase == 1) { - // It is unique, but it is for performance reasons - if (new HashSet<>(ContestManager.getColorContestList()).containsAll(Arrays.asList(color1, color2))) { - ContestManager.clearDB(); - ContestManager.insertCustomContest(camp1, color1, camp2, color2); - - MessagesManager.sendMessage(player, Component.text("§aLe Contest : " + camp1 + " VS " + camp2 + " a bien été sauvegardé\nMerci d'attendre que les données en cache s'actualise."), Prefix.STAFF, MessageType.SUCCESS, true); - } else { - MessagesManager.sendMessage(player, Component.text("§c/contest setcontest et color doit comporter une couleur valide"), Prefix.STAFF, MessageType.ERROR, true); - } + if (!(WeeklyEventsManager.getCurrentEvent() instanceof Contest)) { + MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas définir un contest lorsqu'il n'est pas actif"), Prefix.STAFF, MessageType.ERROR, true); + return; + } + + if (WeeklyEventsManager.getCurrentPhase() != ContestPhase.VOTE_CAMP.getPhase()) { + MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas définir un contest lorsqu'il a commencé"), Prefix.STAFF, MessageType.ERROR, true); + return; + } + + // It is unique, but it is for performance reasons + if (new HashSet<>(ContestManager.getColorContestList()).containsAll(Arrays.asList(color1, color2))) { + ContestManager.clearDB(); + ContestManager.insertCustomContest(camp1, color1, camp2, color2); + MessagesManager.sendMessage(player, Component.text("§aLe Contest : " + camp1 + " VS " + camp2 + " a bien été sauvegardé\nMerci d'attendre que les données en cache s'actualise."), Prefix.STAFF, MessageType.SUCCESS, true); } else { - MessagesManager.sendMessage(player, Component.text("§cVous pouvez pas définir un contest lorsqu'il a commencé"), Prefix.STAFF, MessageType.ERROR, true); + MessagesManager.sendMessage(player, Component.text("§c/contest setcontest et color doit comporter une couleur valide"), Prefix.STAFF, MessageType.ERROR, true); } } @@ -127,7 +133,7 @@ public void addPoints( @Named("membre") @SuggestWith(OnlinePlayerAutoComplete.class) Player target, @Named("points") Integer points ) { - if (ContestManager.data.getPhase()!=3) { + if (WeeklyEventsManager.getCurrentPhase() != ContestPhase.TRADE_PHASE.getPhase()) { MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas donner des points lorsque le contest n'a pas commencé"), Prefix.STAFF, MessageType.ERROR, true); return; } @@ -137,7 +143,7 @@ public void addPoints( return; } - if (points<=0) { + if (points <= 0) { MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas donner des points négatifs ou égal à 0"), Prefix.STAFF, MessageType.ERROR, true); return; } diff --git a/src/main/java/fr/openmc/core/features/contest/commands/autocomplete/ColorContestAutoComplete.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java similarity index 73% rename from src/main/java/fr/openmc/core/features/contest/commands/autocomplete/ColorContestAutoComplete.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java index 8375b2f0c..f5e6bc354 100644 --- a/src/main/java/fr/openmc/core/features/contest/commands/autocomplete/ColorContestAutoComplete.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.contest.commands.autocomplete; +package fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete; -import fr.openmc.core.features.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; import org.jetbrains.annotations.NotNull; import revxrsal.commands.autocomplete.SuggestionProvider; import revxrsal.commands.bukkit.actor.BukkitCommandActor; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java new file mode 100644 index 000000000..930499273 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java @@ -0,0 +1,20 @@ +package fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete; + +import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.autocomplete.SuggestionProvider; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.node.ExecutionContext; + +import java.util.Arrays; +import java.util.List; + +public class ContestPhaseAutoComplete implements SuggestionProvider { + + @Override + public @NotNull List getSuggestions(@NotNull ExecutionContext context) { + return Arrays.stream(ContestPhase.values()) + .map(Enum::name) + .toList(); + } +} diff --git a/src/main/java/fr/openmc/core/features/contest/commands/autocomplete/TradeContestAutoComplete.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java similarity index 73% rename from src/main/java/fr/openmc/core/features/contest/commands/autocomplete/TradeContestAutoComplete.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java index d416fd1d8..8c952eedc 100644 --- a/src/main/java/fr/openmc/core/features/contest/commands/autocomplete/TradeContestAutoComplete.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.contest.commands.autocomplete; +package fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete; -import fr.openmc.core.features.contest.managers.TradeYMLManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.TradeYMLManager; import org.jetbrains.annotations.NotNull; import revxrsal.commands.autocomplete.SuggestionProvider; import revxrsal.commands.bukkit.actor.BukkitCommandActor; diff --git a/src/main/java/fr/openmc/core/features/contest/ContestEndEvent.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/events/ContestEndEvent.java similarity index 83% rename from src/main/java/fr/openmc/core/features/contest/ContestEndEvent.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/events/ContestEndEvent.java index c15a04e1b..9d49e216e 100644 --- a/src/main/java/fr/openmc/core/features/contest/ContestEndEvent.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/events/ContestEndEvent.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.contest; +package fr.openmc.core.features.events.weeklyevents.contents.contest.events; -import fr.openmc.core.features.contest.models.Contest; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; import lombok.Getter; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @@ -19,7 +19,7 @@ public class ContestEndEvent extends Event { /** * Les données associées au contest. */ - private final Contest contestData; + private final ContestData contestData; /** * Liste statique des handlers pour l'événement. @@ -43,7 +43,7 @@ public class ContestEndEvent extends Event { * @param winners La liste des gagnants * @param losers La liste des perdants */ - public ContestEndEvent(Contest contestData, List winners, List losers) { + public ContestEndEvent(ContestData contestData, List winners, List losers) { this.contestData = contestData; this.winners = winners; this.losers = losers; diff --git a/src/main/java/fr/openmc/core/features/contest/listeners/ContestIntractEvents.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/listeners/ContestIntractEvents.java similarity index 89% rename from src/main/java/fr/openmc/core/features/contest/listeners/ContestIntractEvents.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/listeners/ContestIntractEvents.java index 05e9e6c49..0e5665de3 100644 --- a/src/main/java/fr/openmc/core/features/contest/listeners/ContestIntractEvents.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/listeners/ContestIntractEvents.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.contest.listeners; +package fr.openmc.core.features.events.weeklyevents.contents.contest.listeners; import dev.lone.itemsadder.api.Events.FurnitureInteractEvent; import org.bukkit.Bukkit; diff --git a/src/main/java/fr/openmc/core/features/contest/managers/ContestManager.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestManager.java similarity index 87% rename from src/main/java/fr/openmc/core/features/contest/managers/ContestManager.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestManager.java index 3b5ae4cd8..0255e044d 100644 --- a/src/main/java/fr/openmc/core/features/contest/managers/ContestManager.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestManager.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.contest.managers; +package fr.openmc.core.features.events.weeklyevents.contents.contest.managers; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.DaoManager; @@ -8,21 +8,20 @@ import fr.openmc.api.menulib.Menu; import fr.openmc.core.CommandsManager; import fr.openmc.core.OMCPlugin; -import fr.openmc.core.features.contest.ContestEndEvent; -import fr.openmc.core.features.contest.commands.ContestCommand; -import fr.openmc.core.features.contest.listeners.ContestIntractEvents; -import fr.openmc.core.features.contest.menu.ContributionMenu; -import fr.openmc.core.features.contest.menu.MoreInfoMenu; -import fr.openmc.core.features.contest.menu.TradeMenu; -import fr.openmc.core.features.contest.menu.VoteMenu; -import fr.openmc.core.features.contest.models.Contest; -import fr.openmc.core.features.contest.models.ContestPlayer; import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.ContestCommand; +import fr.openmc.core.features.events.weeklyevents.contents.contest.events.ContestEndEvent; +import fr.openmc.core.features.events.weeklyevents.contents.contest.listeners.ContestIntractEvents; +import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.ContributionMenu; +import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.MoreInfoMenu; +import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.TradeMenu; +import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.VoteMenu; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestPlayer; import fr.openmc.core.features.leaderboards.LeaderboardManager; import fr.openmc.core.features.mailboxes.MailboxManager; import fr.openmc.core.registry.items.CustomItemRegistry; import fr.openmc.core.utils.ColorUtils; -import fr.openmc.core.utils.DateUtils; import fr.openmc.core.utils.ParticleUtils; import fr.openmc.core.utils.cache.CacheOfflinePlayer; import fr.openmc.core.utils.database.DatabaseManager; @@ -42,7 +41,6 @@ import java.sql.SQLException; import java.text.DecimalFormat; -import java.time.DayOfWeek; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -51,11 +49,7 @@ public class ContestManager { - private static final DayOfWeek START_CONTEST_DAY = DayOfWeek.FRIDAY; - private static final DayOfWeek START_TRADE_CONTEST_DAY = DayOfWeek.SATURDAY; - private static final DayOfWeek END_CONTEST_DAY = DayOfWeek.MONDAY; - - public static Contest data; + public static ContestData data; public static Map dataPlayer = new HashMap<>(); private static final List colorContest = Arrays.asList( @@ -94,19 +88,14 @@ public static void init() { ); // ** MANAGER EXTERNE ** - new TradeYMLManager(); + TradeYMLManager.init(); // ** LOAD DATAS ** initContestData(); loadContestPlayerData(); - - // ** SCHEDULE TASK ** - scheduleStartContest(); - scheduleStartTradeContest(); - scheduleEndContest(); } - private static Dao contestDao; + private static Dao contestDao; private static Dao playerDao; /** @@ -114,8 +103,8 @@ public static void init() { * (création des tables si elles n’existent pas encore) */ public static void initDB(ConnectionSource connectionSource) throws SQLException { - TableUtils.createTableIfNotExists(connectionSource, Contest.class); - contestDao = DaoManager.createDao(connectionSource, Contest.class); + TableUtils.createTableIfNotExists(connectionSource, ContestData.class); + contestDao = DaoManager.createDao(connectionSource, ContestData.class); TableUtils.createTableIfNotExists(connectionSource, ContestPlayer.class); playerDao = DaoManager.createDao(connectionSource, ContestPlayer.class); @@ -129,7 +118,7 @@ public static void initContestData() { try { data = contestDao.queryForFirst(); if (data == null) { - data = new Contest("Mayonnaise", "Ketchup", "YELLOW", "RED", 1, "ven.", 0, 0); + data = new ContestData("Mayonnaise", "Ketchup", "YELLOW", "RED", 0, 0); contestDao.create(data); } } catch (SQLException e) { @@ -180,7 +169,7 @@ public static void saveContestPlayerData() { */ public static void clearDB() { try { - TableUtils.clearTable(DatabaseManager.getConnectionSource(), Contest.class); + TableUtils.clearTable(DatabaseManager.getConnectionSource(), ContestData.class); TableUtils.clearTable(DatabaseManager.getConnectionSource(), ContestPlayer.class); } catch (SQLException e) { throw new RuntimeException(e); @@ -194,7 +183,6 @@ public static void clearDB() { * - Diffuse un message et joue un son aux joueurs connectés */ public static void initPhase1() { - data.setPhase(2); ParticleUtils.color1 = null; ParticleUtils.color2 = null; @@ -230,8 +218,6 @@ public static void initPhase2() { TradeYMLManager.updateColumnBooleanFromRandomTrades(true, (String) trade.get("ress")); } - data.setPhase(3); - Bukkit.broadcast(Component.text(""" §8§m §r §7 @@ -256,8 +242,6 @@ public static void initPhase2() { * - Réinitialise les données en DB pour le prochain contest */ public static void initPhase3() { - data.setPhase(4); - ParticleUtils.color1 = null; ParticleUtils.color2 = null; @@ -571,60 +555,6 @@ public static List getColorContestList() { * Insère un contest personnalisé dans la DB avec 2 camps et leurs couleurs. */ public static void insertCustomContest(String camp1, String color1, String camp2, String color2) { - data = new Contest(camp1, camp2, color1, color2, 1, "ven.", 0, 0); - } - - /** - * Programme le lancement de la phase 1 (votes) chaque vendredi à minuit. - */ - private static void scheduleStartContest() { - long delayInTicks = DateUtils.getSecondsUntilDayOfWeekMidnight(START_CONTEST_DAY) * 20; - - if (data.getPhase() == 1 && DateUtils.getCurrentDayOfWeek().equals(START_CONTEST_DAY)) { - ContestManager.initPhase1(); - } - - Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> { - if (data.getPhase() != 1) return; - - ContestManager.initPhase1(); - scheduleStartContest(); - }, delayInTicks); - } - - /** - * Programme le lancement de la phase 2 (contributions) chaque samedi à minuit. - */ - private static void scheduleStartTradeContest() { - long delayInTicks = DateUtils.getSecondsUntilDayOfWeekMidnight(START_TRADE_CONTEST_DAY) * 20; - - if (data.getPhase() == 2 && DateUtils.getCurrentDayOfWeek().equals(START_TRADE_CONTEST_DAY)) { - ContestManager.initPhase2(); - } - - Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> { - if (data.getPhase() != 2) return; - - ContestManager.initPhase2(); - scheduleStartTradeContest(); - }, delayInTicks); - } - - /** - * Programme la fin du contest (phase 3) chaque lundi à minuit. - */ - private static void scheduleEndContest() { - long delayInTicks = DateUtils.getSecondsUntilDayOfWeekMidnight(END_CONTEST_DAY) * 20; - - if (data.getPhase() == 3 && DateUtils.getCurrentDayOfWeek().equals(END_CONTEST_DAY)) { - ContestManager.initPhase3(); - } - - Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> { - if (data.getPhase() != 3) return; - - ContestManager.initPhase3(); - scheduleEndContest(); - }, delayInTicks); + data = new ContestData(camp1, camp2, color1, color2, 0, 0); } } diff --git a/src/main/java/fr/openmc/core/features/contest/managers/ContestPlayerManager.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestPlayerManager.java similarity index 97% rename from src/main/java/fr/openmc/core/features/contest/managers/ContestPlayerManager.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestPlayerManager.java index 3690b36dd..297aae673 100644 --- a/src/main/java/fr/openmc/core/features/contest/managers/ContestPlayerManager.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestPlayerManager.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.contest.managers; +package fr.openmc.core.features.events.weeklyevents.contents.contest.managers; -import fr.openmc.core.features.contest.models.ContestPlayer; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestPlayer; import lombok.Setter; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; diff --git a/src/main/java/fr/openmc/core/features/contest/managers/TradeYMLManager.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/TradeYMLManager.java similarity index 96% rename from src/main/java/fr/openmc/core/features/contest/managers/TradeYMLManager.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/TradeYMLManager.java index 725830124..2d0c9ccd8 100644 --- a/src/main/java/fr/openmc/core/features/contest/managers/TradeYMLManager.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/TradeYMLManager.java @@ -1,7 +1,7 @@ -package fr.openmc.core.features.contest.managers; +package fr.openmc.core.features.events.weeklyevents.contents.contest.managers; import fr.openmc.core.OMCPlugin; -import fr.openmc.core.features.contest.models.Contest; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; import fr.openmc.core.utils.YmlUtils; import lombok.Getter; import org.bukkit.configuration.file.FileConfiguration; @@ -33,7 +33,7 @@ public class TradeYMLManager { * Constructeur de TradeYMLManager. * Initialise le fichier contest.yml et charge sa configuration. */ - public TradeYMLManager() { + public static void init() { contestFile = new File(OMCPlugin.getInstance().getDataFolder() + "/data", "contest.yml"); loadContestConfig(); } @@ -197,13 +197,11 @@ public static void selectRandomlyContest() { Random random = new Random(); Map selectedContest = leastSelectedContests.get(random.nextInt(leastSelectedContests.size())); - ContestManager.data = new Contest( + ContestManager.data = new ContestData( (String) selectedContest.get("camp1"), (String) selectedContest.get("camp2"), (String) selectedContest.get("color1"), (String) selectedContest.get("color2"), - 1, - "ven.", 0, 0 ); diff --git a/src/main/java/fr/openmc/core/features/contest/menu/ContributionMenu.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/ContributionMenu.java similarity index 96% rename from src/main/java/fr/openmc/core/features/contest/menu/ContributionMenu.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/ContributionMenu.java index 2048a6d74..5d51aeb88 100644 --- a/src/main/java/fr/openmc/core/features/contest/menu/ContributionMenu.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/ContributionMenu.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.contest.menu; +package fr.openmc.core.features.events.weeklyevents.contents.contest.menu; import dev.lone.itemsadder.api.CustomStack; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; @@ -6,8 +6,8 @@ import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.contest.managers.ContestManager; -import fr.openmc.core.features.contest.managers.ContestPlayerManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestPlayerManager; import fr.openmc.core.registry.items.CustomItemRegistry; import fr.openmc.core.utils.ColorUtils; import fr.openmc.core.utils.ItemUtils; diff --git a/src/main/java/fr/openmc/core/features/contest/menu/MoreInfoMenu.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/MoreInfoMenu.java similarity index 86% rename from src/main/java/fr/openmc/core/features/contest/menu/MoreInfoMenu.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/MoreInfoMenu.java index e979d9d20..9f7512b7c 100644 --- a/src/main/java/fr/openmc/core/features/contest/menu/MoreInfoMenu.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/MoreInfoMenu.java @@ -1,10 +1,12 @@ -package fr.openmc.core.features.contest.menu; +package fr.openmc.core.features.events.weeklyevents.contents.contest.menu; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -68,10 +70,10 @@ public void onInventoryClick(InventoryClickEvent click) { ); - int phase = ContestManager.data.getPhase(); + WeeklyEventPhase phase = WeeklyEventsManager.getCurrentPhase(); - boolean ench0 = phase == 2; - boolean ench1 = phase == 3; + boolean ench0 = phase == ContestPhase.VOTE_CAMP.getPhase(); + boolean ench1 = phase == ContestPhase.TRADE_PHASE.getPhase(); inventory.put(11, new ItemBuilder(this, Material.BLUE_STAINED_GLASS_PANE, itemMeta -> { itemMeta.displayName(Component.text("§r§1Les votes - Vendredi")); diff --git a/src/main/java/fr/openmc/core/features/contest/menu/TradeMenu.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/TradeMenu.java similarity index 96% rename from src/main/java/fr/openmc/core/features/contest/menu/TradeMenu.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/TradeMenu.java index 812c11753..ef9864dea 100644 --- a/src/main/java/fr/openmc/core/features/contest/menu/TradeMenu.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/TradeMenu.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.contest.menu; +package fr.openmc.core.features.events.weeklyevents.contents.contest.menu; import dev.lone.itemsadder.api.CustomStack; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; @@ -6,9 +6,9 @@ import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.contest.managers.ContestManager; -import fr.openmc.core.features.contest.managers.ContestPlayerManager; -import fr.openmc.core.features.contest.managers.TradeYMLManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestPlayerManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.TradeYMLManager; import fr.openmc.core.features.mailboxes.MailboxManager; import fr.openmc.core.registry.items.CustomItemRegistry; import fr.openmc.core.utils.ItemUtils; diff --git a/src/main/java/fr/openmc/core/features/contest/menu/VoteMenu.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/VoteMenu.java similarity index 97% rename from src/main/java/fr/openmc/core/features/contest/menu/VoteMenu.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/VoteMenu.java index c1c580989..974162757 100644 --- a/src/main/java/fr/openmc/core/features/contest/menu/VoteMenu.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/VoteMenu.java @@ -1,12 +1,12 @@ -package fr.openmc.core.features.contest.menu; +package fr.openmc.core.features.events.weeklyevents.contents.contest.menu; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.template.ConfirmMenu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.contest.managers.ContestManager; -import fr.openmc.core.features.contest.models.ContestPlayer; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestPlayer; import fr.openmc.core.utils.ColorUtils; import fr.openmc.core.utils.messages.MessageType; import fr.openmc.core.utils.messages.MessagesManager; diff --git a/src/main/java/fr/openmc/core/features/contest/models/Contest.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestData.java similarity index 83% rename from src/main/java/fr/openmc/core/features/contest/models/Contest.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestData.java index 43fd7b0c7..52e0b21d6 100644 --- a/src/main/java/fr/openmc/core/features/contest/models/Contest.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestData.java @@ -1,18 +1,17 @@ -package fr.openmc.core.features.contest.models; - -import lombok.Getter; -import lombok.Setter; - -import java.util.Objects; +package fr.openmc.core.features.events.weeklyevents.contents.contest.models; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; +import lombok.Getter; +import lombok.Setter; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import java.util.Objects; + @Getter @DatabaseTable(tableName = "contests") -public class Contest { +public class ContestData { @DatabaseField(id = true) private int id; // required for Dao.update function @@ -26,29 +25,21 @@ public class Contest { private String color2; @Setter @DatabaseField(canBeNull = false) - private int phase; - @DatabaseField(canBeNull = false) - private String startdate; - @Setter - @DatabaseField(canBeNull = false) private int points1; @Setter @DatabaseField(canBeNull = false) private int points2; - Contest() { + ContestData() { // required for ORMLite } - public Contest(String camp1, String camp2, String color1, String color2, int phase, String startdate, int points1, - int points2) { + public ContestData(String camp1, String camp2, String color1, String color2, int points1, int points2) { this.id = 1; // we will only be storing one row, so we need a constant id this.camp1 = camp1; this.camp2 = camp2; this.color1 = color1; this.color2 = color2; - this.phase = phase; - this.startdate = startdate; this.points1 = points1; this.points2 = points2; } diff --git a/src/main/java/fr/openmc/core/features/contest/models/ContestPlayer.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestPlayer.java similarity index 93% rename from src/main/java/fr/openmc/core/features/contest/models/ContestPlayer.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestPlayer.java index 87649a3ce..1c8500827 100644 --- a/src/main/java/fr/openmc/core/features/contest/models/ContestPlayer.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestPlayer.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.contest.models; +package fr.openmc.core.features.events.weeklyevents.contents.contest.models; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEvent.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEvent.java new file mode 100644 index 000000000..f51506c99 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEvent.java @@ -0,0 +1,13 @@ +package fr.openmc.core.features.events.weeklyevents.models; + +import net.kyori.adventure.text.Component; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public abstract class WeeklyEvent { + public abstract Component getName(); + public abstract List getDescription(); + public abstract ItemStack getIcon(); + public abstract List getPhases(); +} diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventPhase.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventPhase.java new file mode 100644 index 000000000..2df8d2fd6 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventPhase.java @@ -0,0 +1,15 @@ +package fr.openmc.core.features.events.weeklyevents.models; + +import net.kyori.adventure.text.Component; + +import java.time.DayOfWeek; +import java.util.List; + +public abstract class WeeklyEventPhase { + public abstract Component getName(); + public abstract List getDescription(); + public abstract DayOfWeek getStartDay(); + public abstract int getStartHour(); + public abstract int getStartMinutes(); + public abstract Runnable runAction(); +} diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventsData.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventsData.java new file mode 100644 index 000000000..08cbb32eb --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventsData.java @@ -0,0 +1,29 @@ +package fr.openmc.core.features.events.weeklyevents.models; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import lombok.Getter; +import lombok.Setter; + +@Getter +@DatabaseTable(tableName = "weekly_event_data") +public class WeeklyEventsData { + + @DatabaseField(id = true, columnName = "id") + private int id = 1; + + @Setter + @DatabaseField(columnName = "current_event_index") + private int currentEventIndex; + + @Setter + @DatabaseField(columnName = "current_phase_index") + private int currentPhaseIndex; + + public WeeklyEventsData() {} + + public WeeklyEventsData(int currentEventIndex, int currentPhaseIndex) { + this.currentEventIndex = currentEventIndex; + this.currentPhaseIndex = currentPhaseIndex; + } +} diff --git a/src/main/java/fr/openmc/core/features/mainmenu/menus/Page1.java b/src/main/java/fr/openmc/core/features/mainmenu/menus/Page1.java index d81ce2858..024f6e2b9 100644 --- a/src/main/java/fr/openmc/core/features/mainmenu/menus/Page1.java +++ b/src/main/java/fr/openmc/core/features/mainmenu/menus/Page1.java @@ -13,10 +13,13 @@ import fr.openmc.core.features.city.City; import fr.openmc.core.features.city.CityManager; import fr.openmc.core.features.city.commands.CityCommands; -import fr.openmc.core.features.contest.commands.ContestCommand; -import fr.openmc.core.features.contest.managers.ContestManager; -import fr.openmc.core.features.contest.models.Contest; import fr.openmc.core.features.dream.DreamUtils; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.ContestCommand; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; import fr.openmc.core.features.homes.command.TpHomeCommand; import fr.openmc.core.features.mailboxes.MailboxCommand; import fr.openmc.core.features.mainmenu.listeners.PacketListener; @@ -107,9 +110,9 @@ public Page1(Player player) { MILESTONES_SLOTS.forEach(slot -> content.put(slot, milestonesItem)); ItemStack contestItem = new ItemStack(Material.PAPER); - Contest data = ContestManager.data; - int phase = data.getPhase(); - if (phase != 1) { + ContestData data = ContestManager.data; + + if (WeeklyEventsManager.getCurrentEvent() instanceof Contest && WeeklyEventsManager.getCurrentPhase() != ContestPhase.END_PHASE.getPhase()) { contestItem.editMeta(meta -> { meta.setItemModel(NamespacedKey.minecraft("air")); meta.itemName(data.getCampVSComponent()); diff --git a/src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java b/src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java index 484b5af98..1ee79ee53 100644 --- a/src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java +++ b/src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java @@ -1,6 +1,6 @@ package fr.openmc.core.features.quests.quests; -import fr.openmc.core.features.contest.ContestEndEvent; +import fr.openmc.core.features.events.weeklyevents.contents.contest.events.ContestEndEvent; import fr.openmc.core.features.quests.objects.Quest; import fr.openmc.core.features.quests.objects.QuestTier; import fr.openmc.core.features.quests.rewards.QuestItemReward; diff --git a/src/main/java/fr/openmc/core/utils/DateUtils.java b/src/main/java/fr/openmc/core/utils/DateUtils.java index 608245495..3fd482348 100644 --- a/src/main/java/fr/openmc/core/utils/DateUtils.java +++ b/src/main/java/fr/openmc/core/utils/DateUtils.java @@ -173,10 +173,10 @@ public static String getTimeUntilNextDay(DayOfWeek day) { return String.format("%dd %dh %dm", days, hours, minutes); } - public static long getSecondsUntilDayOfWeekMidnight(DayOfWeek dayOfWeek) { + public static long getSecondsUntilDayOfWeekTime(DayOfWeek dayOfWeek, int hour, int minute, int second) { LocalDateTime now = LocalDateTime.now(); LocalDateTime nextDayOfWeekMidnight = now.with(TemporalAdjusters.nextOrSame(dayOfWeek)) - .withHour(0).withMinute(0).withSecond(0).withNano(0); + .withHour(hour).withMinute(minute).withSecond(second).withNano(0); if (!now.isBefore(nextDayOfWeekMidnight)) { nextDayOfWeekMidnight = nextDayOfWeekMidnight.plusWeeks(1); diff --git a/src/main/java/fr/openmc/core/utils/ParticleUtils.java b/src/main/java/fr/openmc/core/utils/ParticleUtils.java index c9bd808e8..c43b92be4 100644 --- a/src/main/java/fr/openmc/core/utils/ParticleUtils.java +++ b/src/main/java/fr/openmc/core/utils/ParticleUtils.java @@ -6,7 +6,10 @@ import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import fr.openmc.core.OMCPlugin; -import fr.openmc.core.features.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; import net.kyori.adventure.text.format.NamedTextColor; import net.minecraft.core.particles.DustParticleOptions; import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; @@ -54,7 +57,8 @@ public static void spawnParticlesInRegion(String regionId, World world, Particle new BukkitRunnable() { @Override public void run() { - if (ContestManager.data.getPhase() == 3) return; + if (!(WeeklyEventsManager.getCurrentEvent() instanceof Contest)) return; + if (WeeklyEventsManager.getCurrentPhase() == ContestPhase.END_PHASE.getPhase()) return; for (int i = 0; i < amountPer2Tick; i++) { double x = RandomUtils.randomBetween(minLocation.getX(), maxLocation.getX()); @@ -123,7 +127,8 @@ public static void spawnContestParticlesInRegion(String regionId, World world, i new BukkitRunnable() { @Override public void run() { - if (ContestManager.data.getPhase() != 3) return; + if (!(WeeklyEventsManager.getCurrentEvent() instanceof Contest)) return; + if (WeeklyEventsManager.getCurrentPhase() == ContestPhase.END_PHASE.getPhase()) return; if (color1 == null || color2 == null) { String camp1Color = ContestManager.data.getColor1(); diff --git a/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java b/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java index 4fdacadc6..cc76bc06d 100644 --- a/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java +++ b/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java @@ -12,12 +12,13 @@ import fr.openmc.core.features.city.sub.rank.CityRankManager; import fr.openmc.core.features.city.sub.statistics.CityStatisticsManager; import fr.openmc.core.features.city.sub.war.WarManager; -import fr.openmc.core.features.contest.managers.ContestManager; import fr.openmc.core.features.dream.DreamManager; import fr.openmc.core.features.economy.BankManager; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.features.economy.TransactionsManager; import fr.openmc.core.features.events.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; import fr.openmc.core.features.friend.FriendSQLManager; import fr.openmc.core.features.homes.HomesManager; import fr.openmc.core.features.mailboxes.MailboxManager; @@ -63,6 +64,7 @@ public static void init() { AnalyticsManager.initDB(connectionSource); MailboxManager.initDB(connectionSource); ContestManager.initDB(connectionSource); + WeeklyEventsManager.initDB(connectionSource); EconomyManager.initDB(connectionSource); HomesManager.initDB(connectionSource); FriendSQLManager.initDB(connectionSource); From ff3fd32698c180a6232a858bd5f9ebc0ab22fc37 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 22 Mar 2026 17:16:58 +0100 Subject: [PATCH 2/4] Rewrite contest schedule + gestion for multiple events --- src/main/java/fr/openmc/core/OMCPlugin.java | 2 +- .../city/sub/notation/NotationManager.java | 2 +- .../scoreboards/sb/MainScoreboard.java | 35 +-- .../weeklyevents/WeeklyEventsManager.java | 255 ++++++++++++++++++ .../contents/contest/Contest.java | 36 +++ .../contents/contest/ContestPhase.java | 125 +++++++++ .../contest/commands/ContestCommand.java | 106 ++++---- .../ColorContestAutoComplete.java | 4 +- .../ContestPhaseAutoComplete.java | 20 ++ .../TradeContestAutoComplete.java | 4 +- .../contest/events}/ContestEndEvent.java | 8 +- .../listeners/ContestIntractEvents.java | 2 +- .../contest/managers/ContestManager.java | 106 ++------ .../managers/ContestPlayerManager.java | 4 +- .../contest/managers/TradeYMLManager.java | 10 +- .../contest/menu/ContributionMenu.java | 6 +- .../contents}/contest/menu/MoreInfoMenu.java | 12 +- .../contents}/contest/menu/TradeMenu.java | 8 +- .../contents}/contest/menu/VoteMenu.java | 6 +- .../contents/contest/models/ContestData.java} | 25 +- .../contest/models/ContestPlayer.java | 2 +- .../weeklyevents/models/WeeklyEvent.java | 30 +++ .../weeklyevents/models/WeeklyEventPhase.java | 15 ++ .../weeklyevents/models/WeeklyEventsData.java | 33 +++ .../core/features/mainmenu/menus/Page1.java | 15 +- .../quests/quests/WinContestQuest.java | 2 +- .../java/fr/openmc/core/utils/DateUtils.java | 4 +- .../fr/openmc/core/utils/ParticleUtils.java | 11 +- .../core/utils/database/DatabaseManager.java | 4 +- 29 files changed, 675 insertions(+), 217 deletions(-) create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/Contest.java create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/ContestPhase.java rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/commands/ContestCommand.java (54%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/commands/autocomplete/ColorContestAutoComplete.java (73%) create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/commands/autocomplete/TradeContestAutoComplete.java (73%) rename src/main/java/fr/openmc/core/features/{contest => events/weeklyevents/contents/contest/events}/ContestEndEvent.java (83%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/listeners/ContestIntractEvents.java (89%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/managers/ContestManager.java (87%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/managers/ContestPlayerManager.java (97%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/managers/TradeYMLManager.java (96%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/menu/ContributionMenu.java (96%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/menu/MoreInfoMenu.java (86%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/menu/TradeMenu.java (96%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/menu/VoteMenu.java (97%) rename src/main/java/fr/openmc/core/features/{contest/models/Contest.java => events/weeklyevents/contents/contest/models/ContestData.java} (83%) rename src/main/java/fr/openmc/core/features/{ => events/weeklyevents/contents}/contest/models/ContestPlayer.java (93%) create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEvent.java create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventPhase.java create mode 100644 src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventsData.java diff --git a/src/main/java/fr/openmc/core/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java index 30d956fca..1a28e1e94 100644 --- a/src/main/java/fr/openmc/core/OMCPlugin.java +++ b/src/main/java/fr/openmc/core/OMCPlugin.java @@ -15,7 +15,6 @@ import fr.openmc.core.features.city.sub.notation.NotationManager; import fr.openmc.core.features.city.sub.statistics.CityStatisticsManager; import fr.openmc.core.features.city.sub.war.WarManager; -import fr.openmc.core.features.contest.managers.ContestManager; import fr.openmc.core.features.cube.multiblocks.MultiBlockManager; import fr.openmc.core.features.displays.TabList; import fr.openmc.core.features.displays.bossbar.BossbarManager; @@ -26,6 +25,7 @@ import fr.openmc.core.features.economy.BankManager; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.features.events.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; import fr.openmc.core.features.homes.HomesManager; import fr.openmc.core.features.homes.icons.HomeIconCacheManager; import fr.openmc.core.features.leaderboards.LeaderboardManager; diff --git a/src/main/java/fr/openmc/core/features/city/sub/notation/NotationManager.java b/src/main/java/fr/openmc/core/features/city/sub/notation/NotationManager.java index 5f9db1242..a4fff03a2 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/notation/NotationManager.java +++ b/src/main/java/fr/openmc/core/features/city/sub/notation/NotationManager.java @@ -338,7 +338,7 @@ public static void giveReward(String weekStr) { * Planifie l'exécution de la tâche de minuit qui calcule les scores et attribue les récompenses. */ private static void scheduleMidnightTask() { - long delayInTicks = DateUtils.getSecondsUntilDayOfWeekMidnight(APPLY_NOTATION_DAY) * 20; + long delayInTicks = DateUtils.getSecondsUntilDayOfWeekTime(APPLY_NOTATION_DAY, 0, 0, 0) * 20; Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> { if (!isApplied) { String weekStr = DateUtils.getWeekFormat(); diff --git a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java index 92d08fca7..68da27b08 100644 --- a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java +++ b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java @@ -9,11 +9,14 @@ import fr.openmc.api.scoreboard.SternalBoard; import fr.openmc.core.features.city.City; import fr.openmc.core.features.city.CityManager; -import fr.openmc.core.features.contest.managers.ContestManager; -import fr.openmc.core.features.contest.models.Contest; import fr.openmc.core.features.displays.scoreboards.BaseScoreboard; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.features.events.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; import fr.openmc.core.utils.DateUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -40,19 +43,21 @@ public void update(Player player, SternalBoard board) { List lines = new ArrayList<>(getDefaultLines(player)); // Contest - Contest data = ContestManager.data; - if (data.getPhase() != 1) { - lines.add(MiniMessage.miniMessage().deserialize("%s".formatted(textToSmall("contest"))).decoration(TextDecoration.BOLD, true)); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall(data.getCamp1()), data.getColor1AsNamedTextColor())) - .append(text(textToSmall(" VS "), NamedTextColor.GRAY)) - .append(text(textToSmall(data.getCamp2()), data.getColor2AsNamedTextColor())) - ); - lines.add(Component.text(" • ", NamedTextColor.DARK_GRAY) - .append(Component.text(textToSmall("fin:"), NamedTextColor.GRAY)) - .appendSpace() - .append(text(DateUtils.getTimeUntilNextDay(DayOfWeek.MONDAY), TextColor.color(0xFF8F06))) - ); + if (WeeklyEventsManager.getCurrentEvent() instanceof Contest) { + ContestData data = ContestManager.data; + if (WeeklyEventsManager.getCurrentPhase() != ContestPhase.VOTE_CAMP.getPhase()) { + lines.add(MiniMessage.miniMessage().deserialize("%s".formatted(textToSmall("contest"))).decoration(TextDecoration.BOLD, true)); + lines.add(text(" • ", NamedTextColor.DARK_GRAY) + .append(text(textToSmall(data.getCamp1()), data.getColor1AsNamedTextColor())) + .append(text(textToSmall(" VS "), NamedTextColor.GRAY)) + .append(text(textToSmall(data.getCamp2()), data.getColor2AsNamedTextColor())) + ); + lines.add(Component.text(" • ", NamedTextColor.DARK_GRAY) + .append(Component.text(textToSmall("fin:"), NamedTextColor.GRAY)) + .appendSpace() + .append(text(DateUtils.getTimeUntilNextDay(DayOfWeek.MONDAY), TextColor.color(0xFF8F06))) + ); + } } lines.add(empty()); diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java new file mode 100644 index 000000000..8c1a3f170 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java @@ -0,0 +1,255 @@ +package fr.openmc.core.features.events.weeklyevents; + +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.support.ConnectionSource; +import com.j256.ormlite.table.TableUtils; +import fr.openmc.core.OMCPlugin; +import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEvent; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventsData; +import fr.openmc.core.utils.DateUtils; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.bukkit.Bukkit; +import org.bukkit.scheduler.BukkitTask; + +import java.sql.SQLException; +import java.util.List; + +public class WeeklyEventsManager { + + private static final List EVENTS = List.of( + new Contest() + ); + + private static Dao dao; + private static WeeklyEventsData data; + private static BukkitTask currentTask = null; + + /** + * Initialise la gestion des WeeklyEvents. + * Au restart : si on est déjà le bon jour pour la phase courante et que l'event + * était actif, on relance l'action immédiatement. + */ + public static void initDB(ConnectionSource connectionSource) throws SQLException { + dao = DaoManager.createDao(connectionSource, WeeklyEventsData.class); + TableUtils.createTableIfNotExists(connectionSource, WeeklyEventsData.class); + + data = load(); + + WeeklyEventPhase currentPhase = getCurrentPhase(); + if (data.isActive() && currentPhase != null && DateUtils.getCurrentDayOfWeek().equals(currentPhase.getStartDay())) { + Runnable action = currentPhase.runAction(); + if (action != null) action.run(); + } + + scheduleNextPhase(); + } + + /** + * Charge les données depuis la BDD, ou crée une ligne par défaut si inexistante. + */ + public static WeeklyEventsData load() { + try { + WeeklyEventsData data = dao.queryForId(1); + if (data == null) { + data = new WeeklyEventsData(0, 0); + dao.create(data); + } + return data; + } catch (SQLException e) { + throw new RuntimeException("Erreur lors du chargement de WeeklyEventData", e); + } + } + + /** + * Sauvegarde les données en BDD. + */ + public static void save(WeeklyEventsData data) { + try { + dao.createOrUpdate(data); + } catch (SQLException e) { + throw new RuntimeException("Erreur lors de la sauvegarde de WeeklyEventData", e); + } + } + + /** + * Retourne l'event en cours. + */ + public static WeeklyEvent getCurrentEvent() { + return EVENTS.get(data.getCurrentEventIndex()); + } + + /** + * Retourne l'instance de WeeklyEvent correspondant à la classe donnée, ou null si introuvable. + */ + public static WeeklyEvent getEvent(Class eventClass) { + return EVENTS.stream() + .filter(event -> event.getClass().equals(eventClass)) + .findFirst() + .orElse(null); + } + + /** + * Retourne la phase en cours selon l'index en BDD, ou null si invalide. + */ + public static WeeklyEventPhase getCurrentPhase() { + List phases = getCurrentEvent().getPhases(); + int index = data.getCurrentPhaseIndex(); + if (index < 0 || index >= phases.size()) return null; + return phases.get(index); + } + + /** + * Retourne true si un event est actuellement actif (flag BDD). + * Source de vérité : le flag active, pas le temps. + */ + public static boolean isEventActive() { + return data.isActive(); + } + + /** + * Planifie la prochaine phase. + * Cancel la task précédente pour éviter les doublons. + * Guard intégré : si findNextPhase() a changé entre le schedule et l'exécution + * (suite à un force), on se recalibre sans exécuter la mauvaise action. + */ + public static void scheduleNextPhase() { + if (currentTask != null) { + currentTask.cancel(); + currentTask = null; + } + + WeeklyEventPhase nextPhase = findNextPhase(); + if (nextPhase == null) return; + + long delayTicks = DateUtils.getSecondsUntilDayOfWeekTime( + nextPhase.getStartDay(), + nextPhase.getStartHour(), + nextPhase.getStartMinutes(), + 0 + ) * 20L; + + if (delayTicks <= 0) { + runPhase(nextPhase); + return; + } + + currentTask = Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> { + if (findNextPhase() != nextPhase) { + scheduleNextPhase(); + return; + } + runPhase(nextPhase); + }, delayTicks); + } + + /** + * Exécute l'action de la phase, marque l'event comme actif, + * avance l'état, puis schedule la suivante. + */ + private static void runPhase(WeeklyEventPhase phase) { + data.setActive(true); + save(data); + + Runnable action = phase.runAction(); + if (action != null) action.run(); + + advancePhase(); + scheduleNextPhase(); + } + + /** + * Avance à la phase suivante. + * Si c'était la dernière phase, passe à l'event suivant (et marque inactif). + */ + private static void advancePhase() { + List phases = getCurrentEvent().getPhases(); + int nextPhaseIndex = data.getCurrentPhaseIndex() + 1; + + if (nextPhaseIndex >= phases.size()) { + advanceToNextEvent(); + } else { + data.setCurrentPhaseIndex(nextPhaseIndex); + save(data); + } + } + + /** + * Force un event à une phase spécifique. + * Met à jour la BDD, exécute l'action, gère le cas dernière phase, + * puis reschedule proprement. + */ + public static void forceEventAtPhase(WeeklyEvent event, WeeklyEventPhase phase) { + int eventIndex = EVENTS.indexOf(event); + int phaseIndex = event.getPhases().indexOf(phase); + + if (eventIndex == -1 || phaseIndex == -1) { + OMCPlugin.getInstance().getSLF4JLogger().error("[WeeklyEvents] Event ou phase non trouvé"); + return; + } + + data.setCurrentEventIndex(eventIndex); + data.setCurrentPhaseIndex(phaseIndex); + data.setActive(true); + save(data); + + Runnable action = phase.runAction(); + if (action != null) action.run(); + + boolean isLastPhase = phaseIndex == event.getPhases().size() - 1; + if (isLastPhase) { + advanceToNextEvent(); + } + + scheduleNextPhase(); + + OMCPlugin.getInstance().getSLF4JLogger().info("[WeeklyEvents] Event forcé : {} à la phase {}", + PlainTextComponentSerializer.plainText().serialize(event.getName()), + PlainTextComponentSerializer.plainText().serialize(phase.getName())); + } + + /** + * Passe à l'event suivant, réinitialise la phase à 0 et marque l'event comme inactif. + */ + private static void advanceToNextEvent() { + data.setActive(false); + int nextIndex = (data.getCurrentEventIndex() + 1) % EVENTS.size(); + data.setCurrentEventIndex(nextIndex); + data.setCurrentPhaseIndex(0); + save(data); + + OMCPlugin.getInstance().getSLF4JLogger().info("[WeeklyEvents] Passage à l'event suivant : {}", + PlainTextComponentSerializer.plainText().serialize(getCurrentEvent().getName())); + } + + /** + * Cherche la prochaine phase à venir en parcourant tous les events cycliquement. + * Commence à la phase courante de l'event courant, puis les events suivants depuis 0. + */ + private static WeeklyEventPhase findNextPhase() { + int totalEvents = EVENTS.size(); + + for (int i = 0; i < totalEvents; i++) { + int eventIdx = (data.getCurrentEventIndex() + i) % totalEvents; + WeeklyEvent event = EVENTS.get(eventIdx); + List phases = event.getPhases(); + + int phaseStart = (i == 0) ? data.getCurrentPhaseIndex() : 0; + + for (int j = phaseStart; j < phases.size(); j++) { + WeeklyEventPhase phase = phases.get(j); + long delay = DateUtils.getSecondsUntilDayOfWeekTime( + phase.getStartDay(), + phase.getStartHour(), + phase.getStartMinutes(), + 0 + ); + if (delay >= 0) return phase; + } + } + + return null; + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/Contest.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/Contest.java new file mode 100644 index 000000000..6d77e5d2f --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/Contest.java @@ -0,0 +1,36 @@ +package fr.openmc.core.features.events.weeklyevents.contents.contest; + +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEvent; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; +import fr.openmc.core.registry.items.CustomItemRegistry; +import net.kyori.adventure.text.Component; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; +import java.util.List; + +public class Contest extends WeeklyEvent { + @Override + public Component getName() { + return Component.text("Contest"); + } + + @Override + public List getDescription() { + return List.of( + Component.text("2 camps s'affrontent pendant le weekend"), + Component.text("Votez pour votre camp, et participez à l'affrontement !"), + Component.text("Le camp gagnant remportera des récompenses exclusives !") + ); + } + + @Override + public ItemStack getIcon() { + return CustomItemRegistry.getByName("omc_contest:contest_shell").getBest(); + } + + @Override + public List getPhases() { + return Arrays.stream(ContestPhase.values()).map(ContestPhase::getPhase).toList(); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/ContestPhase.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/ContestPhase.java new file mode 100644 index 000000000..8d90ea3d4 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/ContestPhase.java @@ -0,0 +1,125 @@ +package fr.openmc.core.features.events.weeklyevents.contents.contest; + +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; +import lombok.Getter; +import net.kyori.adventure.text.Component; + +import java.time.DayOfWeek; +import java.util.Arrays; +import java.util.List; + +@Getter +public enum ContestPhase { + VOTE_CAMP(new WeeklyEventPhase() { + @Override + public Component getName() { + return Component.text("Les votes"); + } + + @Override + public List getDescription() { + return Arrays.asList( + Component.text("§7Tout les vendredi, le contest commence"), + Component.text("§7Et les votes s'ouvrent, et il faut choisir"), + Component.text("§7Entre 2 camps, une ambience se crée dans le spawn...") + ); + } + + @Override + public DayOfWeek getStartDay() { + return DayOfWeek.FRIDAY; + } + + @Override + public int getStartHour() { + return 0; + } + + @Override + public int getStartMinutes() { + return 0; + } + + @Override + public Runnable runAction() { + return ContestManager::initPhase1; + } + }), + TRADE_PHASE(new WeeklyEventPhase() { + @Override + public Component getName() { + return Component.text("L'affrontement"); + } + + @Override + public List getDescription() { + return Arrays.asList( + Component.text("§7La nuit tombe sur le spawn pendant 2 jours"), + Component.text("§7Que la fête commence !"), + Component.text("§7Des trades sont disponible"), + Component.text("§7Donnant des coquillages de contest !")); + } + + @Override + public DayOfWeek getStartDay() { + return DayOfWeek.SATURDAY; + } + + @Override + public int getStartHour() { + return 0; + } + + @Override + public int getStartMinutes() { + return 0; + } + + @Override + public Runnable runAction() { + return ContestManager::initPhase2; + } + }), + END_PHASE(new WeeklyEventPhase() { + @Override + public Component getName() { + return Component.text("Les résultats"); + } + + @Override + public List getDescription() { + return Arrays.asList( + Component.text("§7Le levé de soleil sur le spawn !"), + Component.text("§7Les résultats tombent, et un camp"), + Component.text("§7sera gagnant. Et des récompenses seront attribuées"), + Component.text(("§7à chacun."))); + } + + @Override + public DayOfWeek getStartDay() { + return DayOfWeek.MONDAY; + } + + @Override + public int getStartHour() { + return 0; + } + + @Override + public int getStartMinutes() { + return 0; + } + + @Override + public Runnable runAction() { + return ContestManager::initPhase3; + } + }) + ; + + private final WeeklyEventPhase phase; + ContestPhase(WeeklyEventPhase phase) { + this.phase = phase; + } +} diff --git a/src/main/java/fr/openmc/core/features/contest/commands/ContestCommand.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/ContestCommand.java similarity index 54% rename from src/main/java/fr/openmc/core/features/contest/commands/ContestCommand.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/ContestCommand.java index 608af262f..6dd4f8ee5 100644 --- a/src/main/java/fr/openmc/core/features/contest/commands/ContestCommand.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/ContestCommand.java @@ -1,13 +1,18 @@ -package fr.openmc.core.features.contest.commands; +package fr.openmc.core.features.events.weeklyevents.contents.contest.commands; import fr.openmc.core.commands.autocomplete.OnlinePlayerAutoComplete; -import fr.openmc.core.features.contest.commands.autocomplete.ColorContestAutoComplete; -import fr.openmc.core.features.contest.commands.autocomplete.TradeContestAutoComplete; -import fr.openmc.core.features.contest.managers.ContestManager; -import fr.openmc.core.features.contest.managers.ContestPlayerManager; -import fr.openmc.core.features.contest.managers.TradeYMLManager; -import fr.openmc.core.features.contest.menu.ContributionMenu; -import fr.openmc.core.features.contest.menu.VoteMenu; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete.ColorContestAutoComplete; +import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete.ContestPhaseAutoComplete; +import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete.TradeContestAutoComplete; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestPlayerManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.TradeYMLManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.ContributionMenu; +import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.VoteMenu; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; import fr.openmc.core.utils.DateUtils; import fr.openmc.core.utils.messages.MessageType; import fr.openmc.core.utils.messages.MessagesManager; @@ -18,9 +23,10 @@ import revxrsal.commands.annotation.*; import revxrsal.commands.bukkit.annotation.CommandPermission; -import java.time.DayOfWeek; -import java.time.format.DateTimeFormatter; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Map; @Command("contest") @Description("Ouvre l'interface des festivals, et quand un festival commence, vous pouvez choisir votre camp") @@ -28,39 +34,33 @@ public class ContestCommand { @Cooldown(4) @CommandPlaceholder() public static void mainCommand(Player player) { - int phase = ContestManager.data.getPhase(); - if ((phase >= 2 && ContestManager.dataPlayer.get(player.getUniqueId()) == null) || (phase == 2)) { - VoteMenu menu = new VoteMenu(player); - menu.open(); - } else if (phase == 3 && ContestManager.dataPlayer.get(player.getUniqueId()) != null) { - ContributionMenu menu = new ContributionMenu(player); - menu.open(); + Contest contest = (Contest) WeeklyEventsManager.getEvent(Contest.class); - } else { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E", Locale.FRENCH); - DayOfWeek dayStartContestOfWeek = DayOfWeek.from(formatter.parse(ContestManager.data.getStartdate())); + if (!contest.isActive()) { + int days = (ContestPhase.VOTE_CAMP.getPhase().getStartDay().getValue() + - DateUtils.getCurrentDayOfWeek().getValue() + 7) % 7; + MessagesManager.sendMessage(player, Component.text("§cIl n'y a aucun Contest ! Revenez dans " + days + " jour(s)."), Prefix.CONTEST, MessageType.ERROR, true); + return; + } - int days = (dayStartContestOfWeek.getValue() - DateUtils.getCurrentDayOfWeek().getValue() + 7) % 7; + WeeklyEventPhase activePhase = contest.getActivePhase(); - MessagesManager.sendMessage(player, Component.text("§cIl n'y a aucun Contest ! Revenez dans " + days + " jour(s)."), Prefix.CONTEST, MessageType.ERROR, true); + if (activePhase == ContestPhase.VOTE_CAMP.getPhase()) { + new VoteMenu(player).open(); + } else if (activePhase == ContestPhase.TRADE_PHASE.getPhase()) { + if (ContestManager.dataPlayer.get(player.getUniqueId()) != null) { + new ContributionMenu(player).open(); + } else { + new VoteMenu(player).open(); + } } } @Subcommand("setphase") @Description("Permet de lancer une procédure de phase") @CommandPermission("omc.admin.commands.contest.setphase") - public void setPhase(@Named("phase") @Suggest({"1", "2", "3"}) Integer phase) { - switch(phase) { - case 2: - ContestManager.initPhase2(); - break; - case 3: - ContestManager.initPhase3(); - break; - default: - ContestManager.initPhase1(); - break; - } + public void setPhase(@Named("phase") @SuggestWith(ContestPhaseAutoComplete.class) String phase) { + WeeklyEventsManager.forceEventAtPhase(WeeklyEventsManager.getEvent(Contest.class), ContestPhase.valueOf(phase).getPhase()); } @Subcommand("setcontest") @@ -73,19 +73,25 @@ public void setContest( @Named("nom du camp 2") String camp2, @Named("couleur du camp 2") @SuggestWith(ColorContestAutoComplete.class) String color2 ) { - int phase = ContestManager.data.getPhase(); - if (phase == 1) { - // It is unique, but it is for performance reasons - if (new HashSet<>(ContestManager.getColorContestList()).containsAll(Arrays.asList(color1, color2))) { - ContestManager.clearDB(); - ContestManager.insertCustomContest(camp1, color1, camp2, color2); - - MessagesManager.sendMessage(player, Component.text("§aLe Contest : " + camp1 + " VS " + camp2 + " a bien été sauvegardé\nMerci d'attendre que les données en cache s'actualise."), Prefix.STAFF, MessageType.SUCCESS, true); - } else { - MessagesManager.sendMessage(player, Component.text("§c/contest setcontest et color doit comporter une couleur valide"), Prefix.STAFF, MessageType.ERROR, true); - } + Contest contest = (Contest) WeeklyEventsManager.getEvent(Contest.class); + + if (!contest.isActive()) { + MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas définir un contest lorsqu'il n'est pas actif"), Prefix.STAFF, MessageType.ERROR, true); + return; + } + + if (contest.getActivePhase() != ContestPhase.VOTE_CAMP.getPhase()) { + MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas définir un contest lorsqu'il a commencé"), Prefix.STAFF, MessageType.ERROR, true); + return; + } + + // It is unique, but it is for performance reasons + if (new HashSet<>(ContestManager.getColorContestList()).containsAll(Arrays.asList(color1, color2))) { + ContestManager.clearDB(); + ContestManager.insertCustomContest(camp1, color1, camp2, color2); + MessagesManager.sendMessage(player, Component.text("§aLe Contest : " + camp1 + " VS " + camp2 + " a bien été sauvegardé\nMerci d'attendre que les données en cache s'actualise."), Prefix.STAFF, MessageType.SUCCESS, true); } else { - MessagesManager.sendMessage(player, Component.text("§cVous pouvez pas définir un contest lorsqu'il a commencé"), Prefix.STAFF, MessageType.ERROR, true); + MessagesManager.sendMessage(player, Component.text("§c/contest setcontest et color doit comporter une couleur valide"), Prefix.STAFF, MessageType.ERROR, true); } } @@ -127,7 +133,9 @@ public void addPoints( @Named("membre") @SuggestWith(OnlinePlayerAutoComplete.class) Player target, @Named("points") Integer points ) { - if (ContestManager.data.getPhase()!=3) { + Contest contest = (Contest) WeeklyEventsManager.getEvent(Contest.class); + + if (contest.getActivePhase() != ContestPhase.TRADE_PHASE.getPhase()) { MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas donner des points lorsque le contest n'a pas commencé"), Prefix.STAFF, MessageType.ERROR, true); return; } @@ -137,7 +145,7 @@ public void addPoints( return; } - if (points<=0) { + if (points <= 0) { MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas donner des points négatifs ou égal à 0"), Prefix.STAFF, MessageType.ERROR, true); return; } diff --git a/src/main/java/fr/openmc/core/features/contest/commands/autocomplete/ColorContestAutoComplete.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java similarity index 73% rename from src/main/java/fr/openmc/core/features/contest/commands/autocomplete/ColorContestAutoComplete.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java index 8375b2f0c..f5e6bc354 100644 --- a/src/main/java/fr/openmc/core/features/contest/commands/autocomplete/ColorContestAutoComplete.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.contest.commands.autocomplete; +package fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete; -import fr.openmc.core.features.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; import org.jetbrains.annotations.NotNull; import revxrsal.commands.autocomplete.SuggestionProvider; import revxrsal.commands.bukkit.actor.BukkitCommandActor; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java new file mode 100644 index 000000000..930499273 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java @@ -0,0 +1,20 @@ +package fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete; + +import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.autocomplete.SuggestionProvider; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.node.ExecutionContext; + +import java.util.Arrays; +import java.util.List; + +public class ContestPhaseAutoComplete implements SuggestionProvider { + + @Override + public @NotNull List getSuggestions(@NotNull ExecutionContext context) { + return Arrays.stream(ContestPhase.values()) + .map(Enum::name) + .toList(); + } +} diff --git a/src/main/java/fr/openmc/core/features/contest/commands/autocomplete/TradeContestAutoComplete.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java similarity index 73% rename from src/main/java/fr/openmc/core/features/contest/commands/autocomplete/TradeContestAutoComplete.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java index d416fd1d8..8c952eedc 100644 --- a/src/main/java/fr/openmc/core/features/contest/commands/autocomplete/TradeContestAutoComplete.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.contest.commands.autocomplete; +package fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete; -import fr.openmc.core.features.contest.managers.TradeYMLManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.TradeYMLManager; import org.jetbrains.annotations.NotNull; import revxrsal.commands.autocomplete.SuggestionProvider; import revxrsal.commands.bukkit.actor.BukkitCommandActor; diff --git a/src/main/java/fr/openmc/core/features/contest/ContestEndEvent.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/events/ContestEndEvent.java similarity index 83% rename from src/main/java/fr/openmc/core/features/contest/ContestEndEvent.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/events/ContestEndEvent.java index c15a04e1b..9d49e216e 100644 --- a/src/main/java/fr/openmc/core/features/contest/ContestEndEvent.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/events/ContestEndEvent.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.contest; +package fr.openmc.core.features.events.weeklyevents.contents.contest.events; -import fr.openmc.core.features.contest.models.Contest; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; import lombok.Getter; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @@ -19,7 +19,7 @@ public class ContestEndEvent extends Event { /** * Les données associées au contest. */ - private final Contest contestData; + private final ContestData contestData; /** * Liste statique des handlers pour l'événement. @@ -43,7 +43,7 @@ public class ContestEndEvent extends Event { * @param winners La liste des gagnants * @param losers La liste des perdants */ - public ContestEndEvent(Contest contestData, List winners, List losers) { + public ContestEndEvent(ContestData contestData, List winners, List losers) { this.contestData = contestData; this.winners = winners; this.losers = losers; diff --git a/src/main/java/fr/openmc/core/features/contest/listeners/ContestIntractEvents.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/listeners/ContestIntractEvents.java similarity index 89% rename from src/main/java/fr/openmc/core/features/contest/listeners/ContestIntractEvents.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/listeners/ContestIntractEvents.java index 05e9e6c49..0e5665de3 100644 --- a/src/main/java/fr/openmc/core/features/contest/listeners/ContestIntractEvents.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/listeners/ContestIntractEvents.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.contest.listeners; +package fr.openmc.core.features.events.weeklyevents.contents.contest.listeners; import dev.lone.itemsadder.api.Events.FurnitureInteractEvent; import org.bukkit.Bukkit; diff --git a/src/main/java/fr/openmc/core/features/contest/managers/ContestManager.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestManager.java similarity index 87% rename from src/main/java/fr/openmc/core/features/contest/managers/ContestManager.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestManager.java index 3b5ae4cd8..0255e044d 100644 --- a/src/main/java/fr/openmc/core/features/contest/managers/ContestManager.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestManager.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.contest.managers; +package fr.openmc.core.features.events.weeklyevents.contents.contest.managers; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.DaoManager; @@ -8,21 +8,20 @@ import fr.openmc.api.menulib.Menu; import fr.openmc.core.CommandsManager; import fr.openmc.core.OMCPlugin; -import fr.openmc.core.features.contest.ContestEndEvent; -import fr.openmc.core.features.contest.commands.ContestCommand; -import fr.openmc.core.features.contest.listeners.ContestIntractEvents; -import fr.openmc.core.features.contest.menu.ContributionMenu; -import fr.openmc.core.features.contest.menu.MoreInfoMenu; -import fr.openmc.core.features.contest.menu.TradeMenu; -import fr.openmc.core.features.contest.menu.VoteMenu; -import fr.openmc.core.features.contest.models.Contest; -import fr.openmc.core.features.contest.models.ContestPlayer; import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.ContestCommand; +import fr.openmc.core.features.events.weeklyevents.contents.contest.events.ContestEndEvent; +import fr.openmc.core.features.events.weeklyevents.contents.contest.listeners.ContestIntractEvents; +import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.ContributionMenu; +import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.MoreInfoMenu; +import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.TradeMenu; +import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.VoteMenu; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestPlayer; import fr.openmc.core.features.leaderboards.LeaderboardManager; import fr.openmc.core.features.mailboxes.MailboxManager; import fr.openmc.core.registry.items.CustomItemRegistry; import fr.openmc.core.utils.ColorUtils; -import fr.openmc.core.utils.DateUtils; import fr.openmc.core.utils.ParticleUtils; import fr.openmc.core.utils.cache.CacheOfflinePlayer; import fr.openmc.core.utils.database.DatabaseManager; @@ -42,7 +41,6 @@ import java.sql.SQLException; import java.text.DecimalFormat; -import java.time.DayOfWeek; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -51,11 +49,7 @@ public class ContestManager { - private static final DayOfWeek START_CONTEST_DAY = DayOfWeek.FRIDAY; - private static final DayOfWeek START_TRADE_CONTEST_DAY = DayOfWeek.SATURDAY; - private static final DayOfWeek END_CONTEST_DAY = DayOfWeek.MONDAY; - - public static Contest data; + public static ContestData data; public static Map dataPlayer = new HashMap<>(); private static final List colorContest = Arrays.asList( @@ -94,19 +88,14 @@ public static void init() { ); // ** MANAGER EXTERNE ** - new TradeYMLManager(); + TradeYMLManager.init(); // ** LOAD DATAS ** initContestData(); loadContestPlayerData(); - - // ** SCHEDULE TASK ** - scheduleStartContest(); - scheduleStartTradeContest(); - scheduleEndContest(); } - private static Dao contestDao; + private static Dao contestDao; private static Dao playerDao; /** @@ -114,8 +103,8 @@ public static void init() { * (création des tables si elles n’existent pas encore) */ public static void initDB(ConnectionSource connectionSource) throws SQLException { - TableUtils.createTableIfNotExists(connectionSource, Contest.class); - contestDao = DaoManager.createDao(connectionSource, Contest.class); + TableUtils.createTableIfNotExists(connectionSource, ContestData.class); + contestDao = DaoManager.createDao(connectionSource, ContestData.class); TableUtils.createTableIfNotExists(connectionSource, ContestPlayer.class); playerDao = DaoManager.createDao(connectionSource, ContestPlayer.class); @@ -129,7 +118,7 @@ public static void initContestData() { try { data = contestDao.queryForFirst(); if (data == null) { - data = new Contest("Mayonnaise", "Ketchup", "YELLOW", "RED", 1, "ven.", 0, 0); + data = new ContestData("Mayonnaise", "Ketchup", "YELLOW", "RED", 0, 0); contestDao.create(data); } } catch (SQLException e) { @@ -180,7 +169,7 @@ public static void saveContestPlayerData() { */ public static void clearDB() { try { - TableUtils.clearTable(DatabaseManager.getConnectionSource(), Contest.class); + TableUtils.clearTable(DatabaseManager.getConnectionSource(), ContestData.class); TableUtils.clearTable(DatabaseManager.getConnectionSource(), ContestPlayer.class); } catch (SQLException e) { throw new RuntimeException(e); @@ -194,7 +183,6 @@ public static void clearDB() { * - Diffuse un message et joue un son aux joueurs connectés */ public static void initPhase1() { - data.setPhase(2); ParticleUtils.color1 = null; ParticleUtils.color2 = null; @@ -230,8 +218,6 @@ public static void initPhase2() { TradeYMLManager.updateColumnBooleanFromRandomTrades(true, (String) trade.get("ress")); } - data.setPhase(3); - Bukkit.broadcast(Component.text(""" §8§m §r §7 @@ -256,8 +242,6 @@ public static void initPhase2() { * - Réinitialise les données en DB pour le prochain contest */ public static void initPhase3() { - data.setPhase(4); - ParticleUtils.color1 = null; ParticleUtils.color2 = null; @@ -571,60 +555,6 @@ public static List getColorContestList() { * Insère un contest personnalisé dans la DB avec 2 camps et leurs couleurs. */ public static void insertCustomContest(String camp1, String color1, String camp2, String color2) { - data = new Contest(camp1, camp2, color1, color2, 1, "ven.", 0, 0); - } - - /** - * Programme le lancement de la phase 1 (votes) chaque vendredi à minuit. - */ - private static void scheduleStartContest() { - long delayInTicks = DateUtils.getSecondsUntilDayOfWeekMidnight(START_CONTEST_DAY) * 20; - - if (data.getPhase() == 1 && DateUtils.getCurrentDayOfWeek().equals(START_CONTEST_DAY)) { - ContestManager.initPhase1(); - } - - Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> { - if (data.getPhase() != 1) return; - - ContestManager.initPhase1(); - scheduleStartContest(); - }, delayInTicks); - } - - /** - * Programme le lancement de la phase 2 (contributions) chaque samedi à minuit. - */ - private static void scheduleStartTradeContest() { - long delayInTicks = DateUtils.getSecondsUntilDayOfWeekMidnight(START_TRADE_CONTEST_DAY) * 20; - - if (data.getPhase() == 2 && DateUtils.getCurrentDayOfWeek().equals(START_TRADE_CONTEST_DAY)) { - ContestManager.initPhase2(); - } - - Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> { - if (data.getPhase() != 2) return; - - ContestManager.initPhase2(); - scheduleStartTradeContest(); - }, delayInTicks); - } - - /** - * Programme la fin du contest (phase 3) chaque lundi à minuit. - */ - private static void scheduleEndContest() { - long delayInTicks = DateUtils.getSecondsUntilDayOfWeekMidnight(END_CONTEST_DAY) * 20; - - if (data.getPhase() == 3 && DateUtils.getCurrentDayOfWeek().equals(END_CONTEST_DAY)) { - ContestManager.initPhase3(); - } - - Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> { - if (data.getPhase() != 3) return; - - ContestManager.initPhase3(); - scheduleEndContest(); - }, delayInTicks); + data = new ContestData(camp1, camp2, color1, color2, 0, 0); } } diff --git a/src/main/java/fr/openmc/core/features/contest/managers/ContestPlayerManager.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestPlayerManager.java similarity index 97% rename from src/main/java/fr/openmc/core/features/contest/managers/ContestPlayerManager.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestPlayerManager.java index 3690b36dd..297aae673 100644 --- a/src/main/java/fr/openmc/core/features/contest/managers/ContestPlayerManager.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestPlayerManager.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.contest.managers; +package fr.openmc.core.features.events.weeklyevents.contents.contest.managers; -import fr.openmc.core.features.contest.models.ContestPlayer; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestPlayer; import lombok.Setter; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; diff --git a/src/main/java/fr/openmc/core/features/contest/managers/TradeYMLManager.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/TradeYMLManager.java similarity index 96% rename from src/main/java/fr/openmc/core/features/contest/managers/TradeYMLManager.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/TradeYMLManager.java index 725830124..2d0c9ccd8 100644 --- a/src/main/java/fr/openmc/core/features/contest/managers/TradeYMLManager.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/TradeYMLManager.java @@ -1,7 +1,7 @@ -package fr.openmc.core.features.contest.managers; +package fr.openmc.core.features.events.weeklyevents.contents.contest.managers; import fr.openmc.core.OMCPlugin; -import fr.openmc.core.features.contest.models.Contest; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; import fr.openmc.core.utils.YmlUtils; import lombok.Getter; import org.bukkit.configuration.file.FileConfiguration; @@ -33,7 +33,7 @@ public class TradeYMLManager { * Constructeur de TradeYMLManager. * Initialise le fichier contest.yml et charge sa configuration. */ - public TradeYMLManager() { + public static void init() { contestFile = new File(OMCPlugin.getInstance().getDataFolder() + "/data", "contest.yml"); loadContestConfig(); } @@ -197,13 +197,11 @@ public static void selectRandomlyContest() { Random random = new Random(); Map selectedContest = leastSelectedContests.get(random.nextInt(leastSelectedContests.size())); - ContestManager.data = new Contest( + ContestManager.data = new ContestData( (String) selectedContest.get("camp1"), (String) selectedContest.get("camp2"), (String) selectedContest.get("color1"), (String) selectedContest.get("color2"), - 1, - "ven.", 0, 0 ); diff --git a/src/main/java/fr/openmc/core/features/contest/menu/ContributionMenu.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/ContributionMenu.java similarity index 96% rename from src/main/java/fr/openmc/core/features/contest/menu/ContributionMenu.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/ContributionMenu.java index 2048a6d74..5d51aeb88 100644 --- a/src/main/java/fr/openmc/core/features/contest/menu/ContributionMenu.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/ContributionMenu.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.contest.menu; +package fr.openmc.core.features.events.weeklyevents.contents.contest.menu; import dev.lone.itemsadder.api.CustomStack; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; @@ -6,8 +6,8 @@ import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.contest.managers.ContestManager; -import fr.openmc.core.features.contest.managers.ContestPlayerManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestPlayerManager; import fr.openmc.core.registry.items.CustomItemRegistry; import fr.openmc.core.utils.ColorUtils; import fr.openmc.core.utils.ItemUtils; diff --git a/src/main/java/fr/openmc/core/features/contest/menu/MoreInfoMenu.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/MoreInfoMenu.java similarity index 86% rename from src/main/java/fr/openmc/core/features/contest/menu/MoreInfoMenu.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/MoreInfoMenu.java index e979d9d20..9f7512b7c 100644 --- a/src/main/java/fr/openmc/core/features/contest/menu/MoreInfoMenu.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/MoreInfoMenu.java @@ -1,10 +1,12 @@ -package fr.openmc.core.features.contest.menu; +package fr.openmc.core.features.events.weeklyevents.contents.contest.menu; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -68,10 +70,10 @@ public void onInventoryClick(InventoryClickEvent click) { ); - int phase = ContestManager.data.getPhase(); + WeeklyEventPhase phase = WeeklyEventsManager.getCurrentPhase(); - boolean ench0 = phase == 2; - boolean ench1 = phase == 3; + boolean ench0 = phase == ContestPhase.VOTE_CAMP.getPhase(); + boolean ench1 = phase == ContestPhase.TRADE_PHASE.getPhase(); inventory.put(11, new ItemBuilder(this, Material.BLUE_STAINED_GLASS_PANE, itemMeta -> { itemMeta.displayName(Component.text("§r§1Les votes - Vendredi")); diff --git a/src/main/java/fr/openmc/core/features/contest/menu/TradeMenu.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/TradeMenu.java similarity index 96% rename from src/main/java/fr/openmc/core/features/contest/menu/TradeMenu.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/TradeMenu.java index 812c11753..ef9864dea 100644 --- a/src/main/java/fr/openmc/core/features/contest/menu/TradeMenu.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/TradeMenu.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.contest.menu; +package fr.openmc.core.features.events.weeklyevents.contents.contest.menu; import dev.lone.itemsadder.api.CustomStack; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; @@ -6,9 +6,9 @@ import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.contest.managers.ContestManager; -import fr.openmc.core.features.contest.managers.ContestPlayerManager; -import fr.openmc.core.features.contest.managers.TradeYMLManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestPlayerManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.TradeYMLManager; import fr.openmc.core.features.mailboxes.MailboxManager; import fr.openmc.core.registry.items.CustomItemRegistry; import fr.openmc.core.utils.ItemUtils; diff --git a/src/main/java/fr/openmc/core/features/contest/menu/VoteMenu.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/VoteMenu.java similarity index 97% rename from src/main/java/fr/openmc/core/features/contest/menu/VoteMenu.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/VoteMenu.java index c1c580989..974162757 100644 --- a/src/main/java/fr/openmc/core/features/contest/menu/VoteMenu.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/VoteMenu.java @@ -1,12 +1,12 @@ -package fr.openmc.core.features.contest.menu; +package fr.openmc.core.features.events.weeklyevents.contents.contest.menu; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.template.ConfirmMenu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.contest.managers.ContestManager; -import fr.openmc.core.features.contest.models.ContestPlayer; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestPlayer; import fr.openmc.core.utils.ColorUtils; import fr.openmc.core.utils.messages.MessageType; import fr.openmc.core.utils.messages.MessagesManager; diff --git a/src/main/java/fr/openmc/core/features/contest/models/Contest.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestData.java similarity index 83% rename from src/main/java/fr/openmc/core/features/contest/models/Contest.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestData.java index 43fd7b0c7..52e0b21d6 100644 --- a/src/main/java/fr/openmc/core/features/contest/models/Contest.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestData.java @@ -1,18 +1,17 @@ -package fr.openmc.core.features.contest.models; - -import lombok.Getter; -import lombok.Setter; - -import java.util.Objects; +package fr.openmc.core.features.events.weeklyevents.contents.contest.models; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; +import lombok.Getter; +import lombok.Setter; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import java.util.Objects; + @Getter @DatabaseTable(tableName = "contests") -public class Contest { +public class ContestData { @DatabaseField(id = true) private int id; // required for Dao.update function @@ -26,29 +25,21 @@ public class Contest { private String color2; @Setter @DatabaseField(canBeNull = false) - private int phase; - @DatabaseField(canBeNull = false) - private String startdate; - @Setter - @DatabaseField(canBeNull = false) private int points1; @Setter @DatabaseField(canBeNull = false) private int points2; - Contest() { + ContestData() { // required for ORMLite } - public Contest(String camp1, String camp2, String color1, String color2, int phase, String startdate, int points1, - int points2) { + public ContestData(String camp1, String camp2, String color1, String color2, int points1, int points2) { this.id = 1; // we will only be storing one row, so we need a constant id this.camp1 = camp1; this.camp2 = camp2; this.color1 = color1; this.color2 = color2; - this.phase = phase; - this.startdate = startdate; this.points1 = points1; this.points2 = points2; } diff --git a/src/main/java/fr/openmc/core/features/contest/models/ContestPlayer.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestPlayer.java similarity index 93% rename from src/main/java/fr/openmc/core/features/contest/models/ContestPlayer.java rename to src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestPlayer.java index 87649a3ce..1c8500827 100644 --- a/src/main/java/fr/openmc/core/features/contest/models/ContestPlayer.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestPlayer.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.contest.models; +package fr.openmc.core.features.events.weeklyevents.contents.contest.models; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEvent.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEvent.java new file mode 100644 index 000000000..d81ba171e --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEvent.java @@ -0,0 +1,30 @@ +package fr.openmc.core.features.events.weeklyevents.models; + +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import net.kyori.adventure.text.Component; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public abstract class WeeklyEvent { + public abstract Component getName(); + public abstract List getDescription(); + public abstract ItemStack getIcon(); + public abstract List getPhases(); + + /** + * Retourne true si on est temporellement dans une phase active de cet event. + */ + public boolean isActive() { + return WeeklyEventsManager.getCurrentEvent() == this + && WeeklyEventsManager.isEventActive(); + } + + /** + * Retourne la phase active de cet event, ou null si l'event n'est pas actif. + */ + public WeeklyEventPhase getActivePhase() { + if (!isActive()) return null; + return WeeklyEventsManager.getCurrentPhase(); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventPhase.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventPhase.java new file mode 100644 index 000000000..2df8d2fd6 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventPhase.java @@ -0,0 +1,15 @@ +package fr.openmc.core.features.events.weeklyevents.models; + +import net.kyori.adventure.text.Component; + +import java.time.DayOfWeek; +import java.util.List; + +public abstract class WeeklyEventPhase { + public abstract Component getName(); + public abstract List getDescription(); + public abstract DayOfWeek getStartDay(); + public abstract int getStartHour(); + public abstract int getStartMinutes(); + public abstract Runnable runAction(); +} diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventsData.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventsData.java new file mode 100644 index 000000000..135d02a21 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventsData.java @@ -0,0 +1,33 @@ +package fr.openmc.core.features.events.weeklyevents.models; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import lombok.Getter; +import lombok.Setter; + +@Getter +@DatabaseTable(tableName = "weekly_event_data") +public class WeeklyEventsData { + + @DatabaseField(id = true, columnName = "id") + private int id = 1; + + @Setter + @DatabaseField(columnName = "current_event_index") + private int currentEventIndex; + + @Setter + @DatabaseField(columnName = "current_phase_index") + private int currentPhaseIndex; + + @Setter + @DatabaseField(columnName = "is_active") + private boolean active; + + public WeeklyEventsData() {} + + public WeeklyEventsData(int currentEventIndex, int currentPhaseIndex) { + this.currentEventIndex = currentEventIndex; + this.currentPhaseIndex = currentPhaseIndex; + } +} diff --git a/src/main/java/fr/openmc/core/features/mainmenu/menus/Page1.java b/src/main/java/fr/openmc/core/features/mainmenu/menus/Page1.java index d81ce2858..024f6e2b9 100644 --- a/src/main/java/fr/openmc/core/features/mainmenu/menus/Page1.java +++ b/src/main/java/fr/openmc/core/features/mainmenu/menus/Page1.java @@ -13,10 +13,13 @@ import fr.openmc.core.features.city.City; import fr.openmc.core.features.city.CityManager; import fr.openmc.core.features.city.commands.CityCommands; -import fr.openmc.core.features.contest.commands.ContestCommand; -import fr.openmc.core.features.contest.managers.ContestManager; -import fr.openmc.core.features.contest.models.Contest; import fr.openmc.core.features.dream.DreamUtils; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.ContestCommand; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; import fr.openmc.core.features.homes.command.TpHomeCommand; import fr.openmc.core.features.mailboxes.MailboxCommand; import fr.openmc.core.features.mainmenu.listeners.PacketListener; @@ -107,9 +110,9 @@ public Page1(Player player) { MILESTONES_SLOTS.forEach(slot -> content.put(slot, milestonesItem)); ItemStack contestItem = new ItemStack(Material.PAPER); - Contest data = ContestManager.data; - int phase = data.getPhase(); - if (phase != 1) { + ContestData data = ContestManager.data; + + if (WeeklyEventsManager.getCurrentEvent() instanceof Contest && WeeklyEventsManager.getCurrentPhase() != ContestPhase.END_PHASE.getPhase()) { contestItem.editMeta(meta -> { meta.setItemModel(NamespacedKey.minecraft("air")); meta.itemName(data.getCampVSComponent()); diff --git a/src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java b/src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java index 484b5af98..1ee79ee53 100644 --- a/src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java +++ b/src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java @@ -1,6 +1,6 @@ package fr.openmc.core.features.quests.quests; -import fr.openmc.core.features.contest.ContestEndEvent; +import fr.openmc.core.features.events.weeklyevents.contents.contest.events.ContestEndEvent; import fr.openmc.core.features.quests.objects.Quest; import fr.openmc.core.features.quests.objects.QuestTier; import fr.openmc.core.features.quests.rewards.QuestItemReward; diff --git a/src/main/java/fr/openmc/core/utils/DateUtils.java b/src/main/java/fr/openmc/core/utils/DateUtils.java index 608245495..3fd482348 100644 --- a/src/main/java/fr/openmc/core/utils/DateUtils.java +++ b/src/main/java/fr/openmc/core/utils/DateUtils.java @@ -173,10 +173,10 @@ public static String getTimeUntilNextDay(DayOfWeek day) { return String.format("%dd %dh %dm", days, hours, minutes); } - public static long getSecondsUntilDayOfWeekMidnight(DayOfWeek dayOfWeek) { + public static long getSecondsUntilDayOfWeekTime(DayOfWeek dayOfWeek, int hour, int minute, int second) { LocalDateTime now = LocalDateTime.now(); LocalDateTime nextDayOfWeekMidnight = now.with(TemporalAdjusters.nextOrSame(dayOfWeek)) - .withHour(0).withMinute(0).withSecond(0).withNano(0); + .withHour(hour).withMinute(minute).withSecond(second).withNano(0); if (!now.isBefore(nextDayOfWeekMidnight)) { nextDayOfWeekMidnight = nextDayOfWeekMidnight.plusWeeks(1); diff --git a/src/main/java/fr/openmc/core/utils/ParticleUtils.java b/src/main/java/fr/openmc/core/utils/ParticleUtils.java index c9bd808e8..c43b92be4 100644 --- a/src/main/java/fr/openmc/core/utils/ParticleUtils.java +++ b/src/main/java/fr/openmc/core/utils/ParticleUtils.java @@ -6,7 +6,10 @@ import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import fr.openmc.core.OMCPlugin; -import fr.openmc.core.features.contest.managers.ContestManager; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; import net.kyori.adventure.text.format.NamedTextColor; import net.minecraft.core.particles.DustParticleOptions; import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; @@ -54,7 +57,8 @@ public static void spawnParticlesInRegion(String regionId, World world, Particle new BukkitRunnable() { @Override public void run() { - if (ContestManager.data.getPhase() == 3) return; + if (!(WeeklyEventsManager.getCurrentEvent() instanceof Contest)) return; + if (WeeklyEventsManager.getCurrentPhase() == ContestPhase.END_PHASE.getPhase()) return; for (int i = 0; i < amountPer2Tick; i++) { double x = RandomUtils.randomBetween(minLocation.getX(), maxLocation.getX()); @@ -123,7 +127,8 @@ public static void spawnContestParticlesInRegion(String regionId, World world, i new BukkitRunnable() { @Override public void run() { - if (ContestManager.data.getPhase() != 3) return; + if (!(WeeklyEventsManager.getCurrentEvent() instanceof Contest)) return; + if (WeeklyEventsManager.getCurrentPhase() == ContestPhase.END_PHASE.getPhase()) return; if (color1 == null || color2 == null) { String camp1Color = ContestManager.data.getColor1(); diff --git a/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java b/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java index 4fdacadc6..cc76bc06d 100644 --- a/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java +++ b/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java @@ -12,12 +12,13 @@ import fr.openmc.core.features.city.sub.rank.CityRankManager; import fr.openmc.core.features.city.sub.statistics.CityStatisticsManager; import fr.openmc.core.features.city.sub.war.WarManager; -import fr.openmc.core.features.contest.managers.ContestManager; import fr.openmc.core.features.dream.DreamManager; import fr.openmc.core.features.economy.BankManager; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.features.economy.TransactionsManager; import fr.openmc.core.features.events.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; import fr.openmc.core.features.friend.FriendSQLManager; import fr.openmc.core.features.homes.HomesManager; import fr.openmc.core.features.mailboxes.MailboxManager; @@ -63,6 +64,7 @@ public static void init() { AnalyticsManager.initDB(connectionSource); MailboxManager.initDB(connectionSource); ContestManager.initDB(connectionSource); + WeeklyEventsManager.initDB(connectionSource); EconomyManager.initDB(connectionSource); HomesManager.initDB(connectionSource); FriendSQLManager.initDB(connectionSource); From 1c6f1b7b5f82c8ac3823c3dc687a96ccf1579036 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Tue, 24 Mar 2026 14:47:03 +0100 Subject: [PATCH 3/4] fix init --- src/main/java/fr/openmc/core/OMCPlugin.java | 2 ++ .../events/weeklyevents/WeeklyEventsManager.java | 13 +++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/openmc/core/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java index 1a28e1e94..f897a8965 100644 --- a/src/main/java/fr/openmc/core/OMCPlugin.java +++ b/src/main/java/fr/openmc/core/OMCPlugin.java @@ -25,6 +25,7 @@ import fr.openmc.core.features.economy.BankManager; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.features.events.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; import fr.openmc.core.features.homes.HomesManager; import fr.openmc.core.features.homes.icons.HomeIconCacheManager; @@ -161,6 +162,7 @@ public void loadWithItemsAdder() { QuestsManager.init(); CityManager.init(); ContestManager.init(); + WeeklyEventsManager.init(); DreamManager.init(); MultiBlockManager.init(); if (WorldGuardHook.isHasWorldGuard()) { diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java b/src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java index 8c1a3f170..80b1ba9fd 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java +++ b/src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java @@ -32,10 +32,7 @@ public class WeeklyEventsManager { * Au restart : si on est déjà le bon jour pour la phase courante et que l'event * était actif, on relance l'action immédiatement. */ - public static void initDB(ConnectionSource connectionSource) throws SQLException { - dao = DaoManager.createDao(connectionSource, WeeklyEventsData.class); - TableUtils.createTableIfNotExists(connectionSource, WeeklyEventsData.class); - + public static void init() { data = load(); WeeklyEventPhase currentPhase = getCurrentPhase(); @@ -47,6 +44,14 @@ public static void initDB(ConnectionSource connectionSource) throws SQLException scheduleNextPhase(); } + /** + * Initialise la BDD : crée la table si nécessaire, charge les données, gère le cas restart + */ + public static void initDB(ConnectionSource connectionSource) throws SQLException { + dao = DaoManager.createDao(connectionSource, WeeklyEventsData.class); + TableUtils.createTableIfNotExists(connectionSource, WeeklyEventsData.class); + } + /** * Charge les données depuis la BDD, ou crée une ligne par défaut si inexistante. */ From 2935bf9f8f80cf4eccc58a6653a74e18b66b3265 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Tue, 24 Mar 2026 17:48:55 +0100 Subject: [PATCH 4/4] add CalendarMenu and /events --- .../java/fr/openmc/core/CommandsManager.java | 6 +- src/main/java/fr/openmc/core/OMCPlugin.java | 6 +- .../scoreboards/sb/MainScoreboard.java | 12 +- .../events/commands/EventCommand.java | 18 +++ .../halloween/commands/HalloweenCommands.java | 4 +- .../listeners/HalloweenNPCListener.java | 4 +- .../halloween/managers/HalloweenManager.java | 6 +- .../menus/HalloweenPumpkinDepositMenu.java | 4 +- .../halloween/models/HalloweenData.java | 2 +- .../weeklyevents/WeeklyEventsManager.java | 10 +- .../contents/contest/Contest.java | 16 ++- .../contents/contest/ContestPhase.java | 6 +- .../contest/commands/ContestCommand.java | 26 ++-- .../ColorContestAutoComplete.java | 4 +- .../ContestPhaseAutoComplete.java | 4 +- .../TradeContestAutoComplete.java | 4 +- .../contest/events/ContestEndEvent.java | 4 +- .../listeners/ContestIntractEvents.java | 2 +- .../contest/managers/ContestManager.java | 20 +-- .../managers/ContestPlayerManager.java | 4 +- .../contest/managers/TradeYMLManager.java | 4 +- .../contest/menu/ContributionMenu.java | 6 +- .../contents/contest/menu/MoreInfoMenu.java | 8 +- .../contents/contest/menu/TradeMenu.java | 8 +- .../contents/contest/menu/VoteMenu.java | 6 +- .../contents/contest/models/ContestData.java | 2 +- .../contest/models/ContestPlayer.java | 2 +- .../weeklyevents/models/WeeklyEvent.java | 21 +-- .../weeklyevents/models/WeeklyEventPhase.java | 2 +- .../weeklyevents/models/WeeklyEventsData.java | 2 +- .../events/managers/CalendarManager.java | 92 +++++++++++++ .../features/events/menus/CalendarMenu.java | 130 ++++++++++++++++++ .../core/features/events/models/Event.java | 13 ++ .../leaderboards/LeaderboardManager.java | 4 +- .../core/features/mainmenu/menus/Page1.java | 12 +- .../quests/quests/WinContestQuest.java | 2 +- .../fr/openmc/core/utils/ParticleUtils.java | 8 +- .../core/utils/database/DatabaseManager.java | 6 +- 38 files changed, 376 insertions(+), 114 deletions(-) create mode 100644 src/main/java/fr/openmc/core/features/events/commands/EventCommand.java rename src/main/java/fr/openmc/core/features/events/{ => contents}/halloween/commands/HalloweenCommands.java (70%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/halloween/listeners/HalloweenNPCListener.java (80%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/halloween/managers/HalloweenManager.java (97%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/halloween/menus/HalloweenPumpkinDepositMenu.java (96%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/halloween/models/HalloweenData.java (90%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/WeeklyEventsManager.java (95%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/Contest.java (60%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/ContestPhase.java (92%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/commands/ContestCommand.java (84%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java (71%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java (75%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java (71%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/events/ContestEndEvent.java (90%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/listeners/ContestIntractEvents.java (88%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/managers/ContestManager.java (96%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/managers/ContestPlayerManager.java (97%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/managers/TradeYMLManager.java (97%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/menu/ContributionMenu.java (96%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/menu/MoreInfoMenu.java (91%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/menu/TradeMenu.java (96%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/menu/VoteMenu.java (97%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/models/ContestData.java (96%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/contents/contest/models/ContestPlayer.java (92%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/models/WeeklyEvent.java (52%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/models/WeeklyEventPhase.java (85%) rename src/main/java/fr/openmc/core/features/events/{ => contents}/weeklyevents/models/WeeklyEventsData.java (92%) create mode 100644 src/main/java/fr/openmc/core/features/events/managers/CalendarManager.java create mode 100644 src/main/java/fr/openmc/core/features/events/menus/CalendarMenu.java create mode 100644 src/main/java/fr/openmc/core/features/events/models/Event.java diff --git a/src/main/java/fr/openmc/core/CommandsManager.java b/src/main/java/fr/openmc/core/CommandsManager.java index b37c8dc49..3af0c9e03 100644 --- a/src/main/java/fr/openmc/core/CommandsManager.java +++ b/src/main/java/fr/openmc/core/CommandsManager.java @@ -11,7 +11,8 @@ import fr.openmc.core.features.animations.DebugAnimationCommand; import fr.openmc.core.features.credits.CreditsCommand; import fr.openmc.core.features.cube.CubeCommands; -import fr.openmc.core.features.events.halloween.commands.HalloweenCommands; +import fr.openmc.core.features.events.commands.EventCommand; +import fr.openmc.core.features.events.contents.halloween.commands.HalloweenCommands; import fr.openmc.core.features.friend.FriendCommand; import fr.openmc.core.features.mailboxes.MailboxCommand; import fr.openmc.core.features.mainmenu.commands.MainMenuCommand; @@ -61,7 +62,8 @@ private static void registerCommands() { new CreditsCommand(), new CubeCommands(), new HalloweenCommands(), - new DebugAnimationCommand() + new DebugAnimationCommand(), + new EventCommand() ); } } diff --git a/src/main/java/fr/openmc/core/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java index f897a8965..c731d53a4 100644 --- a/src/main/java/fr/openmc/core/OMCPlugin.java +++ b/src/main/java/fr/openmc/core/OMCPlugin.java @@ -24,9 +24,9 @@ import fr.openmc.core.features.dream.generation.DreamDimensionManager; import fr.openmc.core.features.economy.BankManager; import fr.openmc.core.features.economy.EconomyManager; -import fr.openmc.core.features.events.halloween.managers.HalloweenManager; -import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.contents.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager; import fr.openmc.core.features.homes.HomesManager; import fr.openmc.core.features.homes.icons.HomeIconCacheManager; import fr.openmc.core.features.leaderboards.LeaderboardManager; diff --git a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java index 68da27b08..81e835944 100644 --- a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java +++ b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java @@ -11,12 +11,12 @@ import fr.openmc.core.features.city.CityManager; import fr.openmc.core.features.displays.scoreboards.BaseScoreboard; import fr.openmc.core.features.economy.EconomyManager; -import fr.openmc.core.features.events.halloween.managers.HalloweenManager; -import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; -import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; +import fr.openmc.core.features.events.contents.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.models.ContestData; import fr.openmc.core.utils.DateUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/src/main/java/fr/openmc/core/features/events/commands/EventCommand.java b/src/main/java/fr/openmc/core/features/events/commands/EventCommand.java new file mode 100644 index 000000000..2248a2155 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/commands/EventCommand.java @@ -0,0 +1,18 @@ +package fr.openmc.core.features.events.commands; + +import fr.openmc.core.features.events.menus.CalendarMenu; +import org.bukkit.entity.Player; +import revxrsal.commands.annotation.Command; +import revxrsal.commands.annotation.CommandPlaceholder; +import revxrsal.commands.annotation.Cooldown; +import revxrsal.commands.annotation.Description; + +@Command("events") +@Description("Ouvre l'interface des événement (journalier et weekly") +public class EventCommand { + @Cooldown(2) + @CommandPlaceholder() + public static void mainCommand(Player player) { + new CalendarMenu(player).open(); + } +} diff --git a/src/main/java/fr/openmc/core/features/events/halloween/commands/HalloweenCommands.java b/src/main/java/fr/openmc/core/features/events/contents/halloween/commands/HalloweenCommands.java similarity index 70% rename from src/main/java/fr/openmc/core/features/events/halloween/commands/HalloweenCommands.java rename to src/main/java/fr/openmc/core/features/events/contents/halloween/commands/HalloweenCommands.java index 549b56a71..11bde75c0 100644 --- a/src/main/java/fr/openmc/core/features/events/halloween/commands/HalloweenCommands.java +++ b/src/main/java/fr/openmc/core/features/events/contents/halloween/commands/HalloweenCommands.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.events.halloween.commands; +package fr.openmc.core.features.events.contents.halloween.commands; -import fr.openmc.core.features.events.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.contents.halloween.managers.HalloweenManager; import revxrsal.commands.annotation.Command; import revxrsal.commands.annotation.Subcommand; import revxrsal.commands.bukkit.annotation.CommandPermission; diff --git a/src/main/java/fr/openmc/core/features/events/halloween/listeners/HalloweenNPCListener.java b/src/main/java/fr/openmc/core/features/events/contents/halloween/listeners/HalloweenNPCListener.java similarity index 80% rename from src/main/java/fr/openmc/core/features/events/halloween/listeners/HalloweenNPCListener.java rename to src/main/java/fr/openmc/core/features/events/contents/halloween/listeners/HalloweenNPCListener.java index 9c5943936..f5a7c3c83 100644 --- a/src/main/java/fr/openmc/core/features/events/halloween/listeners/HalloweenNPCListener.java +++ b/src/main/java/fr/openmc/core/features/events/contents/halloween/listeners/HalloweenNPCListener.java @@ -1,7 +1,7 @@ -package fr.openmc.core.features.events.halloween.listeners; +package fr.openmc.core.features.events.contents.halloween.listeners; import de.oliver.fancynpcs.api.events.NpcInteractEvent; -import fr.openmc.core.features.events.halloween.menus.HalloweenPumpkinDepositMenu; +import fr.openmc.core.features.events.contents.halloween.menus.HalloweenPumpkinDepositMenu; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; diff --git a/src/main/java/fr/openmc/core/features/events/halloween/managers/HalloweenManager.java b/src/main/java/fr/openmc/core/features/events/contents/halloween/managers/HalloweenManager.java similarity index 97% rename from src/main/java/fr/openmc/core/features/events/halloween/managers/HalloweenManager.java rename to src/main/java/fr/openmc/core/features/events/contents/halloween/managers/HalloweenManager.java index bfbf96700..f845ebf68 100644 --- a/src/main/java/fr/openmc/core/features/events/halloween/managers/HalloweenManager.java +++ b/src/main/java/fr/openmc/core/features/events/contents/halloween/managers/HalloweenManager.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.events.halloween.managers; +package fr.openmc.core.features.events.contents.halloween.managers; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.DaoManager; @@ -10,8 +10,8 @@ import fr.openmc.api.hooks.FancyNpcsHook; import fr.openmc.core.OMCPlugin; import fr.openmc.core.features.economy.EconomyManager; -import fr.openmc.core.features.events.halloween.listeners.HalloweenNPCListener; -import fr.openmc.core.features.events.halloween.models.HalloweenData; +import fr.openmc.core.features.events.contents.halloween.listeners.HalloweenNPCListener; +import fr.openmc.core.features.events.contents.halloween.models.HalloweenData; import fr.openmc.core.features.leaderboards.LeaderboardManager; import fr.openmc.core.features.mailboxes.MailboxManager; import fr.openmc.core.registry.items.CustomItemRegistry; diff --git a/src/main/java/fr/openmc/core/features/events/halloween/menus/HalloweenPumpkinDepositMenu.java b/src/main/java/fr/openmc/core/features/events/contents/halloween/menus/HalloweenPumpkinDepositMenu.java similarity index 96% rename from src/main/java/fr/openmc/core/features/events/halloween/menus/HalloweenPumpkinDepositMenu.java rename to src/main/java/fr/openmc/core/features/events/contents/halloween/menus/HalloweenPumpkinDepositMenu.java index d2c0142a1..6b25b72c1 100644 --- a/src/main/java/fr/openmc/core/features/events/halloween/menus/HalloweenPumpkinDepositMenu.java +++ b/src/main/java/fr/openmc/core/features/events/contents/halloween/menus/HalloweenPumpkinDepositMenu.java @@ -1,9 +1,9 @@ -package fr.openmc.core.features.events.halloween.menus; +package fr.openmc.core.features.events.contents.halloween.menus; import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.events.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.contents.halloween.managers.HalloweenManager; import fr.openmc.core.utils.ItemUtils; import fr.openmc.core.utils.messages.MessageType; import fr.openmc.core.utils.messages.MessagesManager; diff --git a/src/main/java/fr/openmc/core/features/events/halloween/models/HalloweenData.java b/src/main/java/fr/openmc/core/features/events/contents/halloween/models/HalloweenData.java similarity index 90% rename from src/main/java/fr/openmc/core/features/events/halloween/models/HalloweenData.java rename to src/main/java/fr/openmc/core/features/events/contents/halloween/models/HalloweenData.java index 038ad60a5..ffc4cac6e 100644 --- a/src/main/java/fr/openmc/core/features/events/halloween/models/HalloweenData.java +++ b/src/main/java/fr/openmc/core/features/events/contents/halloween/models/HalloweenData.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.events.halloween.models; +package fr.openmc.core.features.events.contents.halloween.models; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/WeeklyEventsManager.java similarity index 95% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/WeeklyEventsManager.java index 80b1ba9fd..7441bd546 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/WeeklyEventsManager.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/WeeklyEventsManager.java @@ -1,14 +1,14 @@ -package fr.openmc.core.features.events.weeklyevents; +package fr.openmc.core.features.events.contents.weeklyevents; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.DaoManager; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils; import fr.openmc.core.OMCPlugin; -import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; -import fr.openmc.core.features.events.weeklyevents.models.WeeklyEvent; -import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; -import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventsData; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEvent; +import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEventPhase; +import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEventsData; import fr.openmc.core.utils.DateUtils; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.Bukkit; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/Contest.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/Contest.java similarity index 60% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/Contest.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/Contest.java index 6d77e5d2f..f7db60aa1 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/Contest.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/Contest.java @@ -1,9 +1,11 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest; -import fr.openmc.core.features.events.weeklyevents.models.WeeklyEvent; -import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; +import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEvent; +import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEventPhase; import fr.openmc.core.registry.items.CustomItemRegistry; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.inventory.ItemStack; import java.util.Arrays; @@ -12,15 +14,15 @@ public class Contest extends WeeklyEvent { @Override public Component getName() { - return Component.text("Contest"); + return Component.text("Contest", NamedTextColor.GOLD, TextDecoration.BOLD); } @Override public List getDescription() { return List.of( - Component.text("2 camps s'affrontent pendant le weekend"), - Component.text("Votez pour votre camp, et participez à l'affrontement !"), - Component.text("Le camp gagnant remportera des récompenses exclusives !") + Component.text("2 camps s'affrontent pendant le weekend", NamedTextColor.GRAY), + Component.text("Votez pour votre camp, et participez à l'affrontement !", NamedTextColor.GRAY), + Component.text("Le camp gagnant remportera des récompenses exclusives !", NamedTextColor.GRAY) ); } diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/ContestPhase.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/ContestPhase.java similarity index 92% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/ContestPhase.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/ContestPhase.java index 8d90ea3d4..8dbdc77f1 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/ContestPhase.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/ContestPhase.java @@ -1,7 +1,7 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; -import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEventPhase; import lombok.Getter; import net.kyori.adventure.text.Component; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/ContestCommand.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/commands/ContestCommand.java similarity index 84% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/ContestCommand.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/commands/ContestCommand.java index 6dd4f8ee5..9f82c3ea3 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/ContestCommand.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/commands/ContestCommand.java @@ -1,18 +1,18 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.commands; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.commands; import fr.openmc.core.commands.autocomplete.OnlinePlayerAutoComplete; -import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; -import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; -import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete.ColorContestAutoComplete; -import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete.ContestPhaseAutoComplete; -import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete.TradeContestAutoComplete; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestPlayerManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.TradeYMLManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.ContributionMenu; -import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.VoteMenu; -import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; +import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.commands.autocomplete.ColorContestAutoComplete; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.commands.autocomplete.ContestPhaseAutoComplete; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.commands.autocomplete.TradeContestAutoComplete; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestPlayerManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.TradeYMLManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.menu.ContributionMenu; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.menu.VoteMenu; +import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEventPhase; import fr.openmc.core.utils.DateUtils; import fr.openmc.core.utils.messages.MessageType; import fr.openmc.core.utils.messages.MessagesManager; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java similarity index 71% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java index f5e6bc354..8f1a59d2a 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/commands/autocomplete/ColorContestAutoComplete.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.commands.autocomplete; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager; import org.jetbrains.annotations.NotNull; import revxrsal.commands.autocomplete.SuggestionProvider; import revxrsal.commands.bukkit.actor.BukkitCommandActor; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java similarity index 75% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java index 930499273..2ed0801db 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/commands/autocomplete/ContestPhaseAutoComplete.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.commands.autocomplete; -import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.ContestPhase; import org.jetbrains.annotations.NotNull; import revxrsal.commands.autocomplete.SuggestionProvider; import revxrsal.commands.bukkit.actor.BukkitCommandActor; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java similarity index 71% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java index 8c952eedc..6bd985dd2 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/commands/autocomplete/TradeContestAutoComplete.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.commands.autocomplete; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.commands.autocomplete; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.TradeYMLManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.TradeYMLManager; import org.jetbrains.annotations.NotNull; import revxrsal.commands.autocomplete.SuggestionProvider; import revxrsal.commands.bukkit.actor.BukkitCommandActor; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/events/ContestEndEvent.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/events/ContestEndEvent.java similarity index 90% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/events/ContestEndEvent.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/events/ContestEndEvent.java index 9d49e216e..56b0de067 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/events/ContestEndEvent.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/events/ContestEndEvent.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.events; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.events; -import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.models.ContestData; import lombok.Getter; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/listeners/ContestIntractEvents.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/listeners/ContestIntractEvents.java similarity index 88% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/listeners/ContestIntractEvents.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/listeners/ContestIntractEvents.java index 0e5665de3..d02d878ed 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/listeners/ContestIntractEvents.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/listeners/ContestIntractEvents.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.listeners; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.listeners; import dev.lone.itemsadder.api.Events.FurnitureInteractEvent; import org.bukkit.Bukkit; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestManager.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/managers/ContestManager.java similarity index 96% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestManager.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/managers/ContestManager.java index 0255e044d..8b33069e2 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestManager.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/managers/ContestManager.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.managers; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.DaoManager; @@ -9,15 +9,15 @@ import fr.openmc.core.CommandsManager; import fr.openmc.core.OMCPlugin; import fr.openmc.core.features.economy.EconomyManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.ContestCommand; -import fr.openmc.core.features.events.weeklyevents.contents.contest.events.ContestEndEvent; -import fr.openmc.core.features.events.weeklyevents.contents.contest.listeners.ContestIntractEvents; -import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.ContributionMenu; -import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.MoreInfoMenu; -import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.TradeMenu; -import fr.openmc.core.features.events.weeklyevents.contents.contest.menu.VoteMenu; -import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; -import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestPlayer; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.commands.ContestCommand; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.events.ContestEndEvent; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.listeners.ContestIntractEvents; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.menu.ContributionMenu; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.menu.MoreInfoMenu; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.menu.TradeMenu; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.menu.VoteMenu; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.models.ContestData; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.models.ContestPlayer; import fr.openmc.core.features.leaderboards.LeaderboardManager; import fr.openmc.core.features.mailboxes.MailboxManager; import fr.openmc.core.registry.items.CustomItemRegistry; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestPlayerManager.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/managers/ContestPlayerManager.java similarity index 97% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestPlayerManager.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/managers/ContestPlayerManager.java index 297aae673..743943cae 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/ContestPlayerManager.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/managers/ContestPlayerManager.java @@ -1,6 +1,6 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.managers; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers; -import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestPlayer; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.models.ContestPlayer; import lombok.Setter; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/TradeYMLManager.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/managers/TradeYMLManager.java similarity index 97% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/TradeYMLManager.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/managers/TradeYMLManager.java index 2d0c9ccd8..374f57e73 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/managers/TradeYMLManager.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/managers/TradeYMLManager.java @@ -1,7 +1,7 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.managers; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers; import fr.openmc.core.OMCPlugin; -import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.models.ContestData; import fr.openmc.core.utils.YmlUtils; import lombok.Getter; import org.bukkit.configuration.file.FileConfiguration; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/ContributionMenu.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/menu/ContributionMenu.java similarity index 96% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/ContributionMenu.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/menu/ContributionMenu.java index 5d51aeb88..b3b4300d9 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/ContributionMenu.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/menu/ContributionMenu.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.menu; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.menu; import dev.lone.itemsadder.api.CustomStack; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; @@ -6,8 +6,8 @@ import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestPlayerManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestPlayerManager; import fr.openmc.core.registry.items.CustomItemRegistry; import fr.openmc.core.utils.ColorUtils; import fr.openmc.core.utils.ItemUtils; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/MoreInfoMenu.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/menu/MoreInfoMenu.java similarity index 91% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/MoreInfoMenu.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/menu/MoreInfoMenu.java index 9f7512b7c..da09f0c34 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/MoreInfoMenu.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/menu/MoreInfoMenu.java @@ -1,12 +1,12 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.menu; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.menu; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; -import fr.openmc.core.features.events.weeklyevents.models.WeeklyEventPhase; +import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEventPhase; import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/TradeMenu.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/menu/TradeMenu.java similarity index 96% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/TradeMenu.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/menu/TradeMenu.java index ef9864dea..0f567f2fe 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/TradeMenu.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/menu/TradeMenu.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.menu; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.menu; import dev.lone.itemsadder.api.CustomStack; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; @@ -6,9 +6,9 @@ import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestPlayerManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.TradeYMLManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestPlayerManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.TradeYMLManager; import fr.openmc.core.features.mailboxes.MailboxManager; import fr.openmc.core.registry.items.CustomItemRegistry; import fr.openmc.core.utils.ItemUtils; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/VoteMenu.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/menu/VoteMenu.java similarity index 97% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/VoteMenu.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/menu/VoteMenu.java index 974162757..6fd2860ad 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/menu/VoteMenu.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/menu/VoteMenu.java @@ -1,12 +1,12 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.menu; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.menu; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; import fr.openmc.api.menulib.Menu; import fr.openmc.api.menulib.template.ConfirmMenu; import fr.openmc.api.menulib.utils.InventorySize; import fr.openmc.api.menulib.utils.ItemBuilder; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestPlayer; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.models.ContestPlayer; import fr.openmc.core.utils.ColorUtils; import fr.openmc.core.utils.messages.MessageType; import fr.openmc.core.utils.messages.MessagesManager; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestData.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/models/ContestData.java similarity index 96% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestData.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/models/ContestData.java index 52e0b21d6..54419d3c6 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestData.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/models/ContestData.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.models; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.models; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestPlayer.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/models/ContestPlayer.java similarity index 92% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestPlayer.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/models/ContestPlayer.java index 1c8500827..6d079ffef 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/contents/contest/models/ContestPlayer.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/contents/contest/models/ContestPlayer.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.events.weeklyevents.contents.contest.models; +package fr.openmc.core.features.events.contents.weeklyevents.contents.contest.models; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEvent.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/models/WeeklyEvent.java similarity index 52% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEvent.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/models/WeeklyEvent.java index d81ba171e..7cacae58a 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEvent.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/models/WeeklyEvent.java @@ -1,15 +1,11 @@ -package fr.openmc.core.features.events.weeklyevents.models; +package fr.openmc.core.features.events.contents.weeklyevents.models; -import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; -import net.kyori.adventure.text.Component; -import org.bukkit.inventory.ItemStack; +import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.models.Event; import java.util.List; -public abstract class WeeklyEvent { - public abstract Component getName(); - public abstract List getDescription(); - public abstract ItemStack getIcon(); +public abstract class WeeklyEvent extends Event { public abstract List getPhases(); /** @@ -27,4 +23,13 @@ public WeeklyEventPhase getActivePhase() { if (!isActive()) return null; return WeeklyEventsManager.getCurrentPhase(); } + + /** + * Retourne le nombre de semaines d'offset entre la semaine actuelle et la semaine de référence pour cet event. + * Utile pour prédire les événements lointin + * @return Offset + */ + public int getWeekOffset() { + return 0; + } } diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventPhase.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/models/WeeklyEventPhase.java similarity index 85% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventPhase.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/models/WeeklyEventPhase.java index 2df8d2fd6..31db7af69 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventPhase.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/models/WeeklyEventPhase.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.events.weeklyevents.models; +package fr.openmc.core.features.events.contents.weeklyevents.models; import net.kyori.adventure.text.Component; diff --git a/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventsData.java b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/models/WeeklyEventsData.java similarity index 92% rename from src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventsData.java rename to src/main/java/fr/openmc/core/features/events/contents/weeklyevents/models/WeeklyEventsData.java index 135d02a21..c68f3772a 100644 --- a/src/main/java/fr/openmc/core/features/events/weeklyevents/models/WeeklyEventsData.java +++ b/src/main/java/fr/openmc/core/features/events/contents/weeklyevents/models/WeeklyEventsData.java @@ -1,4 +1,4 @@ -package fr.openmc.core.features.events.weeklyevents.models; +package fr.openmc.core.features.events.contents.weeklyevents.models; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; diff --git a/src/main/java/fr/openmc/core/features/events/managers/CalendarManager.java b/src/main/java/fr/openmc/core/features/events/managers/CalendarManager.java new file mode 100644 index 000000000..ccc0230df --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/managers/CalendarManager.java @@ -0,0 +1,92 @@ +package fr.openmc.core.features.events.managers; + +import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEvent; +import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEventPhase; +import fr.openmc.core.features.events.models.Event; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.time.DayOfWeek; +import java.util.ArrayList; +import java.util.List; + +public class CalendarManager { + + public static List getUpcomingEvents(int slots) { + List events = new ArrayList<>(List.of( + WeeklyEventsManager.getCurrentEvent() + )); + + //todo: implement DailyEvent in upcoming events + + if (events.getLast() instanceof WeeklyEvent we) { + for (int i = events.size(); i <= slots; i++) { + int weekOffset = i; + + events.add(new WeeklyEvent() { + + @Override + public int getWeekOffset() { + return weekOffset; + } + + @Override + public List getPhases() { + return List.of(new WeeklyEventPhase() { + @Override + public Component getName() { + return Component.text("Inconnu"); + } + + @Override + public List getDescription() { + return List.of(); + } + + @Override + public DayOfWeek getStartDay() { + return we.getPhases().getFirst().getStartDay(); + } + + @Override + public int getStartHour() { + return 0; + } + + @Override + public int getStartMinutes() { + return 0; + } + + @Override + public Runnable runAction() { + return null; + } + }); + } + + @Override + public Component getName() { + return Component.text("Evenement du Weekend", NamedTextColor.YELLOW, TextDecoration.BOLD); + } + + @Override + public List getDescription() { + return List.of(); + } + + @Override + public ItemStack getIcon() { + return ItemStack.of(Material.GOLD_BLOCK); + } + }); + } + } + + return events; + } +} diff --git a/src/main/java/fr/openmc/core/features/events/menus/CalendarMenu.java b/src/main/java/fr/openmc/core/features/events/menus/CalendarMenu.java new file mode 100644 index 000000000..4058c9705 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/menus/CalendarMenu.java @@ -0,0 +1,130 @@ +package fr.openmc.core.features.events.menus; + +import fr.openmc.api.menulib.PaginatedMenu; +import fr.openmc.api.menulib.utils.InventorySize; +import fr.openmc.api.menulib.utils.ItemBuilder; +import fr.openmc.api.menulib.utils.StaticSlots; +import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEvent; +import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEventPhase; +import fr.openmc.core.features.events.managers.CalendarManager; +import fr.openmc.core.features.events.models.Event; +import fr.openmc.core.registry.items.CustomItemRegistry; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.TextStyle; +import java.time.temporal.TemporalAdjusters; +import java.util.*; + +public class CalendarMenu extends PaginatedMenu { + public CalendarMenu(Player owner) { + super(owner); + } + + @Override + public @Nullable Material getBorderMaterial() { + return Material.AIR; + } + + @Override + public @NotNull List getStaticSlots() { + return StaticSlots.getStandardSlots(getInventorySize()); + } + + @Override + public List getItems() { + List items = new ArrayList<>(); + for (Event event : CalendarManager.getUpcomingEvents(14)) { + items.add(new ItemBuilder(this, event.getIcon(), meta -> { + meta.customName(event.getName().decoration(TextDecoration.ITALIC, false)); + meta.lore(getEventLore(event)); + })); + } + return items; + } + + @Override + public List getTakableSlot() { + return List.of(); + } + + @Override + public @NotNull InventorySize getInventorySize() { + return InventorySize.LARGE; + } + + @Override + public int getSizeOfItems() { + return getItems().size(); + } + + @Override + public Map getButtons() { + Map map = new HashMap<>(); + map.put(33, new ItemBuilder(this, Objects.requireNonNull(CustomItemRegistry.getByName("_iainternal:icon_cancel")).getBest(), itemMeta -> itemMeta.displayName(Component.text("§7Fermer"))).setCloseButton()); + return map; + } + + private List getEventLore(Event event) { + List eventLore = new ArrayList<>(event.getDescription()); + + if (event instanceof WeeklyEvent we) { + eventLore.add(Component.empty()); + eventLore.add(Component.text("Phases :", NamedTextColor.GOLD, TextDecoration.BOLD).decoration(TextDecoration.ITALIC, false)); + for (WeeklyEventPhase phase : we.getPhases()) { + LocalDateTime now = LocalDateTime.now(); + + LocalDate nextDate = now.toLocalDate() + .with(TemporalAdjusters.nextOrSame(phase.getStartDay())) + .plusWeeks(we.getWeekOffset()); + + LocalDateTime dateEvent = nextDate.atTime( + phase.getStartHour(), + phase.getStartMinutes() + ); + + String formattedDate = dateEvent.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.FRANCE) + + " " + dateEvent.getDayOfMonth() + " " + + dateEvent.getMonth().getDisplayName(TextStyle.FULL, Locale.FRANCE); + // ex. Vendredi 13 Mars + + eventLore.add(Component.text("- ") + .append(phase.getName()) + .append(Component.text(" le " + formattedDate + " à " + + phase.getStartHour() + "h" + String.format("%02d", phase.getStartMinutes()))) // ex. 0h00 + .color(NamedTextColor.GRAY) + .decoration(TextDecoration.ITALIC, false) + ); + } + } + return eventLore; + } + + @Override + public @NotNull String getName() { + return "Calendrier Evenementiel"; + } + + @Override + public String getTexture() { + return null; + } + + @Override + public void onInventoryClick(InventoryClickEvent e) {} + + @Override + public void onClose(InventoryCloseEvent event) { + //empty + } +} diff --git a/src/main/java/fr/openmc/core/features/events/models/Event.java b/src/main/java/fr/openmc/core/features/events/models/Event.java new file mode 100644 index 000000000..feec507be --- /dev/null +++ b/src/main/java/fr/openmc/core/features/events/models/Event.java @@ -0,0 +1,13 @@ +package fr.openmc.core.features.events.models; + +import net.kyori.adventure.text.Component; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public abstract class Event { + public abstract Component getName(); + public abstract List getDescription(); + public abstract ItemStack getIcon(); + +} diff --git a/src/main/java/fr/openmc/core/features/leaderboards/LeaderboardManager.java b/src/main/java/fr/openmc/core/features/leaderboards/LeaderboardManager.java index fa688a272..6ac6e32fc 100644 --- a/src/main/java/fr/openmc/core/features/leaderboards/LeaderboardManager.java +++ b/src/main/java/fr/openmc/core/features/leaderboards/LeaderboardManager.java @@ -7,8 +7,8 @@ import fr.openmc.core.features.economy.BankManager; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.features.economy.models.EconomyPlayer; -import fr.openmc.core.features.events.halloween.managers.HalloweenManager; -import fr.openmc.core.features.events.halloween.models.HalloweenData; +import fr.openmc.core.features.events.contents.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.contents.halloween.models.HalloweenData; import fr.openmc.core.features.leaderboards.commands.LeaderboardCommands; import fr.openmc.core.utils.DateUtils; import fr.openmc.core.utils.entities.TextDisplay; diff --git a/src/main/java/fr/openmc/core/features/mainmenu/menus/Page1.java b/src/main/java/fr/openmc/core/features/mainmenu/menus/Page1.java index 024f6e2b9..1b7e92aa8 100644 --- a/src/main/java/fr/openmc/core/features/mainmenu/menus/Page1.java +++ b/src/main/java/fr/openmc/core/features/mainmenu/menus/Page1.java @@ -14,12 +14,12 @@ import fr.openmc.core.features.city.CityManager; import fr.openmc.core.features.city.commands.CityCommands; import fr.openmc.core.features.dream.DreamUtils; -import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; -import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; -import fr.openmc.core.features.events.weeklyevents.contents.contest.commands.ContestCommand; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.models.ContestData; +import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.commands.ContestCommand; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.models.ContestData; import fr.openmc.core.features.homes.command.TpHomeCommand; import fr.openmc.core.features.mailboxes.MailboxCommand; import fr.openmc.core.features.mainmenu.listeners.PacketListener; diff --git a/src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java b/src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java index 1ee79ee53..01939956e 100644 --- a/src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java +++ b/src/main/java/fr/openmc/core/features/quests/quests/WinContestQuest.java @@ -1,6 +1,6 @@ package fr.openmc.core.features.quests.quests; -import fr.openmc.core.features.events.weeklyevents.contents.contest.events.ContestEndEvent; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.events.ContestEndEvent; import fr.openmc.core.features.quests.objects.Quest; import fr.openmc.core.features.quests.objects.QuestTier; import fr.openmc.core.features.quests.rewards.QuestItemReward; diff --git a/src/main/java/fr/openmc/core/utils/ParticleUtils.java b/src/main/java/fr/openmc/core/utils/ParticleUtils.java index c43b92be4..b498b6575 100644 --- a/src/main/java/fr/openmc/core/utils/ParticleUtils.java +++ b/src/main/java/fr/openmc/core/utils/ParticleUtils.java @@ -6,10 +6,10 @@ import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import fr.openmc.core.OMCPlugin; -import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.Contest; -import fr.openmc.core.features.events.weeklyevents.contents.contest.ContestPhase; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.Contest; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.ContestPhase; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager; import net.kyori.adventure.text.format.NamedTextColor; import net.minecraft.core.particles.DustParticleOptions; import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; diff --git a/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java b/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java index cc76bc06d..6b3309d6b 100644 --- a/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java +++ b/src/main/java/fr/openmc/core/utils/database/DatabaseManager.java @@ -16,9 +16,9 @@ import fr.openmc.core.features.economy.BankManager; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.features.economy.TransactionsManager; -import fr.openmc.core.features.events.halloween.managers.HalloweenManager; -import fr.openmc.core.features.events.weeklyevents.WeeklyEventsManager; -import fr.openmc.core.features.events.weeklyevents.contents.contest.managers.ContestManager; +import fr.openmc.core.features.events.contents.halloween.managers.HalloweenManager; +import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsManager; +import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.managers.ContestManager; import fr.openmc.core.features.friend.FriendSQLManager; import fr.openmc.core.features.homes.HomesManager; import fr.openmc.core.features.mailboxes.MailboxManager;