Files
dmg a375da547b
Release / release (push) Successful in 5m11s
CI / build (push) Successful in 1m9s
feat(leaf): migrate distribution to Java 25 and Purpur
BREAKING CHANGE: New releases require Java 25/Purpur 26.2 and use purpur-leaf-<version>.jar. Runtime Leaf identity, data folder, protection state and scoreboard team remain unchanged. Replace the old JAR rather than installing both distributions.
2026-09-12 14:20:43 -04:00

2.8 KiB

Purpur Leaf

Leaf is a Purpur 26.2 plugin that lets non-aggressive players opt into visible Resistance and Strength protection.

The approved behavior is specified in the SoMC OKF wiki.

Requirements

  • Purpur 26.2 build 2618
  • Java 25

Distribution repository, checkout and artifacts use purpur-leaf. Runtime Leaf, Java packages/entrypoint, plugins/Leaf/, commands/permissions and leaf_protected scoreboard team are unchanged. Replace the old JAR instead of installing both distributions. Old release tags/assets remain available. New releases no longer support Java 17.

Build

./gradlew clean check jar

The plugin JAR is written to build/libs/purpur-leaf-<version>.jar.

Commands

/leaf on
/leaf off
/leaf status
/leaf enabled <on|off>
/leaf effect <resistance|strength> <1-5>
/leaf strength <1-5>  # Deprecated Resistance alias
/leaf player <name|uuid> status
/leaf player <name|uuid> enabled <on|off>
/leaf player <name|uuid> locked <on|off>

Administrative commands require leaf.admin, granted to server operators by default.

Compatibility

Leaf prefixes the standard Bukkit-compatible display name (used by standard chat), player-list name, and a dedicated leaf_protected main-scoreboard team for overhead names. Legacy & color codes are supported. Leaf does not move players out of an existing scoreboard team, and per-viewer/custom scoreboards may not show its overhead prefix. Chat or tab-management plugins may replace Leaf's decorated names. During cleanup, Leaf removes exact copies of its configured prefix while preserving surrounding name formatting; another plugin should therefore not intentionally use identical prefix text.

The server API identifies potion effects by type but does not expose their owning plugin. Leaf tracks the exact infinite, quiet Resistance and Strength effects it successfully installed and removes them only while each visible effect still matches. A distinct level, duration, or presentation is preserved. The server API cannot distinguish an externally supplied effect with an identical fingerprint; Leaf therefore does not claim or later remove an identical effect that was already active when reconciliation ran.

Leaf reconciles opted-in online players approximately once per second. Effects cleared by death, milk, commands, or another plugin are restored automatically. A temporary external Resistance or Strength effect is left untouched, the leaf prefix remains visible, and Leaf restores its configured effect after the external effect ends.

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 after the repository defines a RELEASE_TOKEN with contents-write permission.