8.7 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
CAMPFIREblocks. - Extinguishing lit
SOUL_CAMPFIREblocks. - 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 and forced entry)
- 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
-
Copy
jobs/Firefighter.ymlto:plugins/Jobs/jobs/Firefighter.yml -
Reload JobsReborn or restart the server.
-
Copy the RoseFirefighter JAR from
build/libs/into the server'splugins/directory. -
Restart Paper.
-
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.buildruntime permission while an incident is active. - When GriefPrevention is installed, uses its claim-permission API to allow emergency building, water use, and temporary forced entry only inside the active site.
- With
emergencies.forced-entry: true, protected doors, windows, walls, and other blocks can be temporarily breached by an on-duty Firefighter. Forced-entry blocks produce no item drops or XP and are restored to their original block states when the incident ends. - Does not grant
/IgnoreClaimsor globalgriefprevention.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.ymland 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 emergency response construction, water use, extinguishing emergency fire, breaking a tracked temporary Firefighter block, or a forced-entry break when
emergencies.forced-entryis enabled.
Forced-entry damage is temporary. The plugin snapshots the original block states, suppresses drops and XP, removes the breached blocks without physics, and restores those original states when the emergency is cleared, stopped, expires, or the plugin shuts down. Multi-block doors and beds are handled together so the structure can be restored correctly.
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, temporary forced entry, 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.