Developer Tiered Integration - Atlasroar/WandererZ GitHub Wiki
Tiered Integration — Methodology
This page documents why and how Globox1997/tiered was merged directly into WandererZ in v2.1.0, following the same playbook as the JobsAddon and RpgDifficulty merges.
Why this was different from the previous two merges
Tiered is a standalone item-tiering/anvil-reforging mod, but unlike RpgDifficulty it was built as an optional addon for the original LevelZ mod specifically — it shipped a modCompileOnly 'maven.modrinth:levelz:1.4.10' compile dependency and hard import net.levelz.* statements in two files, gated behind FabricLoader.isModLoaded("levelz"). Since Tiered is now bundled in the same jar as WandererZ, this soft dependency became a tautology (always true) rather than a real integration point, so it needed targeted find-and-replace rather than a net-new compat mixin.
Both mods also:
- target the same Minecraft version (1.20.1) and Yarn mappings
- use fully disjoint Java packages (
net.wandererz.*/net.jobsaddon.*/net.rpgdifficulty.*vsdraylar.tiered.*) — Tiered keeps its upstreamdraylarpackage root unchanged, same convention as the other two merges keeping their own roots - use disjoint resource namespaces (
assets/tiered,data/tiered), aside from small additive contributions to the sharedassets/emiandassets/legendarytooltipscompat namespaces
Step-by-step methodology
- Inventory the tree. Cloned Tiered's
1.20branch — by far the largest of the three merged addons (~55 Java files, ~150 JSON item-attribute data files, its own anvil/reforge GUI, and custom packet networking). Grepped for everylevelz-related reference (17 matches across 8 files) to scope the compat rewrite. - Copy source wholesale, keeping
draylar.tieredas the package name, and copy all resources (assets/tiered,assets/emi/tag/exclusions/tiered.json,assets/legendarytooltips,data/tiered,tiered.mixins.json). - Rewrite the LevelZ compat points (the one thing structurally different from JobsAddon/RpgDifficulty):
Tiered.isLevelZLoaded→Tiered.isWandererzLoaded, checkingFabricLoader.isModLoaded("wandererz")instead of"levelz".TieredMixinPlugin— theFabricLoader.isModLoaded("levelz")guard controlling whetherSkillInfoScreenMixinapplies was updated to check"wandererz". The unrelatedisModLoaded("easyanvils")guard forModAnvilScreenMixinwas left untouched (genuinely optional third-party compat).SkillInfoScreenMixin—net.levelz.screen.SkillInfoScreenimport (and the mixin's string-based method descriptor) repointed tonet.wandererz.screen.SkillInfoScreen, the actual class at that path post-rename.ModifierUtils—net.levelz.access.PlayerStatsManagerAccess/net.levelz.stats.Skillimports repointed tonet.wandererz.*.TieredConfig.levelzReforgeModifier(a brand-new config field being introduced by this merge, not a previously-shipped one) was renamed towandererzReforgeModifierfor branding consistency, along with its lang keys across all 5 shipped translations.- Dropped the now-unnecessary
modCompileOnly 'maven.modrinth:levelz:1.4.10'Gradle dependency entirely — the code it used to compile against is now in the same source tree.
- Extract the Mod Menu screen. Same single-entrypoint-per-id constraint as the previous two merges. Tiered's standalone
ModMenuIntegration implements ModMenuApiclass was deleted, and WandererZ's combined chooser screen gained a fourth button that opensAutoConfig.getConfigScreen(TieredConfig.class, this). - Merge the manifest.
fabric.mod.json: appended Tiered'smain/cliententrypoints, registeredtiered.mixins.jsonalongside the existing three mixin configs, and addedautotag-conventiontodepends(Tiered's own required, separately-installed dependency — not bundled). Did not carry over Tiered's ownmc-publishblock (belongs to the upstream project, not this fork), matching the precedent from the original rename. - Add Gradle dependencies.
- AutoTag (
com.github.apace100:autotag-api/autotag) — a required, separately-installed dependency (not bundled), published tohttps://maven.willbl.dev/releases(not jitpack, despite the upstream repo also having ajitpack.yml— its actual publish target is willbl.dev). Added that repository URL tobuild.gradle. - Reach Entity Attributes (
com.jamieswhiteshirt:reach-entity-attributes) — bundled via Loom'sinclude(...), matching upstream's approach, so end users don't need to install it separately. - EasyAnvils and TooltipFix — optional
modCompileOnlysoft-compat dependencies, carried over as-is (unrelated third-party mods, gated by their ownisModLoadedchecks). gradle.properties: addedautotag_version=2.0.2+1.20andreach_attributes_version=2.4.0.
- AutoTag (
- Validate.
gradlew compileJavathengradlew buildon JDK 17 — both succeeded, producingwandererz-2.1.0.jar. Verified the jar contains the expecteddraylar/tiered/**classes,data/tiered/**resources, the bundledreach-entity-attributesjar underMETA-INF/jars, and the mergedfabric.mod.json. - Version bump.
mod_versionwent from2.0.0→2.1.0— a MINOR semver bump (additive functionality, no breaking changes).
Gotcha worth calling out: AutoTag's actual Maven host
AutoTag's repo ships a jitpack.yml, which looks like a signal it publishes via jitpack.io — but its build.gradle actually configures Maven publishing directly to https://maven.willbl.dev/releases, and its real release tags (e.g. v2.0.2+1.20) don't resolve on jitpack (400 Bad Request for both the API and implementation artifacts, likely due to jitpack rejecting the + character in version tags during on-demand building). Using the dependency coordinates com.github.apace100:autotag-api:2.0.2+1.20 / com.github.apace100:autotag:2.0.2+1.20 against the maven.willbl.dev/releases repository (not jitpack) resolved correctly.
Things deliberately not changed
- Tiered's item-attribute/reforge data format, tier list (common/uncommon/rare/epic/legendary/unique), NBT keys (
Tiered/Tier), and/tiered tier//tiered untiercommands were left 100% intact. ModAnvilScreenMixin's EasyAnvils compat and theTooltipFixcompat dependency are unrelated third-party integrations and were left untouched.- Non-English Tiered lang files were copied as-is, aside from the mechanical
levelzReforgeModifier→wandererzReforgeModifierkey rename (translated text preserved).
Risk register (resolved)
| Risk | Resolution |
|---|---|
| Mod Menu only showing one config per button slot | Added a fourth button to the existing combined chooser Screen |
net.levelz.* imports no longer resolving |
Repointed to the equivalent net.wandererz.* classes at their actual current paths |
isModLoaded("levelz") becoming a dead/always-false check |
Repointed to "wandererz", now a tautological always-true check (consistent with how the JobsAddon/RpgDifficulty merges handled the same pattern) |
| AutoTag failing to resolve via jitpack | Identified its real publish target (maven.willbl.dev/releases) and added that repository instead |
| Config field name colliding with the "LevelZ" brand | Renamed the brand-new levelzReforgeModifier field to wandererzReforgeModifier (safe since it wasn't a previously-shipped field) |
| Hidden package/mixin-target/resource collisions | Verified none exist via full file-tree and @Mixin target review before copying |