Skip to main content

zQuests API

zQuests provides an API for developers to interact with quests, manage progress, and create custom integrations.

Setup

Maven/Gradle

Add the zQuests API as a dependency:

repositories {
maven {
name = "groupezReleases"
url = uri("https://repo.groupez.dev/releases")
}
}

dependencies {
compileOnly("fr.maxlego08.quests:zquests-api:<version>")
}

Replace <version> with the version of zQuests running on your server.

plugin.yml

Add zQuests as a dependency:

depend: [zQuests]
# or
softdepend: [zQuests]

Accessing Managers

Use Bukkit's ServicesManager to access zQuests managers:

import fr.maxlego08.quests.api.QuestManager;
import fr.maxlego08.quests.api.HologramManager;
import fr.maxlego08.quests.api.WayPointManager;
import org.bukkit.Bukkit;

public class MyPlugin extends JavaPlugin {

private QuestManager questManager;
private HologramManager hologramManager;
private WayPointManager wayPointManager;

@Override
public void onEnable() {
// Get quest manager
questManager = Bukkit.getServicesManager().load(QuestManager.class);

// Get hologram manager (optional)
hologramManager = Bukkit.getServicesManager().load(HologramManager.class);

// Get waypoint manager (optional)
wayPointManager = Bukkit.getServicesManager().load(WayPointManager.class);

if (questManager != null) {
getLogger().info("zQuests API loaded!");
}
}
}

Quest Manager

The QuestManager is the main API interface for interacting with quests.

Get Quest Information

// Get a quest by name
Optional<Quest> quest = questManager.getQuest("stone-breaker-1");

// Get all quests
List<Quest> allQuests = questManager.getQuests();

// Check if quest exists
boolean exists = questManager.getQuest("quest-name").isPresent();

Player Quest Data

UUID playerId = player.getUniqueId();

// Get player's active quests
List<ActiveQuest> activeQuests = questManager.getActiveQuests(playerId);

// Check if player has a specific quest active
boolean hasQuest = questManager.hasActiveQuest(playerId, "stone-breaker-1");

// Get player's progress on a quest
Optional<ActiveQuest> activeQuest = questManager.getActiveQuest(playerId, "stone-breaker-1");
if (activeQuest.isPresent()) {
int progress = activeQuest.get().getProgress();
int goal = activeQuest.get().getQuest().getGoal();
}

Start and Complete Quests

// Start a quest for a player
questManager.startQuest(playerId, "stone-breaker-1");

// Complete a quest for a player
questManager.completeQuest(playerId, "stone-breaker-1");

// Delete a quest from player's data
questManager.deleteQuest(playerId, "stone-breaker-1");

// Restart a quest
questManager.restartQuest(playerId, "stone-breaker-1");

Modify Progress

// Set exact progress value
questManager.setProgress(playerId, "stone-breaker-1", 250);

// Add to progress
questManager.addProgress(playerId, "stone-breaker-1", 10);

Handle Quest Events

Trigger quest progress for specific quest types:

// Handle block break progress
int updated = questManager.handleQuests(
playerId,
QuestType.BLOCK_BREAK,
1, // amount
Material.STONE // action data
);

// Handle entity kill progress
questManager.handleQuests(
playerId,
QuestType.ENTITY_KILL,
1,
EntityType.ZOMBIE
);

// Handle custom quest progress
questManager.handleQuests(
playerId,
QuestType.CUSTOM,
1,
"my-custom-data"
);

The return value indicates how many quests were updated.

Custom Quest Types

Using CUSTOM Type

The CUSTOM quest type allows you to create quests tracked by your own logic:

quests:
- type: CUSTOM
name: "talk-to-npc"
display-name: "Talk to the Guide"
goal: 1
actions:
- data: "npc:guide"

Trigger progress from your plugin:

// When player talks to your NPC
public void onNPCInteract(Player player, String npcId) {
QuestManager manager = Bukkit.getServicesManager().load(QuestManager.class);
if (manager != null) {
// Data must match quest's action data
int result = manager.handleQuests(
player.getUniqueId(),
QuestType.CUSTOM,
1,
"npc:" + npcId
);

if (result > 0) {
// Quest(s) were updated
player.sendMessage("Quest progress updated!");
}
}
}

Inventory Content Quests

For INVENTORY_CONTENT quests that require item delivery:

// Create inventory content check
InventoryContent content = new InventoryContent(player, "npc_name");

// Process the quest (checks inventory and removes items)
int result = questManager.handleInventoryQuests(content);

Events

zQuests fires several events you can listen to:

QuestStartEvent

Fired when a quest starts for a player.

@EventHandler
public void onQuestStart(QuestStartEvent event) {
Player player = event.getPlayer();
Quest quest = event.getQuest();

if (player != null) {
player.sendMessage("Started quest: " + quest.getDisplayName());
}
}

QuestProgressEvent

Fired when quest progress is made.

@EventHandler
public void onQuestProgress(QuestProgressEvent event) {
Player player = event.getPlayer();
ActiveQuest activeQuest = event.getActiveQuest();
int progress = activeQuest.getProgress();
int goal = activeQuest.getQuest().getGoal();

if (player != null) {
player.sendMessage("Progress: " + progress + "/" + goal);
}
}

QuestCompleteEvent

Fired when a quest is completed.

@EventHandler
public void onQuestComplete(QuestCompleteEvent event) {
Player player = event.getPlayer();
Quest quest = event.getActiveQuest().getQuest();

if (player != null) {
player.sendMessage("Completed: " + quest.getDisplayName());

// Give custom rewards
player.getInventory().addItem(new ItemStack(Material.DIAMOND, 5));
}
}

QuestFavoriteChangeEvent

Fired when a quest's favorite status changes.

@EventHandler
public void onFavoriteChange(QuestFavoriteChangeEvent event) {
Player player = event.getPlayer();
boolean isFavorite = event.isFavorite();

if (player != null && isFavorite) {
player.sendMessage("Quest added to favorites!");
}
}

QuestPostProgressEvent

Fired after quest progress is processed.

@EventHandler
public void onPostProgress(QuestPostProgressEvent event) {
// Useful for post-processing or logging
}

QuestUserLoadEvent

Fired when a player's quest data is loaded.

@EventHandler
public void onUserLoad(QuestUserLoadEvent event) {
UUID playerId = event.getPlayerId();
// Player's quest data is now available
}

Hologram Manager

Manage quest holograms programmatically:

HologramManager hologramManager = Bukkit.getServicesManager().load(HologramManager.class);

if (hologramManager != null) {
// Refresh all holograms for a player
hologramManager.refreshHolograms(player);

// Refresh all holograms globally
hologramManager.refreshAllHolograms();
}

Waypoint Manager

Manage quest waypoints:

WayPointManager wayPointManager = Bukkit.getServicesManager().load(WayPointManager.class);

if (wayPointManager != null) {
// Refresh waypoints for a player
wayPointManager.refreshWaypoints(player);
}

Complete Example

Here's a complete example plugin that integrates with zQuests:

package com.example.questintegration;

import fr.maxlego08.quests.api.QuestManager;
import fr.maxlego08.quests.api.QuestType;
import fr.maxlego08.quests.api.events.QuestCompleteEvent;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class QuestIntegration extends JavaPlugin implements Listener {

private QuestManager questManager;

@Override
public void onEnable() {
questManager = Bukkit.getServicesManager().load(QuestManager.class);

if (questManager == null) {
getLogger().warning("zQuests not found!");
return;
}

getServer().getPluginManager().registerEvents(this, this);
getLogger().info("Quest integration enabled!");
}

@EventHandler
public void onNPCInteract(PlayerInteractEntityEvent event) {
Player player = event.getPlayer();

// Example: Trigger custom quest when player interacts with villager
if (event.getRightClicked().getType().name().equals("VILLAGER")) {
int result = questManager.handleQuests(
player.getUniqueId(),
QuestType.CUSTOM,
1,
"villager:interact"
);

if (result > 0) {
player.sendMessage("§aQuest progress: Talked to villager!");
}
}
}

@EventHandler
public void onQuestComplete(QuestCompleteEvent event) {
Player player = event.getPlayer();
if (player == null) return;

String questName = event.getActiveQuest().getQuest().getName();

// Custom handling for specific quests
if (questName.equals("special-quest")) {
player.sendMessage("§6§lSpecial quest completed!");
// Add your custom logic here
}
}
}

Best Practices

  1. Check for null - Always check if managers are available
  2. Use events - Listen to events instead of polling for changes
  3. Async considerations - Quest operations are thread-safe but callbacks may be async
  4. Cache references - Store manager references in onEnable() instead of fetching repeatedly
  5. Handle soft dependencies - Make zQuests a soft-depend if your plugin should work without it

API Javadocs

For complete API documentation, see the Javadocs generated from the source code or explore the API module in the GitHub repository.

Copyright © 2026 GroupeZ|Build #loading...|-