Files
RoseFirefighter/README.md
T
2026-08-17 09:00:09 -04:00

8.1 KiB

RoseFirefighter

RoseFirefighter is a Paper 26.2 companion plugin for JobsReborn. It does not implement its own economy or leveling system. Instead, it detects legitimate firefighting actions and submits matching JobsReborn actions so JobsReborn continues to handle job membership, levels, job XP, income progression, bonuses, taxes, payment limits, payment visualization, and level-ups.

Supported firefighting

  • Extinguishing FIRE.
  • Extinguishing SOUL_FIRE.
  • Extinguishing lit CAMPFIRE blocks.
  • Extinguishing lit SOUL_CAMPFIRE blocks.
  • Water-bucket extinguishing when the affected fire can be attributed to the player who emptied the bucket.
  • Controlled RoseFirefighter emergency fires.

Only players currently working the configured JobsReborn Firefighter job can receive the submitted JobsReborn rewards.

Anti-farming behavior

With rewards.anti-farm: true, RoseFirefighter rejects payment for player-created fire, including:

  • Flint-and-steel ignition.
  • Fire-charge/direct player ignition.
  • Fire started by a projectile shot by a player.
  • Fire spread from a player-created fire.
  • Fire caused by player-placed lava or tracked lava flow.
  • Campfires a player relights and then extinguishes.

Active player-created fire and active player-placed lava remain tainted for as long as those sources still exist; they do not become payable merely because a timer expires. Configurable retention timers remain after the active source disappears. A separate location cooldown prevents duplicate/delayed-event payouts and repeated same-location farming.

Creative and spectator players do not receive rewards by default. Creative earning can be enabled explicitly in config.yml.

Requirements

  • Paper 26.2
  • Java 25 for compilation/server runtime
  • JobsReborn 5.2.6.x
  • CMILib, as required by JobsReborn
  • GriefPrevention 16.18.6+ (optional; enables protected-claim emergency building)
  • A JobsReborn-compatible economy if monetary payouts are desired

Build

The repository includes the Gradle 9.6.1 Wrapper. A global Gradle installation is not required.

Windows:

gradlew.bat clean build

Linux/macOS:

./gradlew clean build

The resulting plugin JAR is written to build/libs/.

Install

  1. Copy jobs/Firefighter.yml to:

    plugins/Jobs/jobs/Firefighter.yml

  2. Reload JobsReborn or restart the server.

  3. Copy the RoseFirefighter JAR from build/libs/ into the server's plugins/ directory.

  4. Restart Paper.

  5. Players can join the profession with the normal JobsReborn command, for example:

    /jobs join Firefighter

JobsReborn payouts

jobs/Firefighter.yml contains the base income and job-XP values. RoseFirefighter does not calculate those amounts itself.

Verified extinguish JobsReborn action Base income Base job XP
FIRE BREAK/FIRE 1.00 1.00
SOUL_FIRE BREAK/SOUL_FIRE 1.25 1.25
CAMPFIRE COLLECT/CAMPFIRE 0.50 0.50
SOUL_CAMPFIRE COLLECT/SOUL_CAMPFIRE 0.75 0.75

Campfires intentionally use a synthetic JobsReborn COLLECT action. Putting campfires under the JobsReborn Break section would also reward players for simply mining the campfire block.

The per-type action-count options in RoseFirefighter's config.yml control how many JobsReborn actions are submitted for a verified extinguish. Keep them at 1 for the normal base payout. Emergency fires additionally apply emergencies.reward-multiplier, which defaults to 5.

Emergency sites

Stand at the center of an area where controlled emergencies may appear:

/firefighter site add RoseGarden 18

Other management commands:

/firefighter status
/firefighter site remove <name>
/firefighter site list
/firefighter emergency start <site>
/firefighter emergency stop
/firefighter reload

rosefirefighter.admin is required for site, emergency, and reload management and defaults to server operators.

Emergency behavior

Automatic emergencies default to a random 30-60 minute interval and require at least one online Firefighter. Manual starts use the same online-Firefighter requirement unless emergencies.require-firefighters-online is disabled.

Emergency fire generation and response behavior:

  • Uses admin-defined named sites and radii.
  • Can be limited to configured world names with emergencies.allowed-worlds.
  • Places only temporary fire blocks on safe solid support blocks.
  • Does not replace the supporting block.
  • Cancels emergency-fire spread and spread ignition.
  • Cancels nearby block burning.
  • Tracks and removes remaining emergency fire on completion, manual stop, expiry, plugin disable, or server shutdown.
  • Grants on-duty Firefighters the temporary rosefirefighter.emergency.build runtime permission while an incident is active.
  • When GriefPrevention is installed, uses its claim-permission API to allow block placement and water-bucket response only inside the active site. Emergency fire and tracked temporary response blocks can also be broken there.
  • Does not grant /IgnoreClaims or global griefprevention.adminclaims, so an incident does not become a server-wide claim bypass.
  • Tracks blocks Firefighters place at the incident and restores the replaced block state when the incident ends.
  • Returns one consumed placement item per still-tracked placement to the Firefighter who placed it. Blocks the player already broke are removed from the return ledger to avoid duplication.
  • Saves returns for offline Firefighters in pending-returns.yml and delivers them on their next join.
  • Periodically removes stale tracked fire entries if an emergency fire disappears through another legitimate game event.
  • Broadcasts configurable alerts, by default to all online players.

Example alert:

🔥 FIRE ALERT! A fire has been reported at RoseGarden near X:123 Y:64 Z:-245. Firefighters are needed immediately!

Protected-site integration

emergencies.protected-site-building controls temporary emergency build access. The permission is granted with Bukkit's runtime PermissionAttachment, so it is temporary and does not create permanent LuckPerms/permissions-plugin data.

With GriefPrevention installed, RoseFirefighter listens to ClaimPermissionCheckEvent and clears a denied Build check only when all of the following are true:

  • An emergency is active.
  • The player is currently working the JobsReborn Firefighter job.
  • The player currently has RoseFirefighter's temporary emergency-build attachment.
  • The affected block is inside the active site's configured radius.
  • The action is placing a block, emptying a bucket, breaking an emergency fire, or breaking a tracked temporary Firefighter block.

Normal protected structures cannot be broken merely because an emergency is active.

emergencies.cleanup-firefighter-blocks controls whether placements made by Firefighters inside the active site are added to the temporary response-construction ledger.

Configuration

src/main/resources/config.yml includes controls for:

  • JobsReborn job name.
  • Normal fire, soul fire, campfire, and soul-campfire action submission.
  • Duplicate reward cooldown.
  • Player-created-fire and player-lava tracking retention.
  • Creative-mode earning.
  • Water attribution scan radius.
  • Emergency enable/disable and automatic scheduling.
  • Minimum online Firefighters.
  • Emergency duration and fire counts.
  • Emergency reward multiplier.
  • Announcement behavior.
  • Permitted emergency worlds.
  • Protected-site emergency building and temporary Firefighter block cleanup.
  • Saved emergency sites.

Development notes

Paper 26.2 uses the current Paper dependency format and Java 25 toolchain:

compileOnly("io.papermc.paper:paper-api:26.2.build.+")

JobsReborn is referenced through its documented JitPack coordinate:

compileOnly("com.github.Zrips:Jobs:v5.2.6.2")

GriefPrevention is an optional compile-time API dependency and a runtime soft dependency:

compileOnly("com.github.GriefPrevention:GriefPrevention:16.18.6")

The JobsReborn and GriefPrevention dependencies are non-transitive because RoseFirefighter only needs their public API classes and should not pull their optional integrations into its compile classpath.