# Purpur Harvest A Purpur 26.2 plugin providing progression-gated, connected crop harvesting and automatic replanting. The approved behavior is specified in the [SoMC OKF wiki](https://git.garvis.dev/dmg/somc-okf/src/branch/main/projects/purpur-harvest/index.md). ## Requirements - Purpur 26.2 build 2618 - Java 25 ## Distribution migration New repositories/checkouts/artifacts use `purpur-harvest`; runtime `SpigotHarvest`, Java entrypoints/packages, data folders, commands, permissions and crop progression remain unchanged. New releases no longer support Java 17. Replace the old JAR rather than installing both distributions. Historical tags and `spigot-harvest-*` assets are retained; the prior v1.0.1 download was checked for identical bytes after renaming. ## Build ```bash ./gradlew clean check jar ``` The plugin JAR is written to `build/libs/`. `check` includes `nativeHarvestTest`: it downloads SHA-256-verified Purpur 2618 under `build/harvest-runtime/`, loads native registry/service providers, and runs real item-stack/drop/replant regressions without starting a listening server. Those tests are not replaced by item mocks or excluded from verification. ## Commands ```text /harvest /harvest status [wheat|carrot|potato|beetroot] /harvest bossbar ``` The progress boss bar is enabled by default and remains visible for five seconds after its latest update. Sneaking while breaking a mature crop bypasses auto-harvest while still earning progress. ## Administration The `spigotharvest.admin` permission is granted to server operators by default. ```text /harvestadmin status [crop] /harvestadmin setlevel <0|I|II|III|IV|V|VI|VII|VIII|IX|X> /harvestadmin setprogress /harvestadmin reset /harvestadmin reset all confirm ``` Validated progression and presentation defaults are documented in `src/main/resources/config.yml`. UUID-keyed player state is stored in `plugins/SpigotHarvest/state.yml` using atomic replacement where supported. ## Releases Gitea Actions checks pushes and pull requests and stores a development JAR. Pull requests validate conventional commits. Main-branch conventional commits drive semantic releases when the repository defines a `RELEASE_TOKEN` with contents-write permission.