Guide
How to make a Minecraft quest plugin
Updated October 18, 2026
Quests give players a reason to play: kill 20 zombies, mine 64 iron, bring a villager 10 bread. A quest plugin is three things: objectives that listen to game events, progress saved for every player, and rewards. Defining quests in a config file lets you add new ones without touching the code.
Change the quests and rewards to yours.
Generate this with CodexeStep by step
1.Choose the objective types
Start with a few: kill a mob type, break or place blocks, collect items, craft, reach a place, talk to an NPC. Every quest is built from these.
2.Define quests in a file
Each quest in
quests.yml: an id, a name, a description, its objectives with amounts, rewards and requirements (another quest first, a permission, a level).3.Track progress per player
Listen to the events behind each objective and add to the player's progress. Save it to SQLite or a file so it survives logouts and restarts.
4.Show the progress
A
/questsmenu with active and finished quests, plus a message, title or boss bar when progress changes.5.Give rewards
Items, experience, money through Vault, or console commands such as
lp user %player% permission set ...for anything else.6.Build and complete a quest in game
Let Codexe compile it, join the test server, accept a quest and finish it. Then restart and check the progress and rewards were saved.
Objectives and the events behind them
| Objective | Event | Detail to decide |
|---|---|---|
| Kill mobs | EntityDeathEvent | Count only kills by the player, or also by their pets and arrows |
| Break blocks | BlockBreakEvent | Ignore blocks the player placed, or players will place and break the same block |
| Collect items | Inventory check or pickup event | Whether the items are taken when the quest is handed in |
| Craft items | CraftItemEvent | Shift-click crafting makes several at once |
| Reach a place | PlayerMoveEvent | Check only when the player changes block, not every movement |
| Talk to an NPC | PlayerInteractEntityEvent | Which entity is the quest giver |
Quest givers
The simplest quest giver is a command or a menu. For a character in the world, a villager or armour stand with a custom name and a PersistentDataContainer tag works without other plugins: the plugin recognises it when a player right-clicks it. If your server already uses an NPC plugin such as Citizens, name it in the request so the plugin hooks into it.
Example description
"A Paper 1.21.4 quest plugin called Quests. Objective types: kill mobs, break blocks (not placed by players), collect items and talk to a villager tagged as a quest giver. Quests defined in quests.yml with name, objectives, required quest and rewards (items, experience, Vault money, console commands). /quests opens a menu with available, active and finished quests. Progress shown in the action bar. Up to 3 active quests. Daily quests reset at midnight server time. Progress saved in SQLite."
Daily and repeatable quests
- Say when they reset: at a fixed time each day, or 24 hours after the player finished.
- Say whether daily quests are random for each player or the same for everyone.
- Store the last completion time, not a flag, so resets work while the server is off.
Questions
Can quests use PlaceholderAPI?
Yes. Ask for placeholders such as the active quest and its progress, so scoreboards and tab lists can show them. Name PlaceholderAPI in the request so it is added as a dependency.
Can I write quests with Skript?
Small quest systems fit in a Skript with variables. Many objective types, menus and saved progress for hundreds of players are easier to keep fast and organised in a plugin.
How do I check the quests work?
Play them on the Codexe test server, and add tests in your own words, for example "a normal player runs /quests and sees a menu open". Tests check messages, items and menus, not mobs or blocks in the world.
Make your quest plugin
This prompt opens ready to send:
“A Paper 1.21.4 quest plugin: objective types kill mobs, break blocks not placed by players, collect items and talk to a tagged villager; quests in quests.yml with objectives, required quest and rewards (items, XP, Vault money, console commands); /quests menu with available, active and finished quests; progress in the action bar; max 3 active quests; daily quests reset at midnight; progress saved in SQLite.”
Generate this with Codexe