Skip to content

DC-128 + DC-129: client modpack scaffolds (Java .mrpack + Bedrock .mcpack) - #6

Merged
nicoechaniz merged 2 commits into
nicoechaniz:mainfrom
Fede654:feat/dc-128-129-client-packs
May 3, 2026
Merged

DC-128 + DC-129: client modpack scaffolds (Java .mrpack + Bedrock .mcpack)#6
nicoechaniz merged 2 commits into
nicoechaniz:mainfrom
Fede654:feat/dc-128-129-client-packs

Conversation

@Fede654

@Fede654 Fede654 commented May 3, 2026

Copy link
Copy Markdown
Contributor

Implements DC-128 (Java .mrpack) and DC-129 (Bedrock .mcpack) from the DC-124 epic. Independent of PRs #3/#4/#5 — this PR only adds new files under `client/` and `scripts/`, no overlap with their diffs.

Both packs are intentionally minimum-viable: they confirm the install / delivery path works end-to-end. Texture overrides (Bedrock) and a custom UI pack (Java) need designed assets and land in follow-ups.

DC-128 — Java client `.mrpack`

  • `client/mrpack/manifest.toml` pins 11 mods + 3 resource packs to specific Modrinth version IDs. Bumping a version is one-line.
  • `scripts/build-mrpack.sh` resolves the manifest into `modrinth.index.json` (per-file `path`/`hashes`/`downloads`/`fileSize`), pulling URLs and checksums fresh from the Modrinth API on every build, and zips into `dist/daemoncraft-.mrpack`.
  • Fabric-loader pinned automatically to current stable via the Fabric meta API.
  • README covers install path, the "shaders are NOT included" policy (school laptops choke at 12 fps), and the version-bump procedure.

Two known gaps from the original task list:

  • Particular only ships 1.21.1 builds on Modrinth as of 2026-05-03. Dropped from required; re-add when 1.21.11 lands.
  • Custom UI pack slot is documented but empty until project branding artwork lands.

DC-129 — Bedrock client `.mcpack`

  • `client/mcpack/manifest.json` (`format_version: 2`) with stable header + module UUIDs and `min_engine_version: [1, 21, 0]` (covers all 1.21.x Bedrock clients).
  • `texts/en_US.lang` + `languages.json` carry pack name and description.
  • `pack_icon.png` — 256×256 brand-colour placeholder, generated procedurally via stdlib (no PIL dep). Replace with real art before public release.
  • `scripts/build-mcpack.sh` zips into `dist/daemoncraft-bedrock-.mcpack`, excludes README.md so Bedrock doesn't see junk, refuses to ship if pack exceeds the 10 MB Geyser join-timeout budget.

Test plan

  • `scripts/build-mrpack.sh` — builds 14-file `.mrpack` (4 KB header zip; mods download lazily on Modrinth App import).
  • `scripts/build-mcpack.sh` — builds 7-file `.mcpack` (4 KB).
  • Both manifests parse cleanly; UUIDs unique; format versions current.
  • Reviewer: import the `.mrpack` into Modrinth App and verify it launches into Minecraft 1.21.11 with the resource packs auto-enabled.
  • Reviewer: drop the `.mcpack` into `server/geyser/packs/` and verify a Bedrock client picks it up on join.

🤖 Generated with Claude Code

…k .mcpack

Two parallel client-install pipelines, kept in one PR because they share
the client/ + scripts/ + dist/ shape.

DC-128 — Java .mrpack:
- client/mrpack/manifest.toml pins 11 mods + 3 resource packs to specific
  Modrinth version IDs. Bumping is one-line; nothing is cached locally so
  every build pulls fresh URLs and checksums from the Modrinth API.
- scripts/build-mrpack.sh resolves manifest → modrinth.index.json (with
  per-file path / hashes / downloads / fileSize) and zips into
  dist/daemoncraft-<version>.mrpack. First build: 14 files, valid
  formatVersion: 1, fabric-loader auto-resolved to current stable via
  the Fabric meta API.
- README covers install path, what's bundled, the "shaders are NOT
  included" policy, version-bump procedure.

DC-129 — Bedrock .mcpack:
- client/mcpack/manifest.json (format_version: 2) with stable header +
  module UUIDs and min_engine_version: [1, 21, 0] (covers all 1.21.x
  Bedrock clients).
