Skip to content

FabLrc/Border-Quest

Repository files navigation

Border Quest

Modrinth Version Modrinth Downloads Modrinth Game Versions

A server-side Fabric mod for Minecraft 26.1.2 that turns your world border into a cooperative progression challenge. Players collect resources, donate them to altars, and unlock an ever-growing world — stage by stage.


Features

Feature Description
Progressive world border Starts small and expands as players complete stages
Altar system Donate items by right-clicking any altar block
Stage rewards Give items, potion effects or XP to all players on stage completion
Dimension locks Nether & End are gated behind configurable stages
Donation leaderboard /bq ladder shows the top contributors
Altar particles Visual END_ROD particle effect on every altar
Chat announcements Server-wide broadcast on large donations
HUD sidebar Tab-list header displays current objective
Map integrations BlueMap, Dynmap, JourneyMap, Xaero's Minimap & World Map
Discord webhook Sends a message on every stage completion
Recipe locking Lock specific item recipes behind configurable stages
Web dashboard Embedded HTTP server with live dashboard and admin panel on configurable port (default 8123)
Translation system All messages are translatable via JSON language files (en_us, fr_fr, etc.). Language is set in config
Fully configurable All stages, radii and behaviour tunable via JSON

Requirements

| Dependency | Version | Required? | |---|---|---|---| | Minecraft | 26.1.2 | ✅ | | Fabric Loader | ≥ 0.19 | ✅ | | Fabric API | any | ✅ | | Dynmap (Fabric) | any | Optional | | JourneyMap | any | Optional (singleplayer / LAN) | | Xaero's Minimap | any | Optional (singleplayer / LAN) | | Xaero's World Map | any | Optional (singleplayer / LAN) |

Server-side only. Clients do not need to install this mod.


Installation

  1. Drop border-quest-<version>.jar into your server's mods/ folder alongside Fabric API.
  2. Start the server once — config/borderquest.json is generated automatically.
  3. Edit the config to suit your server, then run /bq reload.

Commands

All commands start with /bq (alias available via any registered alias).

Player commands

Command Description
/bq or /bq status Show current stage, objective and progress
/bq submit Donate all eligible items from your inventory
/bq ladder Show the top 10 donors

Operator commands (permission level 2)

Command Description
/bq setaltar Register the block you are looking at as an altar
/bq setaltar <name> Same, but assigns a display name (shown on maps)
/bq removealtar Remove the looked-at block from the altar list
/bq skip Force-advance to the next stage without filling the objective
/bq reset Reset the game to stage 1
/bq reload Reload borderquest.json and the saved state without restarting

To donate, right-click any altar block while holding items. /bq submit works from anywhere and scans your entire inventory.


Configuration

File location: config/borderquest.json

