Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 31 additions & 16 deletions PIPELINES.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,45 @@ Development builds use `DEV-YYYYMMDD-HHmm`, with the date and time in UTC. The r

Tags with prerelease suffixes create prereleases. Snapshot versions are rejected. An existing release causes the run to fail; use a new version for corrections. The workflow does not deploy to a Minecraft server.

`build.json` records the source commit, repository, tag, workflow run, JAR name, and checksum. Only the publishing job has repository write permission; the build job has read access. For the coordinated Java 21 replacement builds, artifacts were verified locally from exact source-release commits; `run: null` and local build provenance distinguish them from workflow-produced releases. Their dependency hashes record the bootstrap inputs used for cyclic APIs. Draft download/hash inspection still precedes publication; existing release assets are not replaced.
`build.json` records the source commit, repository, tag, workflow run, JAR name,
checksum, and dependency inputs. Locally built releases record their build
method and use `run: null`. Verify draft assets before publication. Release
publication does not deploy a Minecraft server.

TFMC's source migration to **Java 21 / Minecraft 1.21.10** and matching
dependency-pin updates are merged; see the [shared platform baseline](PLATFORM.md).
The [replacement release status](PLATFORM.md#java-21-dependency-replacements)
lists the eight published Java 21 artifacts and their verification results.
Source merges and release publication do not deploy a Minecraft server or
establish gameplay compatibility.
All plugins target **Java 21 / Minecraft 1.21.10**; see the
[shared platform baseline](PLATFORM.md).

## Build dependencies

Plugins with file dependencies use `.github/scripts/prepare-release.sh` to download their private build inputs from a pinned commit in [ServerAssets](https://github.com/TF-Minecraft/ServerAssets). The committed `.github/dependencies.sha256` verifies the downloaded bytes. JARs go in `libs/`, outside Maven's cleaned `target/` directory, and are ignored by Git.

`DEPS_TOKEN` is an organisation Actions secret with Contents read access to ServerAssets. Grant the consuming repositories access to this one secret. A separate token for each repository is unnecessary. The workflow passes it only to dependency preparation steps. Fork pull requests do not receive Actions secrets and cannot run builds that require these private inputs.

Shared TFMC plugins use their native Maven coordinates with `provided` scope. Development and release workflows run the [shared plugin installer](https://github.com/TF-Minecraft/TLibs/blob/main/DEPENDENCIES.md) with `mode: latest`. It resolves each direct declared plugin dependency, verifies the JAR's SHA-256, installs its actual Maven version with a minimal POM, and updates the checkout's version properties after all inputs succeed. The action implementation remains pinned to a full commit SHA. Providers' build dependencies are not recursively installed or shaded; this handles existing source dependency cycles without requiring recursive builds.

Stable plugins use GitHub's latest published release. Cooking and InteractibleFurniture explicitly permit their existing ALPHA/BETA release channels. Drafts and DEV artifacts are excluded. A missing release, asset, credential or checksum mismatch fails the build. Publishing a release promotes that API to future builds; it does not deploy anything to a Minecraft server.

Shared plugin APIs resolve from public source-built releases. AdvancedCrafting 1.2.3 is the verified Java 21 replacement for 1.2.2; MusicalInstruments remains at 2.5. MusicalInstruments supplies the `InstrumentPlayEvent` API used by ActivityTF. Its former private JAR remains available for exact legacy rebuilds through the retained installer revision; current pinned and latest mode use the public release. Public release lookup uses the default GitHub token. Third-party licensed inputs continue to use the private preparation script and `DEPS_TOKEN`.

Every migrated build records exact coordinates, checksums and sources in `.build/plugin-dependencies.json`, uploaded alongside its development JAR. Tagged releases include that list in `build.json`. Local builds use `python3 ../tlibs/tools/install-plugins.py --pom pom.xml`; add `--mode latest` to update local version properties, or use the default `--mode pinned` and versions from a successful build's metadata for reproducible API selection. The private inputs also require `TFMC_PRIVATE_TOKEN` or `--assets /path/to/server-assets`.

Archaeo's initial API release `v1.0.1` was built from unchanged source and records its source commit and checksum. Its existing embedded plugin descriptor still says `1.0`; this is documented in the release metadata. It has no automated release workflow yet.
Shared TFMC plugins use their Maven coordinates with `provided` scope.
Development and release workflows run the
[shared plugin installer](https://github.com/TF-Minecraft/TLibs/blob/main/DEPENDENCIES.md)
with `mode: pinned`. It resolves each direct dependency at the version committed
in the POM, verifies the JAR checksum, and installs a minimal Maven POM. The action
is pinned to a reviewed commit SHA. Provider build dependencies are not installed
recursively or shaded into consumers.

Shared APIs use public source-built releases. Cooking and InteractibleFurniture
permit their ALPHA/BETA channels; other managed plugins use stable releases.
Drafts and development artifacts are excluded. Missing releases, artifacts,
credentials, or matching checksums fail the build. Public release lookup uses
`github.token`; licensed third-party inputs use `DEPS_TOKEN`.

Builds record coordinates, checksums, and sources in
`.build/plugin-dependencies.json`. Development artifacts preserve this file;
release metadata includes the same inputs in `build.json`. Local builds use:

```sh
python3 ../tlibs/tools/install-plugins.py --pom pom.xml --mode pinned
```

To upgrade dependencies, run the installer locally with `--mode latest`, review
the POM changes, and commit the chosen versions. Build consumers against matching
provider packages before releasing the dependent set.

ServerAssets' `manifest.json` is authoritative for filenames, hashes, embedded plugin versions, and sources. Keep licensed dependency JARs in that private repository and out of public release assets.

Expand Down
183 changes: 83 additions & 100 deletions PLATFORM.md
Original file line number Diff line number Diff line change
@@ -1,69 +1,65 @@
# Shared platform and build baseline

TFMC runs **Minecraft 1.21.10 on Java 21**. All maintained plugin builds target
Java 21 bytecode and the Minecraft **1.21.10** Paper or Spigot API. Plugin
`api-version` metadata is **1.21.10** throughout.
TFMC plugins target **Java 21 / Minecraft 1.21.10**, using the Paper or Spigot
1.21.10 API with `provided` scope. Plugin descriptors declare API 1.21.10.

## Runtime and toolchain

| Component | Baseline |
| --- | --- |
| Minecraft client/server | 1.21.10 |
| Server implementation | Paper; the recorded lab used build 130 (`8043efd`) |
| Plugin build JDK and server JVM | Java 21 |
| Build tool | Maven; use each repository's CI workflow and pinned dependencies |
| Web/backend | Follow [ProvinceSystem](projects/ProvinceSystem/docs/README.md); its Node/Python runtimes are independent |

Paper's [Java version table](https://docs.papermc.io/paper/getting-started/#requirements)
recommends Java 21 for the 1.20–1.21.11 series. TFMC's plugin migration uses Java 21
for both compilation and the runtime target. Old Java 25 TFMC jars must be
replaced together with their rebuilt dependencies; changing the server JVM alone
is insufficient.

The earlier [vehicle lab](projects/ServerAssets/docs/LAB.md) used Java 25 and
records historical evidence. It is not a Java 21 runtime certification. Its
restored-vehicle failure remains unresolved by this build migration.
| Minecraft | 1.21.10 |
| Server | Paper 1.21.10 |
| Build JDK and server JVM | Java 21 |
| Plugin build tool | Maven |
| Web/backend | Follow [ProvinceSystem](projects/ProvinceSystem/docs/README.md) |

## Build conventions

Follow the shared [XML and Maven POM conventions](POM-CONVENTIONS.md) when
maintaining build files.
### Java package layout

Run commands from the **source repository**, not this Docs checkout:
Plugin-owned Java sources use `src/main/java/net/tfminecraft/<plugin>/`,
with lowercase package segments throughout. Derive `<plugin>` from the repository
name by lowercasing it and removing hyphens: for example, `VFBuilders` becomes
`vfbuilders`, `activity-tf` becomes `activitytf`, and `geiger-counters` becomes
`geigercounters`. CoreProtect uses `net.tfminecraft.coreprotect` in this fork.
Use `enums` and `interfaces` as package names; their singular forms are Java
keywords. Java class names retain normal Java capitalization.

Mirror packages under `src/test/java`, except deliberate external API fixtures.
Keep package declarations, imports, reflection strings, `plugin.yml` entry points,
and shaded-library destinations aligned with the source folders. Maven artifact
coordinates, plugin names, and data-directory names are separate identifiers
from Java packages.

Build consumers against matching provider jars and release the dependent plugin
set together. CoreProtect integrations use this fork's
`net.tfminecraft.coreprotect` API.

### Build inputs

Follow the [XML and Maven POM conventions](POM-CONVENTIONS.md). Run builds from
the plugin source repository with Java 21:

```sh
java -version
mvn -version
python3 ../tlibs/tools/install-plugins.py --pom pom.xml --mode pinned
mvn clean verify
```

Both version commands should identify JDK 21. The POM uses
`maven.compiler.release=21` to restrict emitted bytecode and Java platform APIs.
Paper/Spigot APIs resolve from their Maven repositories with `provided` scope;
they are not bundled into plugin jars or read from an ambiguously named local
`spigot-api.jar`.

Supply the authorized private dependency jars using each repository's
`.github/scripts/prepare-release.sh` and verify its `.github/dependencies.sha256`
where present. These scripts require access to ServerAssets. Their `libs/`
directory is a source-build input, not this documentation repository. Use the
repository's pinned setup actions for released TFMC dependencies, or `mvn install`
in their source checkouts to install compatible local builds.

Some TFMC plugins depend on each other in both directions. A full rebuild may
need an authentic existing dependency artifact to bootstrap the cycle, followed
by clean Java 21 builds against the rebuilt dependencies. Keep bootstrap jars
out of the final distribution. Publishing the new dependency artifacts is a
separate step; changing consumer CI to Java 21 does not update an old release
asset automatically.

## Unified source build declarations

The source migrations and Java 21 dependency-pin updates were merged on
**2026-09-22**. The 36 plugin projects below now declare these settings on their
default branches. The eight verified replacement releases are listed below.
Source merges and release publication do not deploy the rebuilt jars; this table
does not certify the live plugin set or Java 21 gameplay compatibility.
The compiler's `release=21` setting controls bytecode and available Java APIs.
Paper and Spigot dependencies resolve from their Maven repositories and are not
bundled into plugin jars. Prepare private third-party dependencies with the
repository's `.github/scripts/prepare-release.sh`; it verifies
`.github/dependencies.sha256` where present.

Shared plugin dependencies use the exact versions declared in each consumer POM.
The [shared installer](PIPELINES.md#build-dependencies) verifies the public
artifacts and installs them into Maven. For source builds involving circular
plugin dependencies, provide the matching API artifacts before compiling the
consumer set. Source builds must pass clean verification before publication.

## Plugin build targets

| Project | Java release | API | API version |
| --- | --- | --- | --- |
Expand Down Expand Up @@ -104,62 +100,49 @@ does not certify the live plugin set or Java 21 gameplay compatibility.
| [Woodworking](projects/Woodworking/README.md) | 21 | `spigot-api` | `1.21.10-R0.1-SNAPSHOT` |
| [WorldBorder](projects/WorldBorder/README.md) | 21 | `spigot-api` | `1.21.10-R0.1-SNAPSHOT` |

ProvinceSystem is a web/backend project and ServerAssets is a private asset
snapshot. Neither produces a Minecraft plugin jar in this build set.
AdvancedCrafting is included because several plugins require it.

## Java 21 dependency replacements

As of **2026-09-22**, the following replacement artifacts passed local JDK 21
verification and are **published**. The previous release versions remain
unchanged for rollback.

| Project | Replacement | Unit tests |
| --- | --- | --- |
| [TLibs](projects/TLibs/README.md) | [1.1.1](https://github.com/TF-Minecraft/TLibs/releases/tag/v1.1.1) | 10 passed |
| [Cooking](projects/Cooking/README.md) | [0.1.6-ALPHA](https://github.com/TF-Minecraft/Cooking/releases/tag/v0.1.6-ALPHA) | 167 passed |
| [GunsAndGadgets](projects/GunsAndGadgets/README.md) | [1.0.7](https://github.com/TF-Minecraft/GunsAndGadgets/releases/tag/v1.0.7) | No tests in repository |
| [VehicleFramework](projects/VehicleFramework/README.md) | [1.1.13](https://github.com/TF-Minecraft/VehicleFramework/releases/tag/v1.1.13) | 369 passed |
| [AdvancedCrafting](projects/AdvancedCrafting/README.md) | [1.2.3](https://github.com/TF-Minecraft/AdvancedCrafting/releases/tag/v1.2.3) | No tests in repository |
| [InteractibleFurniture](projects/InteractibleFurniture/README.md) | [0.1.4-BETA](https://github.com/TF-Minecraft/InteractibleFurniture/releases/tag/v0.1.4-BETA) | No tests in repository |
| [VFBuilders](projects/VFBuilders/README.md) | [1.0.1](https://github.com/TF-Minecraft/VFBuilders/releases/tag/v1.0.1) | No tests in repository |
| [MarketBlock](projects/MarketBlock/README.md) | [0.0.3](https://github.com/TF-Minecraft/MarketBlock/releases/tag/v0.0.3) | No tests in repository |

Each JAR declares API 1.21.10 and contains Java 21-compatible classes. Its
`SHA256SUMS` and `build.json` record the artifact hash, exact source commit and
shared dependency inputs. These are local source builds, so `run` is `null`;
bootstrap API inputs used to resolve dependency cycles are recorded separately
from the released artifacts. Licensed third-party dependency JARs remain private.
Cooking and InteractibleFurniture retain their ALPHA/BETA prerelease channels.

Use the [shared installer](PIPELINES.md#build-dependencies) in latest mode to
select published replacements, or pin the exact versions and hashes from a
successful build for reproduction. The source migrations are merged; deployment
and runtime acceptance remain separate checks.
ProvinceSystem is a web/backend project. ServerAssets contains configurations,
models, resource packs, and private build inputs. Neither produces a plugin jar.

## Dependencies and validation
## Shared API versions

These source versions provide the `net.tfminecraft.<plugin>` Java APIs used by
the corresponding consumer dependency pins. Maven coordinates remain separate
from Java package names.

Build settings, packaged metadata and gameplay evidence are distinct. A jar
whose classes use Java 21 and whose descriptor declares 1.21.10 still needs its
matching dependency versions, configuration and assets on the server. See
Paper's [plugin.yml reference](https://docs.papermc.io/paper/dev/plugin-yml/#api-version)
for the loader metadata semantics.
| Project | Version |
| --- | --- |
| [AdvancedCrafting](https://github.com/TF-Minecraft/AdvancedCrafting) | `2.0.0` |
| [cooking](https://github.com/TF-Minecraft/Cooking) | `0.2.0-ALPHA` |
| [CoreProtect](https://github.com/TF-Minecraft/CoreProtect) | `25.0.0` |
| [denareconomy](https://github.com/TF-Minecraft/DenarEconomy) | `0.2.0` |
| [games](https://github.com/TF-Minecraft/Games) | `0.2.0` |
| [geiger-counters](https://github.com/TF-Minecraft/GeigerCounters) | `2.0.0` |
| [gunsandgadgets](https://github.com/TF-Minecraft/GunsAndGadgets) | `2.0.0` |
| [interactiblefurniture](https://github.com/TF-Minecraft/InteractibleFurniture) | `0.2.0-BETA` |
| [magic](https://github.com/TF-Minecraft/Magic) | `0.2.0` |
| [Marketblock](https://github.com/TF-Minecraft/MarketBlock) | `0.1.0` |
| [musical-instruments](https://github.com/TF-Minecraft/MusicalInstruments) | `3.0.0` |
| [rpcharacters](https://github.com/TF-Minecraft/RPCharacters) | `2.0.0` |
| [simplefactions](https://github.com/TF-Minecraft/SimpleFactions) | `3.0.0` |
| [tfmccore](https://github.com/TF-Minecraft/TFMCCore) | `2.0.0` |
| [tlibs](https://github.com/TF-Minecraft/TLibs) | `2.0.0` |
| [vehicleframework](https://github.com/TF-Minecraft/VehicleFramework) | `2.0.0` |
| [vfbuilders](https://github.com/TF-Minecraft/VFBuilders) | `2.0.0` |

## Dependencies and validation

Record the source revision and patch, dependency checksums, JDK, Maven command,
unit-test results and artifact checksums with every build. For runtime checks,
record the exact Paper 1.21.10 build, plugin set, configuration/assets, exercised
commands/gameplay, and persistence/restart results. Keep passed, failed and
untested behavior explicit.
Record source commits, dependency checksums, the JDK, Maven commands, test
results, and artifact checksums for release builds. Check packaged entry points,
plugin versions, and API versions as well as source settings.

The [existing vehicle test report](projects/ServerAssets/docs/TEST-RESULTS.md)
covers fresh cars, trains and artillery with its original dependency set. It
records a restored-state failure and does not certify this Java 21 build set.
Offline authentication and localhost settings in that lab are specific to its
isolated test environment.
Compilation and unit tests do not exercise a live Minecraft server. Runtime
validation should record the Paper build, plugin set, configuration, exercised
commands, gameplay, and persistence across restarts. Publishing artifacts does
not deploy them to a server.

## Documentation conventions

Every [project index](README.md#projects) links here. Keep current setup guidance
aligned with Java 21 and Minecraft 1.21.10; preserve the original versions in
dated historical reports. Link to the source repository for code and use
relative links for other Docs guides. See [Maintaining the documentation](MAINTAINING.md).
Each [project index](README.md#projects) links here. Keep current setup guidance
aligned with the declared platform and dependency versions. Link to the source
repository for code and use relative links between Docs guides. See
[Maintaining the documentation](MAINTAINING.md).
2 changes: 1 addition & 1 deletion projects/AACommandsFiller/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ No listeners, no scheduled tasks — everything happens inside the command and t
Small, deliberate footprint — each class has one job:

```
src/main/java/tfmc/justin/
src/main/java/net/tfminecraft/aacommandsfiller/
├── AACommandsFiller.java # Entry point: wiring, lifecycle
├── config/
│ └── ConfigHelper.java # config.yml parsing: command tree, permissions, base command
Expand Down
2 changes: 1 addition & 1 deletion projects/AdvancedCrafting/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ versions aligned without changing Java gameplay source.

TFMC runs Minecraft **1.21.10**. See the [shared platform and build baseline](../../PLATFORM.md) for runtime, build and validation conventions.

Published Java 21 replacement: [1.2.3](https://github.com/TF-Minecraft/AdvancedCrafting/releases/tag/v1.2.3), verified locally. See the [replacement release status](../../PLATFORM.md#java-21-dependency-replacements) for provenance, verification and deployment status.
See the [shared API versions](../../PLATFORM.md#shared-api-versions) for the matching provider dependency set.

- [Setup, builds and releases](setup.md)
- [Configuration and commands](configuration.md)
Expand Down
Loading