- texts/en_US.lang + languages.json carry pack name and description.
- pack_icon.png — 256×256 brand-colour placeholder (569 bytes), generated
  procedurally via stdlib (struct + zlib + crc32). Replace with real art
  before public release.
- scripts/build-mcpack.sh zips into dist/daemoncraft-bedrock-<version>
  .mcpack, excludes README.md so Bedrock doesn't see junk in the archive,
  refuses to ship if pack exceeds the 10 MB Geyser join-timeout budget.

Both packs are intentionally minimum-viable: they confirm the install /
delivery path works end-to-end. Texture overrides (Bedrock) and a
custom UI pack (Java) need designed assets and land separately.

dist/ added to .gitignore — built artifacts, not source.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@nicoechaniz

Copy link
Copy Markdown
Owner

Review — DC-128 + DC-129 client modpack scaffolds

Clean MVP. Two minor notes.


Note — Particular mod deferred

README correctly documents that particular is dropped because Modrinth only has 1.21.1 builds as of 2026-05-03. Please add a lattice task or TODO comment in manifest.toml so it is not forgotten when a 1.21.11 build ships.


Note — build script network dependency

scripts/build-mrpack.sh resolves URLs and checksums live from the Modrinth API on every build. This is correct (no stale caches), but it means the build is not fully reproducible offline and is sensitive to API rate limits. The 30-second timeout is reasonable. Consider documenting the offline-workaround (pre-populate client/mrpack/overrides/mods/) in the README for developers with limited connectivity.


Nits

  • build-mcpack.sh size check (> 10 MB warning) is a good guardrail.
  • Procedurally-generated pack_icon.png avoids a PIL dependency. Clever.
  • format_version: 2 and min_engine_version: [1, 21, 0] are current.
  • Shaders-off-by-default policy is well justified for school laptops.

No blockers. LGTM.

Audit follow-up. The build script needs Modrinth API access; reviewer
asked for an offline workaround note for developers with flaky
connections.

Documented:
- The live-API path's network dependency (~15 requests per build, 30 s
  timeout each, ~300 req/min unauthenticated rate limit).
- The overrides/ pre-fetch path: drop jars into overrides/mods/ and
  RPs into overrides/resourcepacks/ to ship them verbatim and skip
  Modrinth App's download step at install time.
- The honest limitation: even with overrides/, modrinth.index.json
  generation still queries the API. True air-gap requires hand-authoring
  the index file.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@Fede654

Fede654 commented May 3, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the review — both notes addressed.

Finding Status Commit
Particular mod deferred TODO present The TODO is already in manifest.toml right where the entry would go: # Note: 'particular' only has 1.21.1 builds on Modrinth as of 2026-05-03. Re-add when a 1.21.11-compatible version ships. Also called out as an Open item in plans/DC-128.md. Will re-add the mod entry as a one-line bump once the upstream build lands.
Build script network dependency Documented 135a93fclient/mrpack/README.md now has an "Offline / air-gapped builds" section. Covers the overrides/ pre-fetch path (drop jars into overrides/mods/ and RPs into overrides/resourcepacks/ to ship verbatim and skip Modrinth-App downloads at install time), and the honest limitation that modrinth.index.json generation still queries the API — true air-gap requires hand-authoring the index. The 30 s timeout and ~15-requests-per-build / ~300-req-min rate-limit numbers are also documented.

LGTM ack noted — ready when you are.

@nicoechaniz

Copy link
Copy Markdown
Owner

Re-review — PR #6 (DC-128 + DC-129 client packs)

Audit follow-up addressed.

  • Offline build path documented — README now covers the overrides/ pre-fetch path and the honest limitation (index generation still needs the API). Good transparency.
  • No other changes needed from the first review.

LGTM.

@nicoechaniz
nicoechaniz merged commit 903f5d2 into nicoechaniz:main May 3, 2026
nicoechaniz added a commit that referenced this pull request May 3, 2026
- PRs #2-#6 merged, 15 plugins active
- WorldEdit wand fix (wooden_axe -> blaze_rod)
- kanban.db corruption resolved
- DC-124/DC-126 epic status corrected in Lattice
- Current state and plugin list updated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants