Skip to content
Draft
8 changes: 7 additions & 1 deletion src/main/java/fr/openmc/core/OMCRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import fr.openmc.core.bootstrap.registries.LifecycleRegistry;
import fr.openmc.core.bootstrap.registries.RegistryContext;
import fr.openmc.core.bootstrap.registries.RegistryLoadingType;
import fr.openmc.core.features.events.contents.weeklyevents.WeeklyEventsRegistry;
import fr.openmc.core.registry.ambient.CustomAmbientRegistry;
import fr.openmc.core.registry.enchantments.CustomEnchantmentRegistry;
import fr.openmc.core.registry.items.CustomItemRegistry;
Expand All @@ -20,14 +21,17 @@

@SuppressWarnings("UnstableApiUsage")
public final class OMCRegistry {

// * Registre globaux
public static CustomItemRegistry CUSTOM_ITEMS;
public static CustomMobRegistry CUSTOM_MOBS;
public static CustomEnchantmentRegistry CUSTOM_ENCHANTS;
public static CustomLootTableRegistry CUSTOM_LOOT_TABLES;
public static CustomAmbientRegistry CUSTOM_AMBIENTS;
public static CustomLootboxRegistry CUSTOM_LOOTBOXES;

// * Registre des features
public static WeeklyEventsRegistry WEEKLY_EVENTS;

private static final List<LifecycleRegistry> LOADED = new ArrayList<>();

private static final List<RegistryContext> ALL = List.of(
Expand All @@ -47,6 +51,8 @@ public final class OMCRegistry {
() -> CUSTOM_LOOTBOXES = new CustomLootboxRegistry(),
RegistryLoadingType.AFTER_IA),
new RegistryContext(() -> CUSTOM_MOBS = new CustomMobRegistry(),
RegistryLoadingType.AFTER_IA),
new RegistryContext(() -> WEEKLY_EVENTS = new WeeklyEventsRegistry(),
RegistryLoadingType.AFTER_IA)
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import java.text.NumberFormat;
import java.util.*;

// todo: shop de bits (menu qui va avec)
@Credit(developers = {"iambibi_"})
public class BitsManager extends Feature implements HasDatabase, HasCommands {
@Getter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,8 @@
@Credit(developers = {"iambibi_"})
public class ChatAnimationManager extends Feature implements LoadAfterItemsAdder, HasListeners {

//todo: changr valeur pour delay entre animationsXXss
private static final long MIN_DELAY_TICKS = 20 * 60 * 1L; // 20 min
private static final long MAX_DELAY_TICKS = 20 * 60 * 2L; // 30 min
private static final long MIN_DELAY_TICKS = 20 * 60 * 20L; // 20 min
private static final long MAX_DELAY_TICKS = 20 * 60 * 30L; // 30 min

private Set<ChatAnimation> ANIMATIONS;

Expand Down
13 changes: 12 additions & 1 deletion src/main/java/fr/openmc/core/features/events/EventsManager.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.openmc.core.features.events;

import fr.openmc.core.OMCRegistry;
import fr.openmc.core.bootstrap.features.Feature;
import fr.openmc.core.bootstrap.features.types.HasCommands;
import fr.openmc.core.bootstrap.features.types.LoadAfterItemsAdder;
Expand Down Expand Up @@ -60,9 +61,19 @@ public int getWeekOffset() {
return weekOffset;
}

@Override
public String getId() {
return "omc_weekly_event:unknown_event_" + weekOffset;
}

@Override
public List<WeeklyEventPhase> getPhases() {
return List.of(new WeeklyEventPhase() {
@Override
public String getId() {
return "unknown_phase";
}

@Override
public Component getName() {
return TranslationManager.translation("feature.events.calendar.unknown_phase");
Expand Down Expand Up @@ -132,7 +143,7 @@ private static LocalDateTime getEventStartDate(Event event) {

public static List<Event> getAllEventsRegistred() {
List<Event> events = new ArrayList<>(DailyEventsManager.EVENTS);
events.addAll(WeeklyEventsManager.EVENTS);
events.addAll(OMCRegistry.WEEKLY_EVENTS.values());
return events;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,16 @@
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import fr.openmc.core.OMCPlugin;
import fr.openmc.core.OMCRegistry;
import fr.openmc.core.bootstrap.features.Feature;
import fr.openmc.core.bootstrap.features.annotations.Credit;
import fr.openmc.core.bootstrap.features.types.HasDatabase;
import fr.openmc.core.bootstrap.features.types.LoadAfterItemsAdder;
import fr.openmc.core.bootstrap.integration.OMCLogger;
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.text.DateUtils;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitTask;

Expand All @@ -27,10 +26,6 @@
@Credit(developers = {"iambibi_"})
public class WeeklyEventsManager extends Feature implements LoadAfterItemsAdder, HasDatabase {

public static final List<WeeklyEvent> EVENTS = List.of(
new Contest()
);

private static Dao<WeeklyEventsData, Integer> dao;
private static WeeklyEventsData data;
private static BukkitTask currentTask = null;
Expand All @@ -46,7 +41,7 @@ public void init() {

WeeklyEventPhase currentPhase = getCurrentPhase();
if (data.isActive() && currentPhase != null && DateUtils.getCurrentDayOfWeek().equals(currentPhase.getStartDay())) {
runPhase(currentPhase);
runPhase(getCurrentEvent(), currentPhase);
return;
}

Expand All @@ -69,7 +64,8 @@ public static WeeklyEventsData load() {
try {
WeeklyEventsData data = dao.queryForId(1);
if (data == null) {
data = new WeeklyEventsData(0, 0);
WeeklyEvent contest = OMCRegistry.WEEKLY_EVENTS.CONTEST;
data = new WeeklyEventsData(contest, null);
dao.create(data);
}
return data;
Expand All @@ -93,27 +89,19 @@ public static void save(WeeklyEventsData data) {
* 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<? extends WeeklyEvent> eventClass) {
return EVENTS.stream()
.filter(event -> event.getClass().equals(eventClass))
.findFirst()
.orElse(null);
return OMCRegistry.WEEKLY_EVENTS.get(data.getCurrentEvent()).orElse(null);
}

/**
* Retourne la phase en cours selon l'index en BDD, ou null si invalide.
*/
public static WeeklyEventPhase getCurrentPhase() {
List<WeeklyEventPhase> phases = getCurrentEvent().getPhases();
int index = data.getCurrentPhaseIndex();
if (index < 0 || index >= phases.size()) return null;
return phases.get(index);
String phaseId = data.getCurrentPhase();
return phases.stream()
.filter(phase -> phase.getId().equals(phaseId))
.findFirst()
.orElse(null);
}

/**
Expand Down Expand Up @@ -147,36 +135,38 @@ public static void scheduleNextPhase() {
) * 20L;

if (delayTicks <= 0) {
runPhase(nextPhase);
runPhase(getCurrentEvent(), nextPhase);
return;
}

OMCLogger.infoFormatted("Prochaine Phase ({}) de l'évenement weekly ({}) le"
OMCLogger.infoFormatted("Prochaine Phase ({}) de l'évenement weekly ({}) le "
+ nextPhase.getStartDay().getDisplayName(TextStyle.FULL_STANDALONE, Locale.FRENCH) + " "
+ nextPhase.getStartHour() + "h" + nextPhase.getStartMinutes() + "m "
+ " (dans " + DateUtils.convertSecondToTime(DateUtils.getSecondsUntilDayOfWeekTime(
+ nextPhase.getStartHour() + "h " + nextPhase.getStartMinutes() + "m "
+ "(dans " + DateUtils.convertSecondToTime(DateUtils.getSecondsUntilDayOfWeekTime(
nextPhase.getStartDay(),
nextPhase.getStartHour(),
nextPhase.getStartMinutes(),
0
)) + ")", PlainTextComponentSerializer.plainText().serialize(nextPhase.getName()),
PlainTextComponentSerializer.plainText().serialize(getCurrentEvent().getName()));
)) + ")", nextPhase.getId(),
getCurrentEvent().getId());


currentTask = Bukkit.getScheduler().runTaskLater(OMCPlugin.getInstance(), () -> {
if (findNextPhase() != nextPhase) {
scheduleNextPhase();
return;
}
runPhase(nextPhase);
runPhase(getCurrentEvent(), 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) {
private static void runPhase(WeeklyEvent event, WeeklyEventPhase phase) {
data.setCurrentEvent(event.getId());
data.setCurrentPhase(phase.getId());
data.setActive(true);
save(data);

Expand All @@ -187,8 +177,7 @@ private static void runPhase(WeeklyEventPhase phase) {
Runnable action = phase.runAction();
if (action != null) action.run();
} catch (Exception e) {
OMCLogger.error("Erreur lors de l'exécution de la phase {}",
PlainTextComponentSerializer.plainText().serialize(phase.getName()), e);
OMCLogger.error("Erreur lors de l'exécution de la phase {}", phase.getId(), e);
}
}

Expand All @@ -197,15 +186,16 @@ private static void runPhase(WeeklyEventPhase phase) {
* Si c'était la dernière phase, passe à l'event suivant (et marque inactif).
*/
private static void advancePhase() {
List<WeeklyEventPhase> phases = getCurrentEvent().getPhases();
int nextPhaseIndex = data.getCurrentPhaseIndex() + 1;

if (nextPhaseIndex >= phases.size()) {
advanceToNextEvent();
} else {
data.setCurrentPhaseIndex(nextPhaseIndex);
save(data);
}
WeeklyEvent event = getCurrentEvent();
WeeklyEventPhase current = getCurrentPhase();

event.getNextPhase(current).ifPresentOrElse(
next -> {
data.setCurrentPhase(next.getId());
save(data);
},
WeeklyEventsManager::advanceToNextEvent
);
}

/**
Expand All @@ -214,61 +204,53 @@ private static void advancePhase() {
* 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) {
if (event == null || phase == null || !event.hasPhase(phase)) {
OMCLogger.error("[WeeklyEvents] Event ou phase non trouvé");
return;
}

data.setCurrentEvent(event.getId());
data.setCurrentPhase(phase.getId());
save(data);

OMCLogger.info("[WeeklyEvents] Event forcé : {} à la phase {}",
PlainTextComponentSerializer.plainText().serialize(event.getName()),
PlainTextComponentSerializer.plainText().serialize(phase.getName()));
event.getId(),
phase.getId());

runPhase(phase);
runPhase(event, phase);
}

/**
* Passe à l'event suivant, réinitialise la phase à 0 et marque l'event comme inactif.
*/
private static void advanceToNextEvent() {
WeeklyEvent current = getCurrentEvent();
WeeklyEvent next = OMCRegistry.WEEKLY_EVENTS.getNextEvent(current)
.orElseThrow(() -> new IllegalStateException("Aucun event enregistré"));

data.setActive(false);
int nextIndex = (data.getCurrentEventIndex() + 1) % EVENTS.size();
data.setCurrentEventIndex(nextIndex);
data.setCurrentPhaseIndex(0);
data.setCurrentEvent(next.getId());
data.setCurrentPhase(null);
save(data);

OMCLogger.info("[WeeklyEvents] Passage à l'event suivant : {}",
PlainTextComponentSerializer.plainText().serialize(getCurrentEvent().getName()));
next.getId());
}

/**
* 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<WeeklyEventPhase> phases = event.getPhases();

int phaseStart = (i == 0) ? (data.getCurrentPhaseIndex() + 1) : 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;
}
WeeklyEvent event = getCurrentEvent();
WeeklyEventPhase current = getCurrentPhase();

if (current == null) {
return event.getFirstPhase();
}

return null;
return event.getNextPhase(current)
.or(() -> OMCRegistry.WEEKLY_EVENTS.getNextEvent(event).map(WeeklyEvent::getFirstPhase))
.orElse(null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package fr.openmc.core.features.events.contents.weeklyevents;

import fr.openmc.core.bootstrap.registries.KeyedRegistry;
import fr.openmc.core.bootstrap.registries.Registry;
import fr.openmc.core.features.events.contents.weeklyevents.contents.contest.Contest;
import fr.openmc.core.features.events.contents.weeklyevents.models.WeeklyEvent;

import java.util.List;
import java.util.Optional;

public class WeeklyEventsRegistry extends Registry<String, WeeklyEvent>
implements KeyedRegistry<String, WeeklyEvent> {

public final WeeklyEvent CONTEST = register(new Contest());

@Override
public String key(WeeklyEvent registryObject) {
return registryObject.getId();
}

public WeeklyEvent getEvent(Class<? extends WeeklyEvent> eventClass) {
return entries.values().stream()
.filter(weeklyEvent -> weeklyEvent.getClass().equals(eventClass))
.findFirst()
.orElse(null);
}

public Optional<WeeklyEvent> getNextEvent(WeeklyEvent current) {
List<WeeklyEvent> events = values().stream().toList();
int index = events.indexOf(current);
if (index == -1) return Optional.empty();
return Optional.of(events.get((index + 1) % events.size()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ public ItemStack getIcon() {
return OMCRegistry.CUSTOM_ITEMS.CONTEST_SHELL.getBest();
}

@Override
public String getId() {
return "omc_contest:contest";
}

@Override
public List<WeeklyEventPhase> getPhases() {
return Arrays.stream(ContestPhase.values()).map(ContestPhase::getPhase).toList();
Expand Down
Loading
Loading