Skip to content

Mango-Minecraft-Project/Pack-Packer

Repository files navigation

Pack-Packer

A universal Minecraft datapack, resource pack and mod builder.

Pack-Packer allows developers to maintain a single source structure and automatically generate:

  • Standalone datapacks
  • Standalone resource packs
  • Forge mods
  • Fabric mods
  • NeoForge mods
  • GitHub Releases

It supports template variables, automatic metadata generation, custom datagen scripts, and multi-loader packaging.


Features

Supported Outputs

Output Description
Datapack Pure Minecraft datapack .zip
Resource Pack Pure Minecraft resource pack .zip
Forge Mod Jar containing datapack/resourcepack
Fabric Mod Jar with generated fabric.mod.json
NeoForge Mod Jar with generated metadata
GitHub Release Automatic artifact publishing

Project Structure

A Pack-Packer project uses the following layout:


.
├── pack.yml

├── src/
│   ├── data/
│   │   ├── pack.mcmeta
│   │   └── data/
│   │       └── <namespace>/
│   │
│   ├── assets/
│   │   ├── pack.mcmeta
│   │   └── assets/
│   │       └── <namespace>/
│   │
│   ├── common/
│   │   ├── icon.png
│   │   ├── LICENSE
│   │   ├── README.md
│   │   └── CHANGELOG.md
│   │
│   └── generated/
│
├── template/
│   ├── forge/
│   ├── fabric/
│   └── neoforge/
│
├── scripts/
│   └── datagen/
│       ├── recipes.js
│       └── tags.js
│
├── dist/
│
└── package.json


Installation

Requirements

  • Node.js 20+
  • pnpm

Install dependencies:

pnpm install

Build

Run:

pnpm run build

Generated files:

dist/
├── <id>-<version>-datapack.zip
├── <id>-<version>-resourcepack.zip
├── <id>-<version>-forge.jar
├── <id>-<version>-fabric.jar
└── <id>-<version>-neoforge.jar

Configuration

Pack-Packer uses pack.yml.

Example:

id: better_ores
name: Better Ores
version: 1.0.0

description: |
  A Minecraft datapack and resource pack
  that improves ore generation.

license: MIT

authors:
  - MangoJellyPudding

contributors:
  - name: Alex
    contact:
      homepage: https://example.com
      github: alex

minecraft:
  version: 1.21.1

  pack_format:
    data: 48
    assets: 34


loaders:

  forge:
    enabled: true
    version: 51.0.0

  fabric:
    enabled: true
    version: 0.16.0

  neoforge:
    enabled: true
    version: 21.1.0

build:
  datapack: auto
  resourcepack: auto

  standalone:
    datapack: true
    resourcepack: true

  mod: true

datagen:
  enabled: true
  output: src/generated

release:
  enabled: true
  draft: false
  prerelease: false

Template System

Templates are stored in:

template/
├── forge/
├── fabric/
└── neoforge/

Files inside templates support variables:

Example:

fabric.mod.json

{
  "id": "${mod_id}",
  "version": "${version}",
  "name": "${mod_name}"
}

During build:

${mod_id}

will become:

"better_ores"

Variables

Variables come from:

  1. Built-in variables
  2. variables section in pack.yml

Example:

variables:

  display_url:
    https://github.com/example/project

  issue_tracker_url:
    https://github.com/example/project/issues

Use:

{
  "homepage": "${display_url}"
}

Template Special Cases

fabric.mod.json

fabric.mod.json requires valid JSON.

Pack-Packer automatically handles:

Description

Input:

description: |
  Line one
  Line two

Output:

{
  "description":
  "Line one\nLine two\n"
}

Authors

Fabric supports:

[
  "Author",
  {
    "name": "Developer",
    "contact": {
      "github": "user"
    }
  }
]

Use:

authors:

  - MangoJellyPudding


contributors:

  - name: Alex
    contact:
      github: alex

The builder converts them automatically.


Datagen

Datagen allows generating files through JavaScript.

Location:

scripts/datagen/

Example:

scripts/datagen/test.js
import { Datagen } from "../datagen.js";


Datagen.data(
  "better_ores",
  "recipe/test.json",
  {
    type: "minecraft:crafting_shaped"
  }
);

Generated:

src/generated/
└── data/
    └── data/
        └── better_ores/
            └── recipe/
                └── test.json

Datagen API

Initialize

Automatically initialized by build.


Generate Any File

Datagen.gen(
  "path/file",
  content
);

Supports:

  • JSON
  • Text
  • mcfunction
  • TOML
  • Properties
  • Custom formats

Example:

Datagen.gen(
  "data/example/functions/load.mcfunction",
  "say hello"
);

Datapack File

Datagen.data(
  namespace,
  file,
  content
);

Example:

Datagen.data(
  "example",
  "loot_table/test.json",
  {}
);

Output:

generated/data/data/example/loot_table/test.json

Resource Pack File

Datagen.assets(
  namespace,
  file,
  content
);

Example:

Datagen.assets(
  "example",
  "models/item/test.json",
  {}
);

Output:

generated/assets/assets/example/models/item/test.json

Namespace Shortcut

Instead of:

Datagen.data(
  "example",
  "recipe/test.json",
  {}
);

Use:

const example =
  Datagen.namespace("example");


example.data(
  "recipe/test.json",
  {}
);

GitHub Release

Pack-Packer supports automatic releases.

Workflow:

commit
  |
tag
  |
GitHub Actions
  |
build
  |
release

Create release tag:

git add .

git commit -m "release: v1.0.0"
git tag -a v1.0.0 -m "Version 1.0.0"

git push origin main
git push origin v1.0.0

GitHub Actions will create:

Release v1.0.0

Assets:

better_ores-1.0.0-datapack.zip
better_ores-1.0.0-resourcepack.zip
better_ores-1.0.0-forge.jar
better_ores-1.0.0-fabric.jar
better_ores-1.0.0-neoforge.jar

Creating a New Project

Using GitHub Template:

  1. Open the Pack-Packer repository
  2. Click:
Use this template
  1. Create a new repository
  2. Clone:
git clone <repository>
  1. Edit:
pack.yml
  1. Add content:
src/data/
src/assets/
  1. Build:
npm run build

.gitignore

Recommended:

node_modules/
dist/
src/generated/
*.log
.DS_Store
.idea/
.vscode/

License

GNU General Public License v3.0

About

No description, website, or topics provided.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors