forked from Build-9/Hytale-Example-Project
-
Notifications
You must be signed in to change notification settings - Fork 2
QuestHelper
ShaneeexD edited this page Feb 18, 2026
·
1 revision
Quest system support for building structured progression systems in plugins.
What it does:
- Provides data structures for quests with objectives, rewards, and prerequisites
- Supports repeatable quests (daily, weekly loops)
- Tracks quest progress and completion
- Integrates with player progression systems
When to use:
- Building RPG-style progression systems
- Story/mission-based gameplay
- Repeatable daily or weekly quests
- Achievement systems with prerequisites
Represents a quest with objectives, rewards, and metadata.
public class Quest {
String id;
String name;
String description;
List<Objective> objectives;
List<Reward> rewards;
List<String> prerequisites; // Quest IDs that must be completed first
boolean repeatable;
int repeatCooldownTicks; // For repeatable quests
}Represents a single quest objective.
public class Objective {
String type; // "kill", "collect", "visit", "craft", etc.
String target; // Entity type, item ID, zone name, etc.
int requiredAmount;
String description;
}Represents a quest reward.
public class Reward {
String type; // "item", "currency", "experience", etc.
String itemId; // For item rewards
int quantity;
int currencyAmount; // For currency rewards
}Registers a quest in the world for use by players.
Quest quest = new Quest();
quest.id = "kill_skeletons";
quest.name = "Skeleton Slayer";
quest.description = "Defeat 10 skeleton warriors";
quest.objectives = Arrays.asList(
new Objective("kill", "Skeleton_Warrior", 10, "Defeat skeleton warriors")
);
quest.rewards = Arrays.asList(
new Reward("item", "Weapon_Sword_Iron", 1),
new Reward("currency", null, 100)
);
QuestHelper.registerQuest(world, quest);Starts a quest for a specific player if prerequisites are met.
boolean started = QuestHelper.startQuestForPlayer(world, playerEntity, "kill_skeletons");
if (started) {
PlayerHelper.sendMessage(playerEntity, "Quest started: Skeleton Slayer!");
} else {
PlayerHelper.sendMessage(playerEntity, "You don't meet the prerequisites for this quest.");
}Returns the current progress on a quest objective.
int progress = QuestHelper.checkQuestProgress(world, playerEntity, "kill_skeletons");
PlayerHelper.sendMessage(playerEntity, "Progress: " + progress + "/10 skeletons defeated");Completes a quest and gives rewards if objectives are met.
boolean completed = QuestHelper.completeQuest(world, playerEntity, "kill_skeletons");
if (completed) {
PlayerHelper.sendMessage(playerEntity, "Quest completed! Rewards received.");
// Rewards are automatically given (items added to inventory, currency added)
} else {
PlayerHelper.sendMessage(playerEntity, "Quest objectives not yet completed.");
}Returns a list of quest IDs the player is currently working on.
List<String> activeQuests = QuestHelper.getActiveQuests(world, playerEntity);
PlayerHelper.sendMessage(playerEntity, "Active quests: " + String.join(", ", activeQuests));Returns a list of quest IDs the player has completed.
List<String> completedQuests = QuestHelper.getCompletedQuests(world, playerEntity);
PlayerHelper.sendMessage(playerEntity, "Completed quests: " + completedQuests.size());Makes a quest repeatable with an optional cooldown.
// Daily repeatable quest (assuming 24000 ticks per day)
QuestHelper.setQuestRepeatable("daily_mining", true, 24000);
// One-time quest
QuestHelper.setQuestRepeatable("main_story_1", false, 0);Adds a prerequisite quest that must be completed before this quest can be started.
QuestHelper.addQuestPrerequisite("advanced_combat", "basic_training");// Register a simple kill quest
Quest killQuest = new Quest();
killQuest.id = "defeat_goblins";
killQuest.name = "Goblin Hunter";
killQuest.description = "Defeat 5 goblins in the forest";
killQuest.objectives = Arrays.asList(
new Objective("kill", "Goblin_Scout", 5, "Defeat goblin scouts")
);
killQuest.rewards = Arrays.asList(
new Reward("item", "Armor_Helmet_Leather", 1),
new Reward("currency", null, 50)
);
QuestHelper.registerQuest(world, killQuest);
// Start quest when player enters zone
EventHelper.onPlayerJoinWorld(plugin, world -> {
// Check if player has quest available
if (!QuestHelper.getCompletedQuests(world, playerEntity).contains("defeat_goblins") &&
!QuestHelper.getActiveQuests(world, playerEntity).contains("defeat_goblins")) {
QuestHelper.startQuestForPlayer(world, playerEntity, "defeat_goblins");
}
});// Daily mining quest
Quest dailyMine = new Quest();
dailyMine.id = "daily_miner";
dailyMine.name = "Miner's Daily Grind";
dailyMine.description = "Mine 20 blocks of any ore";
dailyMine.objectives = Arrays.asList(
new Objective("mine", "ore", 20, "Mine any ore blocks")
);
dailyMine.rewards = Arrays.asList(
new Reward("item", "Tool_Pickaxe_Iron", 1)
);
dailyMine.repeatable = true;
dailyMine.repeatCooldownTicks = 24000; // 1 day
QuestHelper.registerQuest(world, dailyMine);// Story quest chain
Quest quest1 = new Quest();
quest1.id = "village_help";
quest1.name = "Village Helper";
quest1.description = "Help the villagers with basic tasks";
// ... setup objectives and rewards
Quest quest2 = new Quest();
quest2.id = "explore_caves";
quest2.name = "Cave Explorer";
quest2.description = "Explore the dangerous caves";
// ... setup objectives and rewards
// Make quest2 require quest1 completion
QuestHelper.addQuestPrerequisite("explore_caves", "village_help");
QuestHelper.registerQuest(world, quest1);
QuestHelper.registerQuest(world, quest2);