Skip to main content
The Quest Codex Extension provides a fully customizable GUI system for players to browse, track, and manage quests organized by hierarchical categories. Every menu is built through declarative layout pools powered by the GUI Extension — no hardcoded menus, infinite customization.

Source Code

View source on GitHub.

Download Releases

Get the latest JARs.

Features

Hierarchical Categories

Nest categories with parent/child relationships. Sub-categories inherit visibility from their parent.

Layout Pools

Design every menu through declarative layout pools. Placeholders (SORT_SLOT, CATEGORY_SLOT, QUEST_SLOT) are automatically injected.

Dynamic Sort

Cycle through All → Not Started → Active → Completed with per-mode button display (label, lore, custom item).

Quest Tracking

Track active quests with priority indicators via QuestExtension’s native tracking system.

Complete Sound Design

Configure sounds for menu open, click, scroll, and quest track/untrack events.

BlueMap Integration

Display quest icons on BlueMap with dynamic labels and visibility rules (BTC version).

Architecture

Entry Library

Configuration

Quest Codex Config

Global sounds, default rows, and message templates.

Category System

Quest Category

Define a category with title, icon, parent, and visibility criteria.

Quest Assignment

Link quest entries to a category with ordering and per-status overrides.

Category Menu

Design menus with declarative layout pools, placeholder slots, and per-mode sort buttons.

Quest Lore

Override lore lines per quest and per status.

Quick Start

1. Add Global Config (Optional)

Create a Quest Codex Config entry in a page JSON to customize sounds and messages. The extension works out of the box without this — it uses sensible defaults.
{
  "type": "quest_codex",
  "id": "my_codex_config",
  "defaultRows": 5,
  "nowTrackingMessage": "<green>Now tracking: {quest}</green>"
}
Place this in any compiled page under plugins/Typewriter/pages/.→ Quest Codex Config

2. Define Categories

Add a Quest Category entry. This defines a logical group of quests in the codex with its display title, icon, and optional parent for nesting.Key fields:
  • category — Unique internal name (e.g., main_quests)
  • title — Display title shown to players (MiniMessage)
  • icon — Item shown in parent/category list
  • parent — Leave empty for top-level, or set to nest
→ Quest Category

3. Assign Quests

Add a Quest Assignment entry to link your QuestExtension quests to a category. Control ordering and per-status overrides.
{
  "type": "quest_assignment",
  "id": "assign_main",
  "category": "main_quests",
  "questRefs": ["quest:quest_main_1", "quest:quest_main_2"],
  "orders": [0, 1]
}
→ Quest Assignment

4. Design Menus

Add a Category Menu entry for each category you want a custom GUI for. Use the layout pool to place:
  • CATEGORY_SLOT — Auto-injected category icons (main menu)
  • QUEST_SLOT — Auto-injected quest buttons (category menu)
  • SORT_SLOT — Auto-injected dynamic sort button
  • Standard GUI items — Decorative items, fills, static buttons
The layout pool uses the CUSTOM guiType. Everything is positional: place items at (x, y) coordinates.→ Category Menu

5. Open the Menu

Access the codex via command (opens a specific category):
/tw codex <category>
Examples:
  • /tw codex main_quests — Opens the main quests category
  • /tw codex daily_tasks — Opens daily tasks
Main menu: Create an open_gui entry with a layout pool linking to your categories to serve as the main hub. The codex integrates with the GUI Extension’s demo hub system.

Commands

CommandPermissionDescription
/tw codex <category>typewriter.codex.openOpen a specific quest category directly. Tab-completion available.

Placeholders

Prefix: %typewriter_*%
PlaceholderReturnsExample
%typewriter_total_quests%Total quest count across all categories42
%typewriter_total_completed%Total completed quests15
%typewriter_total_in_progress%Total in-progress quests5
%typewriter_total_not_started%Total not-started quests22
%typewriter_total_progress%Completed/Total formatted15/42
Replace <name> with the category identifier (e.g., main_quests).
PlaceholderReturnsExample
%typewriter_category_<name>%Total quests in category10
%typewriter_category_<name>_completed%Completed in category3
%typewriter_category_<name>_in_progress%In progress in category2
%typewriter_category_<name>_not_started%Not started in category5
%typewriter_category_<name>_progress%Progress formatted3/10
Aliases: _inprogress% and _notstarted% also work.
VariableContextReplaced With
{quest}Message templatesThe quest’s display name
{completed}Progress messagesNumber of completed quests
{total}Progress messagesTotal quests in the category

Dependencies

ExtensionRequiredUsage
QuestExtensionRequiredCore quest engine.
GUI ExtensionRequiredMenu rendering and layout pool system.
PlaceholderAPIOptionalFor @Placeholder fields.