Skip to content
Merged
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
35 changes: 9 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ BirdMessenger turns written correspondence into an in-world activity. Players se
## Features

- **Character recipients** — choose and confirm a recipient through an in-game character picker connected to RPCharacters.
- **Recipient opt-out** — players can use `/rpcharacter mail off` in RPCharacters to hide their active character from the recipient list, or `/rpcharacter mail on` to restore it. If a recipient opts out before a sender confirms, the letter is returned; already-sent mail still arrives.
- **Recipient opt-out** — characters can be hidden from the recipient list through RPCharacters; already-sent mail still arrives.
- **Physical letters** — send supported blank, sealed, or opened letter items while preserving the item and its contents.
- **Sealed correspondence** — sign letters with their own title and break the seal when opening them to read.
- **Travel time** — delivery time follows the distance to the recipient's character location, with an estimated arrival shown to the sender.
Expand All @@ -25,32 +25,15 @@ Technical documentation is maintained in [TF-Minecraft/Docs](https://github.com/

## Tests

If a mail file or one of its entries cannot be decoded, BirdMessenger preserves
the original file beside it as `<filename>.corrupt-<uuid>` before later saves can
replace it. These recovery copies include unreadable entries and should be kept
until the affected mail has been recovered. If the copy cannot be created,
startup fails and the affected file cannot be overwritten by the store.

Install the pinned shared plugin dependencies, download the private build
inputs, then run the build with Java 21. In Bash:

```bash
python3 path/to/TLibs/tools/install-plugins.py --pom pom.xml --mode pinned &&
(read -rsp 'ServerAssets token: ' GH_TOKEN && echo && export GH_TOKEN &&
bash .github/scripts/prepare-release.sh) &&
mvn clean verify
```

The installer comes from a separate TLibs checkout
(`git clone https://github.com/TF-Minecraft/TLibs.git`); point `path/to/TLibs` at it. The token needs Contents read access
to TF-Minecraft/ServerAssets. The prompt keeps it out of shell history, the
subshell keeps it out of your session and Maven, and Maven only runs if both
preparation steps succeed. CI supplies it from `DEPS_TOKEN`.

Tests use JUnit and Mockito and run without a live Minecraft server.
With Java 21 and the [build dependencies](https://github.com/TF-Minecraft/Docs/blob/main/projects/BirdMessenger/README.md#build-and-dependencies) prepared,
run `mvn clean verify`.

JUnit 5 and Mockito cover letters, recipient selection, delivery, persistence and
plugin boundaries without starting a live Minecraft server.
`mvn clean verify` requires 100% production line coverage with no class or package
exclusions. JaCoCo writes HTML and XML reports to `target/site/jacoco/`, and CI
uploads them alongside the Surefire test reports. The gate measures lines;
exclusions. JaCoCo writes `target/site/jacoco/index.html` and
`target/site/jacoco/jacoco.xml`; Surefire results are in `target/surefire-reports/`.
The Build workflow uploads both report directories. The gate measures lines;
it does not require 100% branch coverage or replace testing on a live server.

## License
Expand Down
Loading