### Register Custom Player Command Source: https://context7.com/ordwen/odailyquests/llms.txt Extend PlayerCommandBase to create new subcommands for /dquests. This example shows how to register a 'summary' command to display quest completion stats. ```java import com.ordwen.odailyquests.api.commands.player.PlayerCommandBase; import com.ordwen.odailyquests.api.ODailyQuestsAPI; import com.ordwen.odailyquests.quests.player.PlayerQuests; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.Collections; import java.util.List; public class SummaryCommand extends PlayerCommandBase { @Override public String getName() { return "summary"; } @Override public void onCommand(CommandSender sender, String[] args) { if (!(sender instanceof Player player)) return; PlayerQuests pq = ODailyQuestsAPI.getPlayerQuests(player.getName()); if (pq == null) { player.sendMessage("§cNo quest data found."); return; } player.sendMessage("§aCompleted today: " + pq.getAchievedQuests() + "/" + pq.getQuests().size()); player.sendMessage("§eAll-time total: " + pq.getTotalAchievedQuests()); } @Override public List onTabComplete(CommandSender sender, String[] args) { return Collections.emptyList(); } } // Register: // api.getPlayerCommandRegistry().registerCommand(new SummaryCommand()); // Usage in-game: /dquests summary ``` -------------------------------- ### Registering a Custom Quest Type Source: https://context7.com/ordwen/odailyquests/llms.txt Provides a step-by-step guide on how to register a custom quest type with O'DailyQuests. This involves defining a quest class that extends `AbstractQuest`, implementing necessary methods, and registering it using `ODailyQuestsAPI.registerQuestType()` in your plugin's `onLoad()` method. ```APIDOC ## Registering a custom quest type — `ODailyQuestsAPI.registerQuestType()` Register external quest classes **in `onLoad()`**, before ODailyQuests finishes enabling. After `onEnable()` runs on the host plugin, registration is locked. ```java import com.ordwen.odailyquests.api.ODailyQuestsAPI; import com.ordwen.odailyquests.quests.types.AbstractQuest; import com.ordwen.odailyquests.api.quests.IQuest; import com.ordwen.odailyquests.quests.player.progression.Progression; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.event.Event; // 1. Define the quest class public class DungeonClearQuest extends AbstractQuest { public DungeonClearQuest(BasicQuest base) { super(base); } @Override public String getType() { return "DUNGEON_CLEAR"; } @Override public boolean canProgress(Event event, Progression progression) { // custom logic evaluated by your addon's event listener return false; } @Override public boolean loadParameters(ConfigurationSection section, String file, String index) { // read any custom YAML keys from the quest definition return true; } } // 2. Register in your plugin's onLoad() @Override public void onLoad() { ODailyQuestsAPI.registerQuestType("DUNGEON_CLEAR", DungeonClearQuest.class); } // 3. Quest definition in any category YAML file: // quests: // 1: // name: "&5Clear a Dungeon" // menu_item: CHEST // quest_type: DUNGEON_CLEAR // required_amount: 1 // reward: // reward_type: COMMAND // commands: // - "eco give %player% 500" ``` ``` -------------------------------- ### Retrieve Player Quest Data Source: https://context7.com/ordwen/odailyquests/llms.txt Use ODailyQuestsAPI.getPlayerQuests() to get a player's quest state. This allows inspection and iteration of their current quests and progress. ```java import com.ordwen.odailyquests.api.ODailyQuestsAPI; import com.ordwen.odailyquests.quests.player.PlayerQuests; import com.ordwen.odailyquests.quests.types.AbstractQuest; import com.ordwen.odailyquests.quests.player.progression.Progression; import java.util.Map; Player player = Bukkit.getPlayer("Steve"); if (player == null) return; PlayerQuests playerQuests = ODailyQuestsAPI.getPlayerQuests(player.getName()); if (playerQuests == null) { // Player is offline or quests not yet loaded return; } // Today's completion ratio int done = playerQuests.getAchievedQuests(); int total = playerQuests.getQuests().size(); player.sendMessage("§a" + done + "/" + total + " quests completed today."); // All-time total int allTime = playerQuests.getTotalAchievedQuests(); player.sendMessage("§eAll-time quests completed: " + allTime); // Iterate individual quests and progress for (Map.Entry entry : playerQuests.getQuests().entrySet()) { AbstractQuest quest = entry.getKey(); Progression prog = entry.getValue(); player.sendMessage("§b" + quest.getQuestName() + " §7[" + prog.getAdvancement() + "/" + prog.getRequiredAmount() + "]" + (prog.isAchieved() ? " §a✓" : " §c✗")); } ``` -------------------------------- ### Registering a custom player subcommand Source: https://context7.com/ordwen/odailyquests/llms.txt Extend `PlayerCommandBase` to add a new `/dquests ` subcommand, automatically inheriting alias support from `config.yml`. ```APIDOC ## Registering a custom player subcommand — `PlayerCommandRegistry.registerCommand()` Extend `PlayerCommandBase` to add a new `/dquests ` subcommand, automatically inheriting alias support from `config.yml`. ```java import com.ordwen.odailyquests.api.commands.player.PlayerCommandBase; import com.ordwen.odailyquests.api.ODailyQuestsAPI; import com.ordwen.odailyquests.quests.player.PlayerQuests; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.Collections; import java.util.List; public class SummaryCommand extends PlayerCommandBase { @Override public String getName() { return "summary"; } @Override public void onCommand(CommandSender sender, String[] args) { if (!(sender instanceof Player player)) return; PlayerQuests pq = ODailyQuestsAPI.getPlayerQuests(player.getName()); if (pq == null) { player.sendMessage("§cNo quest data found."); return; } player.sendMessage("§aCompleted today: " + pq.getAchievedQuests() + "/" + pq.getQuests().size()); player.sendMessage("§eAll-time total: " + pq.getTotalAchievedQuests()); } @Override public List onTabComplete(CommandSender sender, String[] args) { return Collections.emptyList(); } } // Register: api.getPlayerCommandRegistry().registerCommand(new SummaryCommand()); // Usage in-game: /dquests summary ``` ``` -------------------------------- ### Registering a Custom Admin Subcommand Source: https://context7.com/ordwen/odailyquests/llms.txt Explains how to add custom subcommands to the `/dqadmin` command. Developers should extend `AdminCommandBase`, implement the `getName()`, `onCommand()`, and `onTabComplete()` methods, and then register their command handler using `api.getAdminCommandRegistry().registerCommand()`. ```APIDOC ## Registering a custom admin subcommand — `AdminCommandRegistry.registerCommand()` Extend `AdminCommandBase` and register the handler through the API to inject a new `/dqadmin ` subcommand. ```java import com.ordwen.odailyquests.api.commands.admin.AdminCommandBase; import org.bukkit.command.CommandSender; import java.util.Collections; import java.util.List; public class StatsCommand extends AdminCommandBase { @Override public String getName() { return "stats"; } @Override public void onCommand(CommandSender sender, String[] args) { sender.sendMessage("§bServer quest statistics: ..."); } @Override public List onTabComplete(CommandSender sender, String[] args) { return Collections.emptyList(); } } // Register in onEnable() after obtaining the API: api.getAdminCommandRegistry().registerCommand(new StatsCommand()); // Players can now run: /dqadmin stats ``` ``` -------------------------------- ### Accessing the API Instance Source: https://context7.com/ordwen/odailyquests/llms.txt Demonstrates how to retrieve the ODailyQuestsAPI instance from the main plugin object within your plugin's onEnable method. This API instance is the central entry point for interacting with O'DailyQuests. ```APIDOC ## Accessing the API instance `ODailyQuestsAPI` is the central entry point. Retrieve it from the main plugin instance after it has enabled. ```java import com.ordwen.odailyquests.ODailyQuests; import com.ordwen.odailyquests.api.ODailyQuestsAPI; // Inside your plugin's onEnable (ODailyQuests must already be loaded): ODailyQuests core = (ODailyQuests) Bukkit.getPluginManager().getPlugin("ODailyQuests"); if (core != null) { ODailyQuestsAPI api = core.getAPI(); // use api.getQuestTypeRegistry(), api.getPlayerCommandRegistry(), etc. } ``` ``` -------------------------------- ### Listen to ODQReloadEvent Source: https://context7.com/ordwen/odailyquests/llms.txt Fired during plugin reloads, in different phases (PRE_RELOAD, POST_RELOAD). Use this to synchronize addon data. This event is not cancellable. ```java import com.ordwen.odailyquests.api.events.ODQReloadEvent; import com.ordwen.odailyquests.reload.ReloadPhase; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; public class ReloadListener implements Listener { @EventHandler public void onODQReload(ODQReloadEvent event) { ReloadPhase phase = event.getPhase(); switch (phase) { case PRE_RELOAD -> Bukkit.getLogger().info("[MyAddon] ODQ pre-reload — saving addon state."); case POST_RELOAD -> Bukkit.getLogger().info("[MyAddon] ODQ post-reload — restoring addon state."); default -> {} } } } ``` -------------------------------- ### Registering a Custom Admin Subcommand Source: https://context7.com/ordwen/odailyquests/llms.txt Extend AdminCommandBase to create a new subcommand for /dqadmin. Register your custom command handler using api.getAdminCommandRegistry().registerCommand() in your plugin's onEnable() method. ```java import com.ordwen.odailyquests.api.commands.admin.AdminCommandBase; import org.bukkit.command.CommandSender; import java.util.Collections; import java.util.List; public class StatsCommand extends AdminCommandBase { @Override public String getName() { return "stats"; } @Override public void onCommand(CommandSender sender, String[] args) { sender.sendMessage("§bServer quest statistics: ..."); } @Override public List onTabComplete(CommandSender sender, String[] args) { return Collections.emptyList(); } } // Register in onEnable() after obtaining the API: api.getAdminCommandRegistry().registerCommand(new StatsCommand()); // Players can now run: /dqadmin stats ``` -------------------------------- ### Listen to Quest Progress Events Source: https://context7.com/ordwen/odailyquests/llms.txt Implement the Listener interface and use the @EventHandler annotation to react to QuestProgressEvent. This event is cancellable to prevent quest advancement. ```java import com.ordwen.odailyquests.api.events.QuestProgressEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; public class QuestProgressListener implements Listener { @EventHandler public void onQuestProgress(QuestProgressEvent event) { if (event.isCancelled()) return; String playerName = event.getPlayer().getName(); String questName = event.getQuest().getQuestName(); int amount = event.getAmount(); int current = event.getProgression().getAdvancement(); int required = event.getProgression().getRequiredAmount(); Bukkit.getLogger().info(playerName + " progressed '" + questName + "' by " + amount + " (" + current + "/" + required + ")"); // Cancel progress in a specific world: if (event.getPlayer().getWorld().getName().equals("creative_world")) { event.setCancelled(true); } } } // Register: getServer().getPluginManager().registerEvents(new QuestProgressListener(), this); ``` -------------------------------- ### Listening to QuestProgressEvent Source: https://context7.com/ordwen/odailyquests/llms.txt Fired every time a player advances any quest. This event is cancellable, allowing you to block the progress increment. ```APIDOC ## Listening to `QuestProgressEvent` Fired every time a player advances any quest. Cancellable — cancel to block the progress increment. ```java import com.ordwen.odailyquests.api.events.QuestProgressEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; public class QuestProgressListener implements Listener { @EventHandler public void onQuestProgress(QuestProgressEvent event) { if (event.isCancelled()) return; String playerName = event.getPlayer().getName(); String questName = event.getQuest().getQuestName(); int amount = event.getAmount(); int current = event.getProgression().getAdvancement(); int required = event.getProgression().getRequiredAmount(); Bukkit.getLogger().info(playerName + " progressed '" + questName + "' by " + amount + " (" + current + "/" + required + ")"); // Cancel progress in a specific world: if (event.getPlayer().getWorld().getName().equals("creative_world")) { event.setCancelled(true); } } } // Register: getServer().getPluginManager().registerEvents(new QuestProgressListener(), this); ``` ``` -------------------------------- ### Listen to AllQuestsCompletedEvent Source: https://context7.com/ordwen/odailyquests/llms.txt Fired when a player finishes all daily quests. This event is cancellable to prevent default rewards. ```java import com.ordwen.odailyquests.api.events.AllQuestsCompletedEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; public class AllQuestsListener implements Listener { @EventHandler public void onAllQuestsCompleted(AllQuestsCompletedEvent event) { event.getPlayer().sendMessage("§d★ You completed ALL your daily quests! ★"); // Grant a bonus title, run a command, etc. // Cancel to block the global_reward defined in config.yml: // event.setCancelled(true); } } ``` -------------------------------- ### Listen to CategoryTotalRewardReachedEvent Source: https://context7.com/ordwen/odailyquests/llms.txt Fired when a player's quest count within a specific category reaches a milestone. This event is not cancellable. ```java import com.ordwen.odailyquests.api.events.CategoryTotalRewardReachedEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; public class CategoryTotalRewardListener implements Listener { @EventHandler public void onCategoryTotalReward(CategoryTotalRewardReachedEvent event) { String category = event.getCategory(); int count = event.getCompletedInCategory(); event.getPlayer().sendMessage( "§b" + count + " §7total quests completed in category §e" + category + "§7!"); } } ``` -------------------------------- ### Listen to AllCategoryQuestsCompletedEvent Source: https://context7.com/ordwen/odailyquests/llms.txt Fired when a player completes all quests in a specific category. This event can be cancelled to block category-specific rewards. ```java import com.ordwen.odailyquests.api.events.AllCategoryQuestsCompletedEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; public class CategoryCompleteListener implements Listener { @EventHandler public void onCategoryComplete(AllCategoryQuestsCompletedEvent event) { String category = event.getCategory(); event.getPlayer().sendMessage("§a✓ You finished all §e" + category + " §aquests!"); // Cancel to block the category reward defined in config.yml: // event.setCancelled(true); } } ``` -------------------------------- ### Retrieving a player's active quests Source: https://context7.com/ordwen/odailyquests/llms.txt Inspect, iterate, or mutate a player's current quest state at runtime using `ODailyQuestsAPI.getPlayerQuests()`. ```APIDOC ## Retrieving a player's active quests — `ODailyQuestsAPI.getPlayerQuests()` Inspect, iterate, or mutate a player's current quest state at runtime. ```java import com.ordwen.odailyquests.api.ODailyQuestsAPI; import com.ordwen.odailyquests.quests.player.PlayerQuests; import com.ordwen.odailyquests.quests.types.AbstractQuest; import com.ordwen.odailyquests.quests.player.progression.Progression; import java.util.Map; Player player = Bukkit.getPlayer("Steve"); if (player == null) return; PlayerQuests playerQuests = ODailyQuestsAPI.getPlayerQuests(player.getName()); if (playerQuests == null) { // Player is offline or quests not yet loaded return; } // Today's completion ratio int done = playerQuests.getAchievedQuests(); int total = playerQuests.getQuests().size(); player.sendMessage("§a" + done + "/" + total + " quests completed today."); // All-time total int allTime = playerQuests.getTotalAchievedQuests(); player.sendMessage("§eAll-time quests completed: " + allTime); // Iterate individual quests and progress for (Map.Entry entry : playerQuests.getQuests().entrySet()) { AbstractQuest quest = entry.getKey(); Progression prog = entry.getValue(); player.sendMessage("§b" + quest.getQuestName() + " §7[" + prog.getAdvancement() + "/" + prog.getRequiredAmount() + "]" + (prog.isAchieved() ? " §a✓" : " §c✗")); } ``` ``` -------------------------------- ### Accessing ODailyQuestsAPI Instance Source: https://context7.com/ordwen/odailyquests/llms.txt Retrieve the ODailyQuestsAPI instance from the main plugin object in your plugin's onEnable method. Ensure ODailyQuests is already loaded. ```java import com.ordwen.odailyquests.ODailyQuests; import com.ordwen.odailyquests.api.ODailyQuestsAPI; // Inside your plugin's onEnable (ODailyQuests must already be loaded): ODailyQuests core = (ODailyQuests) Bukkit.getPluginManager().getPlugin("ODailyQuests"); if (core != null) { ODailyQuestsAPI api = core.getAPI(); // use api.getQuestTypeRegistry(), api.getPlayerCommandRegistry(), etc. } ``` -------------------------------- ### Registering a Custom Quest Type Source: https://context7.com/ordwen/odailyquests/llms.txt Define a custom quest class extending AbstractQuest and register it using ODailyQuestsAPI.registerQuestType() in your plugin's onLoad() method. Registration is locked after onEnable(). ```java import com.ordwen.odailyquests.api.ODailyQuestsAPI; import com.ordwen.odailyquests.quests.types.AbstractQuest; import com.ordwen.odailyquests.api.quests.IQuest; import com.ordwen.odailyquests.quests.player.progression.Progression; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.event.Event; // 1. Define the quest class public class DungeonClearQuest extends AbstractQuest { public DungeonClearQuest(BasicQuest base) { super(base); } @Override public String getType() { return "DUNGEON_CLEAR"; } @Override public boolean canProgress(Event event, Progression progression) { // custom logic evaluated by your addon's event listener return false; } @Override public boolean loadParameters(ConfigurationSection section, String file, String index) { // read any custom YAML keys from the quest definition return true; } } // 2. Register in your plugin's onLoad() @Override public void onLoad() { ODailyQuestsAPI.registerQuestType("DUNGEON_CLEAR", DungeonClearQuest.class); } // 3. Quest definition in any category YAML file: // quests: // 1: // name: "&5Clear a Dungeon" // menu_item: CHEST // quest_type: DUNGEON_CLEAR // required_amount: 1 // reward: // reward_type: COMMAND // commands: // - "eco give %player% 500" ``` -------------------------------- ### Listening to QuestCompletedEvent Source: https://context7.com/ordwen/odailyquests/llms.txt Fired when a player finishes a single quest. This event is cancellable, allowing you to suppress the reward. ```APIDOC ## Listening to `QuestCompletedEvent` Fired when a player finishes a single quest. Cancellable — cancel to suppress the reward. ```java import com.ordwen.odailyquests.api.events.QuestCompletedEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; public class QuestCompletedListener implements Listener { @EventHandler public void onQuestCompleted(QuestCompletedEvent event) { String playerName = event.getPlayer().getName(); String questName = event.getAbstractQuest().getQuestName(); String category = event.getAbstractQuest().getCategoryName(); Bukkit.broadcastMessage("§6" + playerName + " §ecompleted quest §b" + questName + " §7[" + category + "]"); // Prevent rewards for a specific quest type: if ("KILL".equals(event.getAbstractQuest().getQuestType())) { // event.setCancelled(true); // uncomment to block reward } } } ``` ``` -------------------------------- ### Listen to TotalRewardReachedEvent Source: https://context7.com/ordwen/odailyquests/llms.txt Fired when a player's total quest count reaches a milestone defined in totalRewards.yml. The event can be cancelled to suppress the milestone reward. ```java import com.ordwen.odailyquests.api.events.TotalRewardReachedEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; public class TotalRewardListener implements Listener { @EventHandler public void onTotalReward(TotalRewardReachedEvent event) { int milestone = event.getTotalCompleted(); event.getPlayer().sendMessage("§6Milestone reached: §e" + milestone + " §6total quests!"); // event.setCancelled(true); // suppress the milestone reward if desired } } ``` -------------------------------- ### Listen to Quest Completed Events Source: https://context7.com/ordwen/odailyquests/llms.txt Handle QuestCompletedEvent to perform actions when a player finishes a quest. This event is cancellable to suppress quest rewards. ```java import com.ordwen.odailyquests.api.events.QuestCompletedEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; public class QuestCompletedListener implements Listener { @EventHandler public void onQuestCompleted(QuestCompletedEvent event) { String playerName = event.getPlayer().getName(); String questName = event.getAbstractQuest().getQuestName(); String category = event.getAbstractQuest().getCategoryName(); Bukkit.broadcastMessage("§6" + playerName + " §ecompleted quest §b" + questName + " §7[" + category + "]"); // Prevent rewards for a specific quest type: if ("KILL".equals(event.getAbstractQuest().getQuestType())) { // event.setCancelled(true); // uncomment to block reward } } } ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.