Server-side Fabric mod for Minecraft 26.1. Single-module Gradle project.
Only gradlew.bat exists (no Unix gradlew). On macOS/Linux use:
java -jar gradle/wrapper/gradle-wrapper.jar build
Requires Java 25.
Output: build/libs/border-quest-<mcversion>-<version>.jar (version from gradle.properties, or override with -Pmod_version=X.Y.Z).
No test, lint, or typecheck commands exist.
CI:
build.ymlruns on all branches/PRs (compile check, no release)release.ymltriggers on tagv*→ builds, creates GitHub Release, publishes to Modrinth
Branches:
develop— main dev branch (no releases)1.21.11— stable branch for Minecraft 1.21.11 releases- Tags created on version branches only (
git tag vX.Y.Zfrom1.21.11)
src/main/java/net/borderquest/ # all mod code (13 core + 5 map + 3 mixin files = 21)
BorderQuest.java # ModInitializer entrypoint
BorderQuestManager.java # core game loop, border, progression
BorderQuestCommand.java # /bq command tree
BorderQuestConfig.java # config/borderquest.json (includes DashboardConfig)
QuestState.java # persisted state (Gson, <world>/data/borderquest_state.json)
StageDefinition.java # stage/reward data model with records, unlockRecipes
BiomeResourceResolver.java # biome → item resolution
SidebarDisplay.java # tab-list HUD
DiscordWebhook.java # async HTTP post
ModTranslations.java # server-side translation loader (Gson, classpath JSON)
TranslationKeys.java # constants for all translation keys (~48)
DashboardServer.java # embedded HTTP dashboard (JDK HttpServer)
DashboardApi.java # dashboard API endpoints (server.execute() + CompletableFuture)
mixin/SpawnProtectionMixin.java # @Overwrite disables vanilla spawn protection (26.1.2)
mixin/PlayerDimensionMixin.java # gates Nether/End per stage
mixin/RecipeLockMixin.java # 4 inner mixins: crafting table, player 2x2, furnace, recipe book
map/ # BlueMap/Dynmap/JourneyMap/Xaero (reflection)
src/main/resources/
fabric.mod.json # id=borderquest, environment=server
assets/borderquest/lang/en_us.json # English translations
assets/borderquest/lang/fr_fr.json # French translations
assets/borderquest/dashboard.html # dashboard web UI (self-contained, dark/light theme)
remappedSrc/ # Loom-generated, do not edit
server/ # actual server runtime
- Server-side only (
"environment": "server"). No client-side code. - BlueMap est désactivé temporairement (pas de version compatible 26.1 disponible). Les autres intégrations cartographiques utilisent la réflexion.
@OverwriteonSpawnProtectionMixinis intentional — disables spawn protection entirely so all players can break blocks in the zone.- Commands use Fabric API's
CommandRegistrationCallback. All start with/bq. - Gson serialization for both config and saved state. Config auto-generated on first server start.
- Recipe locking via
unlockRecipesper stage. Uses 4 inner mixin classes inRecipeLockMixin.javatargetingCraftingMenu,InventoryMenu,AbstractFurnaceBlockEntity, andServerGamePacketListenerImpl(Mojang mappings 26.1.2). - Translation system via
ModTranslations.java+TranslationKeys.java. All user-facing messages useModTranslations.t(TranslationKeys.XXX, args...)returningMutableComponent. Language files are inassets/borderquest/lang/. Config optionlanguagedefaults to"en_us". Fallback chain: configured →en_us→ raw key.ModTranslations.load()is called after config load inSERVER_STARTEDand on/bq reload. - Dashboard via
DashboardServer.java+DashboardApi.javausing JDKHttpServer(zero external deps). All state access usesserver.execute()+CompletableFuturefor thread safety. Config section:dashboardwithenabled,port,bindAddress,password(auto-generated on first launch). Dashboard HTML isassets/borderquest/dashboard.html— self-contained dark/light theme with ARIA accessibility. API endpoints: GET/api/status,/api/leaderboard,/api/altars,/api/stages; POST/api/admin/auth,/api/admin/command,/api/admin/config,/api/admin/config/get(password in body, never in URL). - Update
CHANGELOG.mdwith every user-facing change. Follow the existing format and add a new## [Unreleased]section if none exists.
Minecraft 26.1.2, Fabric Loom 1.16.1, Fabric API 0.148.0+26.1.2, Loader 0.19.2. Java 25 source/target.