{
  // General -------------------------------------------------------------------

  // Language of the mod messages (en_us, fr_fr, etc.). Must match a file in
  // the mod JAR at assets/borderquest/lang/<language>.json
  "language": "en_us",

  // Duration of the celebration fireworks on stage completion (ticks, 20 = 1s)
  "celebrationDurationTicks": 200,

  // Damage per second while a player is outside the border
  "borderDamagePerBlock": 0.2,

  // Distance (blocks) at which the border warning is shown
  "borderWarningBlocks": 5,

  // Nether coordinate scale factor (Nether border = Overworld radius / netherScale)
  "netherScale": 8.0,

  // Altar particles -----------------------------------------------------------

  "altarParticlesEnabled": true,
  // How often particles spawn, in ticks (20 = once per second)
  "altarParticlePeriodTicks": 20,

  // Donation announcements ----------------------------------------------------

  // Broadcast a message to all players when a single donation reaches this count
  "donationAnnouncementsEnabled": true,
  "donationAnnounceMinItems": 16,

  // Dimension locks -----------------------------------------------------------

  // Prevent players from entering a dimension until the required stage is reached
  "worldLocks": [
    { "worldId": "minecraft:the_nether", "requiredStage": 5 },
    { "worldId": "minecraft:the_end",    "requiredStage": 7 }
  ],

  // Discord webhook -----------------------------------------------------------

  "discordEnabled": false,
  "discordWebhookUrl": "https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN",
  "discordUsername": "Border Quest",
  "discordAvatarUrl": "",   // Leave empty to use the default webhook avatar

  // Stages --------------------------------------------------------------------

  "stages": [
    {
      "borderRadius": 10,
      "title": "Clear the area",
      // Fixed items required
      "requirements": [
        { "itemId": "minecraft:cobblestone", "count": 64 }
      ],
      // Biome-resolved categories (the mod picks the right log type automatically)
      "categoryRequirements": [
        { "category": "logs", "count": 64 }
      ],
      // Rewards distributed to ALL online players on completion
      "rewards": []
    },
    {
      "borderRadius": 25,
      "title": "First steps toward civilisation",
      "requirements": [
        { "itemId": "minecraft:iron_ingot", "count": 32 },
        { "itemId": "minecraft:bread",      "count": 32 }
      ],
      "categoryRequirements": [],
      // Recipes unlocked when reaching this stage
      "unlockRecipes": [
        "minecraft:iron_pickaxe",
        "minecraft:iron_axe",
        "minecraft:iron_sword",
        "minecraft:shield"
      ],
      "rewards": [
        // Give 3 bread to every online player
        { "type": "item",   "itemId": "minecraft:bread", "count": 3 },
        // Apply Haste I for 30 s
        { "type": "effect", "effectId": "minecraft:haste", "duration": 600, "amplifier": 0 },
        // Give 50 XP points
        { "type": "xp", "amount": 50 }
      ]
    }
    // ... add as many stages as you like
    // The LAST stage represents total freedom (use borderRadius: 29999984)
  ]
}

Stage anatomy

Field Type Description
borderRadius double Half the side length of the square border (diameter = radius × 2)
title string Displayed in chat and the tab-list sidebar
requirements list Specific items required — itemId + count
categoryRequirements list Biome-adaptive requirements — category + count
unlockRecipes list Item IDs whose crafting recipes become unlocked at this stage (see Recipe locking)
rewards list Rewards given to all online players on stage validation

Built-in categories: logs, planks, wool, sand, stone — resolved to the most common variants found in the spawn biome.

Reward types

type Required fields Example
"item" itemId, count { "type": "item", "itemId": "minecraft:diamond", "count": 2 }
"effect" effectId, duration (ticks), amplifier (0 = level I) { "type": "effect", "effectId": "minecraft:speed", "duration": 400, "amplifier": 1 }
"xp" amount { "type": "xp", "amount": 100 }

Altar setup

Altars can be any block — a beacon, a chest, a custom banner — whatever fits your server's theme.

  1. Place the block in-world.
  2. Look at it and run /bq setaltar (optionally /bq setaltar Altar du Spawn).
  3. Players can now right-click the block to donate items.

To remove an altar: look at it and run /bq removealtar.

Altar positions are saved in world/data/borderquest_state.json and survive restarts.


Map integrations

BlueMap (temporarily unavailable)

BlueMap n'a pas encore publié de version compatible Minecraft 26.1. Réactiver dès qu'une version sera disponible :

  1. Décommenter la dépendance compileOnly "de.bluecolored:bluemap-api:<version>" dans build.gradle
  2. Décommenter le contenu de BlueMapHook.java
  3. Recompiler

Le mod affichera automatiquement :

  • Un rectangle vert sur la carte du monde normal indiquant la zone actuelle.
  • Un marqueur POI pour chaque autel (avec son nom).

Dynmap

Requires Dynmap for Fabric installed on the server. Same markers as BlueMap — rendered via reflection, no extra dependency needed.

JourneyMap & Xaero's Minimap / World Map

Singleplayer & LAN only. These mods run client-side and are not available on a dedicated server's classpath.

When running in singleplayer or LAN, if JourneyMap, Xaero's Minimap, or Xaero's World Map is installed:

  • A waypoint is created for each altar when it is registered.
  • The waypoint is removed when the altar is removed.
  • Border shapes are not supported (client-side map limitation).

The integration uses reflection — no additional configuration is needed.


