Repository navigation
Developer JobsAddon Integration
Atlasroar edited this page Oct 3, 2026
·
2 revisions
This page documents why and how Globox1997/JobsAddon was merged directly into WandererZ in v1.5.0, as a reference for future similar merges and for anyone auditing the change.
Implementing PRs: #1 — Integrate JobsAddon directly into WandererZ, #2 — Add 1.5.0 changelog and issue templates.
JobsAddon was already built as a genuine Fabric addon to WandererZ — its source directly imported WandererZ's public API (net.wandererz.init.ConfigInit, net.wandererz.access.PlayerSyncAccess) and both mods:
- target the same Minecraft version (1.20.1) and Yarn mappings (
1.20.1+build.10) - are authored by the same person (Globox_Z)
- use fully disjoint Java packages (
net.wandererz.*vsnet.jobsaddon.*) - use disjoint resource/data namespaces (
assets/wandererz,data/wandererzvsassets/jobsaddon,data/jobsaddon)
This one-directional dependency (Jobs → WandererZ, never the reverse) meant there was no circular-dependency problem to solve — only packaging and loader-identity concerns.
-
Inventory both trees. Cloned JobsAddon's
1.20branch and diffed its full file list (Java classes, mixins, assets, data) against WandererZ's to rule out any class name collisions, resource namespace collisions, or advancement/criteria id collisions. None were found; even duplicate class names (ConfigInit,EventInit, etc.) live safely in separate packages. -
Copy source wholesale, keeping
net.jobsaddonas the package name (no renaming), to keep the diff reviewable and preserve JobsAddon's own git history/blame if ever needed for reference. -
Fix the one id-sensitive runtime call.
EventInit.javacalledFabricLoader.getInstance().getModContainer("jobsaddon")in 8 places to register built-in compat resource packs viaResourceManagerHelper.registerBuiltinResourcePack. Since mod ids (unlike resource namespaces) are real registered identities, and the merged jar now only declares thewandererzid, all 8 call sites were updated togetModContainer("wandererz"). Missing this would throwNoSuchElementExceptionat runtime for any player with a detected compat mod installed. -
Resolve the Mod Menu single-entrypoint conflict. Mod Menu keys its config-screen-factory map by mod id. Two separate
ModMenuApiimplementations can't both be registered productively under one id — only the last-registered would be reachable. The fix was a small combinednet.wandererz.config.ModMenuIntegrationthat opens a custom vanillaScreenwith two buttons, each openingAutoConfig.getConfigScreen(...)forWandererzConfigorJobsAddonConfigrespectively. This preserves both configs/JSON files unmodified — no config schema merging was needed. -
Merge the manifest.
fabric.mod.json: appended JobsAddon'smain/cliententrypoints (additive arrays — safe), registeredjobsaddon.mixins.jsonalongsidewandererz.mixins.json, updated the description. Leftdependsuntouched (no self-dependency onwandererzto remove was actually present after copy, verified by direct inspection). -
Reconcile build configuration.
-
gradle.properties: took the newer of each differing version (loader_version,fabric_version,cloth_config_version) on the assumption that newer Fabric/Loom-ecosystem versions are backward compatible — verified afterward by a fullgradlew build. -
build.gradle: addedmodCompileOnlyentries for JobsAddon's optional compat dependencies (Numismatic Overhaul, Farmer's Delight, FallingTree, Harvest Scythes) so its conditionally-compiled mixins resolve at compile time.treechopwas already present in WandererZ'sbuild.gradleat a compatible version/API, so it was left untouched rather than adding a duplicate/conflicting entry. -
libz(the shared tab-registry dependency both mods already used) was bumped to the version JobsAddon required.
-
-
Validate.
gradlew compileJavathengradlew buildon JDK 17 (the project's--release 17target) — both succeeded, producinglevelz-1.5.0.jar(the project's name at the time) with no additional source changes required beyond the two fixes above. See Build & Release. -
Version bump.
mod_versionwent from1.4.13→1.5.0— a MINOR semver bump, since the merge is purely additive (new functionality, same save/data format, same public API surface plus new APIs) and introduces no breaking changes for existing worlds, configs, or API consumers.
- JobsAddon's own job-XP/job-level formulas, NBT keys, and network packet identifiers were left 100% intact — this is a packaging merge, not a gameplay rewrite.
- The
CookingPotResultSlotMixinfile exists in the source tree but, matching upstream JobsAddon behavior, is intentionally not listed injobsaddon.mixins.json'smixinsarray. - Non-English JobsAddon lang files (
pt_br,zh_cn) were copied as-is; only the 3 new Mod Menu chooser-screen strings were added to WandererZ'sen_us.json(other WandererZ locales fall back to English for those 3 keys).
| Risk | Resolution |
|---|---|
getModContainer("jobsaddon") throwing post-merge |
Changed to "wandererz" (8 call sites) |
| Mod Menu only showing one mod's config | Combined chooser Screen
|
Version skew between the two gradle.properties
|
Adopted newer values; validated via full build |
| Hidden package/resource collisions | Verified none exist via full file-tree diff before copying |
Player Guide
- Overview
- Getting Started
- Levels & Skills
- Jobs
- RPG Difficulty
- Tiered
- Party
- Food Spoilage
- Configuration
- Compatibility
- FAQ
Developer Guide