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
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 Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic Progression
Creates a freshProgression
for the provided quest.static Map
<String, PlayerQuests> Exposes the in-memory map of active quests.static int
getDynamicRequiredAmount
(String requiredAmountRaw) Resolves a dynamic "required amount" from a configuration string.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 incurrentQuests
meets all permission requirements for the given playervoid
onPlayerJoin
(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.void
onPlayerQuit
(org.bukkit.event.player.PlayerQuitEvent event) Handles player quit: Logs debug info. Fetches the player'sPlayerQuests
fromactiveQuests
. 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
PlayerQuests
fromactiveQuests
. - 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
Progression
per 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 freshProgression
for 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
Progression
initialised 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
null
if 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
-