Class QuestsManager
java.lang.Object
com.ordwen.odailyquests.quests.player.QuestsManager
- All Implemented Interfaces:
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 theirPlayerQuests. - Providing static helpers to select random quests and create fresh
Progressionobjects.
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 Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic ProgressionCreates a freshProgressionfor the provided quest.static Map<String, PlayerQuests> Exposes the in-memory map of active quests.static intgetDynamicRequiredAmount(String requiredAmountRaw) Resolves a dynamic "required amount" from a configuration string.static AbstractQuestgetRandomQuestForPlayer(Set<AbstractQuest> currentQuests, List<AbstractQuest> availableQuests, org.bukkit.entity.Player player) Picks a random quest from a provided list that: is not already present incurrentQuestsmeets all permission requirements for the given playervoidonPlayerJoin(org.bukkit.event.player.PlayerJoinEvent event) Handles player join: Logs debug info. If the player is not registered inactiveQuests, trigger async/sync load via DB manager. If already present, warn (unexpected state) to help diagnose stuck state.voidonPlayerQuit(org.bukkit.event.player.PlayerQuitEvent event) Handles player quit: Logs debug info. Fetches the player'sPlayerQuestsfromactiveQuests. If found, persists progression then removes the entry. If not found, logs a warning (unexpected state).static Map<AbstractQuest, Progression> selectRandomQuests(org.bukkit.entity.Player player) Selects random quests for a player across all categories.
-
Constructor Details
-
QuestsManager
Creates a newQuestsManager.- Parameters:
oDailyQuests- main plugin instance; must not benull.
-
-
Method Details
-
onPlayerJoin
public void onPlayerJoin(org.bukkit.event.player.PlayerJoinEvent event) Handles player join:- Logs debug info.
- If the player is not registered in
activeQuests, trigger async/sync load via DB manager. - 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:- Logs debug info.
- Fetches the player's
PlayerQuestsfromactiveQuests. - If found, persists progression then removes the entry.
- If not found, logs a warning (unexpected state).
- Parameters:
event- Bukkit player quit event
-
selectRandomQuests
Selects random quests for a player across all categories.For each registered category, this method:
- Determines the required amount from
QuestsPerCategory. - Picks non-duplicate quests the player has permission to do.
- Creates a fresh
Progressionper quest.
- Parameters:
player- target player (used for permission checks and logging)- Returns:
- an ordered map (
LinkedHashMap) of quests to their initial progression
- Determines the required amount from
-
getDynamicRequiredAmount
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
Creates a freshProgressionfor the provided quest.The progression:
- has a required amount resolved by
getDynamicRequiredAmount(String) - starts at 0 progress, not achieved
- optionally sets a random required index when
AbstractQuest.isRandomRequired()is true
- Parameters:
quest- the quest to build a progression for; must not benull- Returns:
- a new
Progressioninitialised for the quest
- has a required amount resolved by
-
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 fromplayer- player used for permission checks- Returns:
- a random eligible quest, or
nullif none are eligible
- is not already present in
-
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
-