Discord webhook

  1. Create a webhook in your Discord server: Channel Settings → Integrations → Webhooks.
  2. Copy the URL and paste it in borderquest.json:
    "discordEnabled": true,
    "discordWebhookUrl": "https://discord.com/api/webhooks/123456789/abc...",
    "discordUsername": "Border Quest",
    "discordAvatarUrl": ""
  3. Run /bq reload.

A message is sent automatically each time a stage is completed.


Web Dashboard

The mod includes an embedded HTTP server (zero external dependencies) serving a live dashboard and admin panel. Access it at http://<server-ip>:8123 (configurable).

Features

Section Content
Public dashboard Stage progress bar, resource checklist with mini-bars, donation leaderboard, altar list, player count, stage timeline — auto-refreshes every 5 seconds
Admin panel Password-protected: one-click buttons for /bq reload, /bq skip, /bq reset, plus a full JSON config editor with save/reload
Accessibility Full ARIA support, keyboard navigation (skip-to-content, focus trap on modals, Escape to close), screen-reader announcements, light/dark auto theme

Configuration

{
  "dashboard": {
    "enabled": true,         // Set to false to disable the dashboard
    "port": 8123,            // HTTP port (must be free)
    "bindAddress": "127.0.0.1",  // "0.0.0.0" to expose on the network (use with caution)
    "password": "WmXd2E2Dpo29"   // Auto-generated on first launch, modifiable
  }
}

Security: The admin password is randomly generated on first launch and printed once in the server console. Bind to 127.0.0.1 unless you need remote access — if exposed, place it behind a reverse proxy with HTTPS.

Admin password

  • First launch: A random 12-character password is generated, printed once in the server log, and persisted in config/borderquest.json.
  • Change it: Edit the password field in the config file and run /bq reload.
  • Reset it: Delete the password field from the config and reload — a new one will be generated.

Dimension locks

By default:

  • The Nether is locked until stage 5.
  • The End is locked until stage 7.

Attempting to enter a locked dimension cancels the teleport and displays a red message. Customise or remove locks in borderquest.json under worldLocks.


Recipe locking

Lock certain item recipes behind stages. When a recipe is locked, the crafting result slot stays empty (crafting table, player inventory 2x2, furnace) and the recipe book auto-craft is blocked.

Server-side limitation. Since this mod runs only on the server, locked recipes may still appear in the client's recipe book — but they cannot be crafted.

Add unlockRecipes inside a stage definition:

{
  "borderRadius": 25,
  "title": "Iron Age",
  "requirements": [{ "itemId": "minecraft:iron_ingot", "count": 32 }],
  "unlockRecipes": [
    "minecraft:iron_pickaxe",
    "minecraft:iron_axe",
    "minecraft:iron_sword",
    "minecraft:shield"
  ],
  "rewards": []
}

Recipes are cumulative: at stage N, all recipes from stages 0 through N are unlocked. Items not listed in any unlockRecipes are always craftable (backward compatible).


Saved state

The game state (current stage, submitted items, altar list, donor stats) is saved in:

<world>/data/borderquest_state.json

Back up this file if you want to preserve progress between map resets.


Building from source

git clone <repo>
cd border-quest-mod
# macOS / Linux :
java -jar gradle/wrapper/gradle-wrapper.jar build
# Windows :
gradlew build
# Output: build/libs/border-quest-<mcversion>-<version>.jar

Requirements: Java 25, internet access (to download Fabric Loom and dependencies).

Override the mod version for testing:

java -jar gradle/wrapper/gradle-wrapper.jar build -Pmod_version=1.1.0

This project uses separate branches per Minecraft version:

  • develop — main development branch (no releases)
  • 1.21.11 — stable releases for Minecraft 1.21.11
  • 1.22, etc. — future Minecraft version support

Releases are triggered by git tags on a version branch:

git checkout 1.21.11
git tag v1.1.0
git push origin v1.1.0

This builds, creates a GitHub Release, and publishes to Modrinth automatically.

Dependencies at a glance:

Artifact Scope Purpose
net.fabricmc.fabric-api implementation Fabric API
Dynmap, JourneyMap, Xaero's none Integrated via reflection — no compile dependency

License

MIT — see LICENSE.

About

A Minecraft Fabric mod that shrinks the size of the world. Players must complete objectives to gradually expand it. Fully customizable.

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors