๐Ÿ“œ Villager Trade Ledger โšก Multi-Loader Template

Better Lib ยท JsonVillagerLoader

Load professions from JSON, not Java trade chains.

The Villager Trade Ledger writes files that Better Lib can load. Nothing is uploaded โ€” the tool runs in your browser.

26.1+

Modern loader

Package: com.reggarf.mods.better_lib.villager.json

public static final SimpleVillagerLib VILLAGERS = new SimpleVillagerLib(YourMod.MODID);

JsonVillagerLoader.loadAll(VILLAGERS, YourMod.class, "/data/your_modid/villagers");
VILLAGERS.register();

Save JSON as src/main/resources/data/your_modid/villagers/<name>.json. POI id is your_modid:profession_name (no _poi suffix).

1.21.1 โ€“ 1.21.11

Legacy loader

Package: com.reggarf.mods.better_lib.villagers

VILLAGERS.loadJsonProfessions(YourMod.class, "/data/your_modid/villagers");
VILLAGERS.register();

POI id uses your_modid:profession_name_poi. Add it to data/minecraft/tags/point_of_interest_type/acquirable_job_site.json.

Format

Profession JSON

{
  "name": "andesite_worker",
  "workstation": "minecraft:smooth_stone",
  "max_villagers": 1,
  "search_range": 1,
  "work_sound": "minecraft:entity.villager.work_armorer",
  "enabled": true,
  "trades": {
    "1": [
      {
        "cost": { "item": "minecraft:emerald", "count": 9 },
        "cost2": { "item": "minecraft:cobblestone", "count": 6 },
        "result": { "item": "minecraft:iron_ingot", "count": 2 },
        "max_trades": 5,
        "xp": 3,
        "price_multiplier": 0.07
      }
    ]
  }
}

Scaffolding ยท Gradle Multi-Project

Multi-Loader & Multi-Version Modding

Modular multi-loader workspace structured identically to Reggarf Multi-Dev (e.g. Create_Easy_Villagers). Combines a shared common module with dedicated subprojects per loader and Minecraft version (e.g. neoforge-1.21.1, forge-1.20.1).

Architecture

Common & ServiceLoader

The common subproject holds all platform-independent registry logic, recipes, and block/item models.

// In common: com/example/mod/platform/Services.java
public static final IPlatformHelper PLATFORM =
    ServiceLoader.load(IPlatformHelper.class)
        .findFirst()
        .orElseThrow();

// Use anywhere in Common:
if (Services.PLATFORM.isDevelopmentEnvironment()) {
    Constants.LOG.info("In Dev Environment");
}

Multi-Version Synchronization

Multi-Dev Workflow

Every targeted loader and version gets its own dedicated subproject:

# Launch NeoForge 1.21.1 dev client:
./gradlew neoforge-1.21.1:runClient

# Launch Forge 1.20.1 dev client:
./gradlew forge-1.20.1:runClient

# Launch Fabric dev client:
./gradlew fabric-1.21.1:runClient

# Build all mod JARs at once:
./gradlew build

Project Structure

Generated Directory Layout

your_mod/
โ”œโ”€โ”€ build.gradle               # Root build script & shared repositories
โ”œโ”€โ”€ settings.gradle            # Includes: common, neoforge-1.21.1, forge-1.20.1, etc.
โ”œโ”€โ”€ gradle.properties          # Common & per-subproject configuration
โ”œโ”€โ”€ common/                    # Shared resources (assets, lang/en_us.json, pack.mcmeta)
โ”œโ”€โ”€ neoforge-1.21.1/           # NeoForge 1.21.1 subproject (net.neoforged.moddev)
โ”œโ”€โ”€ forge-1.20.1/              # Forge 1.20.1 subproject (Loom / ForgeGradle)
โ””โ”€โ”€ fabric-1.21.1/             # Fabric 1.21.1 subproject (Loom)
*

IDE Import Tip

When opening the extracted project in IntelliJ IDEA or VS Code, ensure your Project SDK matches your primary Minecraft version (e.g. Java 21 for 1.20.5+ / 1.21+, or Java 17 for 1.18โ€“1.20.4). Allow Gradle to complete its initial sync so that Loom and ModDev source sets are fully indexed.