Class QuestsManager

java.lang.Object
com.ordwen.odailyquests.quests.player.QuestsManager
All Implemented Interfaces:
org.bukkit.event.Listener

public class QuestsManager extends Object implements org.bukkit.event.Listener
Central manager for players' quests lifecycle: loading on join, saving on quit, and utilities to build / pick quests and progressions.

Responsibilities:

  • Registering join/quit listeners to load/save player quests via the database manager.
  • Keeping an in-memory map (activeQuests) of online players to their PlayerQuests.
  • Providing static helpers to select random quests and create fresh Progression objects.

Thread-safety: Bukkit events are called on the main thread. activeQuests is a plain HashMap; concurrent access from async tasks must be avoided or externally synchronized.

  • Constructor Details

    • QuestsManager

      public QuestsManager(ODailyQuests oDailyQuests)
      Creates a new QuestsManager.
      Parameters:
      oDailyQuests - main plugin instance; must not be null.
  • Method Details

    • onPlayerJoin

      public void onPlayerJoin(org.bukkit.event.player.PlayerJoinEvent event)
      Handles player join:
      1. Logs debug info.
      2. If the player is not registered in activeQuests, trigger async/sync load via DB manager.
      3. If already present, warn (unexpected state) to help diagnose stuck state.
      Parameters:
      event - Bukkit player join event
    • onPlayerQuit

      public void onPlayerQuit(org.bukkit.event.player.PlayerQuitEvent event)
      Handles player quit:
      1. Logs debug info.
      2. Fetches the player's PlayerQuests from activeQuests.
      3. If found, persists progression then removes the entry.
      4. If not found, logs a warning (unexpected state).
      Parameters:
      event - Bukkit player quit event
    • selectRandomQuests

      public static Map<AbstractQuest,Progression> selectRandomQuests(org.bukkit.entity.Player player)
      Selects random quests for a player across all categories.

      For each registered category, this method:

      1. Determines the required amount from QuestsPerCategory.
      2. Picks non-duplicate quests the player has permission to do.
      3. Creates a fresh Progression per quest.
      Parameters:
      player - target player (used for permission checks and logging)
      Returns:
      an ordered map (LinkedHashMap) of quests to their initial progression
    • getDynamicRequiredAmount

      public static int getDynamicRequiredAmount(String requiredAmountRaw)
      Resolves a dynamic "required amount" from a configuration string. Supports fixed integer values (e.g., "5") and ranges (e.g., "2-6").
      Parameters:
      requiredAmountRaw - raw value from configuration
      Returns:
      a positive integer (minimum 1)
      Throws:
      NumberFormatException - if the input cannot be parsed as integers
    • createFreshProgression

      public static Progression createFreshProgression(AbstractQuest quest)
      Creates a fresh Progression for the provided quest.

      The progression:

      Parameters:
      quest - the quest to build a progression for; must not be null
      Returns:
      a new Progression initialised for the quest
    • getRandomQuestForPlayer

      public static AbstractQuest getRandomQuestForPlayer(Set<AbstractQuest> currentQuests, List<AbstractQuest> availableQuests, org.bukkit.entity.Player player)
      Picks a random quest from a provided list that:
      • is not already present in currentQuests
      • meets all permission requirements for the given player
      Parameters:
      currentQuests - set of quests already assigned to the player (for duplicate filtering)
      availableQuests - candidate quests to pick from
      player - player used for permission checks
      Returns:
      a random eligible quest, or null if none are eligible
    • getActiveQuests

      public static Map<String,PlayerQuests> getActiveQuests()
      Exposes the in-memory map of active quests.

      Mutations on the returned map affect the internal state directly. Prefer adding dedicated methods if you need stricter control.

      Returns:
      the live map of player name -> PlayerQuests