This commit is contained in:
2026-06-24 18:38:15 -04:00
commit c5c83aa216
78 changed files with 5066 additions and 0 deletions
Binary file not shown.
+154
View File
@@ -0,0 +1,154 @@
# DirtBounties main configuration
# Paper 1.21.x, Java 21
#
# Color formatting supports normal ampersand colors, hex colors like &#D4AF37,
# and the DirtbagMC gradient style shown below.
server:
brand-name: "DirtbagMC"
brand-gradient: "&#3A2416&lᴅ&#4A2D1B&lɪ&#5A351F&lʀ&#6A3F24&lᴛ&#7A4A2A&lʙ&#8B6B35&lᴀ&#A8873F&lɢ&#D4AF37&lᴍ&#B9C63F&l"
debug: false
storage:
# Active bounty data is saved after important mutations and on this autosave interval.
autosave-interval: "5m"
cleanup-expired-interval: "10m"
save-player-ip-cache: true
write-history-to-disk-immediately: true
economy:
enabled: true
# DirtBounties uses Bukkit ServicesManager economy registration.
# This supports normal Vault and CMI's Vault injector.
fail-if-missing: false
provider-log-on-enable: true
minimum-balance-after-withdraw: 0.0
currency-format: "${amount}"
fees:
# Placement fee can be charged as extra money or deducted from the bounty value.
placement-percent: 5.0
placement-mode: "extra" # extra, deduct
add-percent: 5.0
add-mode: "extra" # extra, deduct
claim-tax-percent: 0.0
claim-sink-percent: 0.0
broadcasts:
enabled: true
placed-threshold: 5000.0
claimed-threshold: 5000.0
milestone-thresholds:
- 10000.0
- 25000.0
- 50000.0
bounties:
min-amount: 100.0
max-amount: 1000000.0
stack-existing: true
allow-self-target: false
allow-offline-targets: true
# If false, targets must be online or have joined before.
# If true, Bukkit may create an OfflinePlayer profile for unknown names.
allow-never-joined-targets: false
allow-banned-targets: false
allow-anonymous: true
anonymous-requires-permission: true
allow-reasons: true
max-reason-length: 80
default-reason: "No reason given."
placement-cooldown: "30s"
require-confirmation-gui: true
expiration:
enabled: true
default-duration: "14d"
max-duration: "30d"
# If true, a bounty without contributions gets removed during cleanup.
remove-empty-bounties: true
banned-player-action: "keep" # keep, expire
deleted-player-action: "keep" # keep, expire
refunds:
# Refund percentage is based on the active contribution value, not placement fees.
on-admin-remove-percent: 100.0
on-expire-percent: 50.0
on-invalid-percent: 100.0
refund-fees: false
refund-offline-players: true
minimum-refund: 0.01
claim-rules:
require-permission: true
require-pvp-kill: true
block-environmental-deaths: true
prevent-self-claims: true
prevent-same-ip-claims: true
prevent-shared-known-ip-claims: true
allow-bypass-permission: true
require-target-online-at-death: true
blocked-killer-game-modes:
- CREATIVE
- SPECTATOR
worlds:
mode: "blacklist" # disabled, whitelist, blacklist
list:
- spawn
- events
combat:
enabled: true
window: "30s"
min-damage: 4.0
min-hits: 1
min-combat-duration: "0s"
anti-abuse:
enabled: true
log-failed-claims: true
log-same-ip-attempts: true
killer-claim-cooldown: "2m"
target-claim-cooldown: "2m"
killer-target-pair-cooldown: "12h"
same-victim-cooldown: "10m"
pair-window: "7d"
max-pair-claims-in-window: 2
suspicious-history-limit: 500
run-console-commands-on-suspicious: false
suspicious-commands:
- "staffmsg Suspicious bounty claim: {killer} -> {target}: {reason}"
history:
enabled: true
max-records: 2000
max-records-per-player-command: 10
prune-older-than: "90d"
gui:
enabled: true
open-sound: "BLOCK_BARREL_OPEN"
click-sound: "UI_BUTTON_CLICK"
success-sound: "ENTITY_PLAYER_LEVELUP"
error-sound: "ENTITY_VILLAGER_NO"
items-per-page: 28
refresh-after-action: true
close-on-confirm: true
chat-input-timeout: "60s"
webhooks:
enabled: false
url: ""
username: "DirtBounties"
large-bounty-threshold: 25000.0
large-claim-threshold: 25000.0
notify-placements: true
notify-claims: true
notify-admin-actions: true
timeout-seconds: 8
logging:
console:
economy-status: true
placements: true
claims: true
admin-actions: true
suspicious: true
file-history: true
+177
View File
@@ -0,0 +1,177 @@
titles:
main: "&#3A2416&lDirtBounties &8| &6Active"
top: "&#3A2416&lDirtBounties &8| &6Top"
detail: "&#3A2416&lDirtBounties &8| &c{target}"
confirm: "&#3A2416&lDirtBounties &8| &aConfirm"
admin-main: "&#3A2416&lDirtBounties &8| &4Admin"
admin-history: "&#3A2416&lDirtBounties &8| &4History"
admin-suspicious: "&#3A2416&lDirtBounties &8| &4Suspicious"
layout:
size: 54
content-slots:
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 37
- 38
- 39
- 40
- 41
- 42
- 43
previous-slot: 45
back-slot: 46
refresh-slot: 49
next-slot: 53
place-slot: 48
top-slot: 50
admin-slot: 52
items:
filler:
material: BLACK_STAINED_GLASS_PANE
name: " "
lore: []
border:
material: BROWN_STAINED_GLASS_PANE
name: " "
lore: []
empty:
material: BARRIER
name: "&cNo bounties"
lore:
- "&7Nobody has a price on their head."
bounty:
material: PLAYER_HEAD
name: "&c&l{target}"
lore:
- "&7Bounty: &f{amount}"
- "&7Contributors: &f{contributors}"
- "&7Top reason: &f{reason}"
- "&7Expires: &f{expires}"
- ""
- "&eClick to view details."
top-bounty:
material: PLAYER_HEAD
name: "&6#{rank} &c&l{target}"
lore:
- "&7Bounty: &f{amount}"
- "&7Contributors: &f{contributors}"
- ""
- "&eClick to inspect."
detail-head:
material: PLAYER_HEAD
name: "&c&l{target}"
lore:
- "&7Total bounty: &f{amount}"
- "&7Contributors: &f{contributors}"
- "&7Expires: &f{expires}"
- ""
- "&6Top reasons:"
- "{reason_lines}"
claim-info:
material: BOOK
name: "&6Claim Conditions"
lore:
- "&7PvP required: &f{pvp}"
- "&7Same IP blocked: &f{same_ip}"
- "&7World mode: &f{world_mode}"
- "&7Combat: &f{combat}"
- ""
- "&8Claims are checked automatically on kill."
place:
material: GOLD_INGOT
name: "&6Place Bounty"
lore:
- "&7Start a guided bounty placement."
- ""
- "&eClick to begin."
add:
material: ANVIL
name: "&6Increase Bounty"
lore:
- "&7Add money to this target's bounty."
- ""
- "&eClick to continue."
top:
material: NETHER_STAR
name: "&6Top Bounties"
lore:
- "&7Sort by highest active value."
- ""
- "&eClick to view."
refresh:
material: SUNFLOWER
name: "&eRefresh"
lore:
- "&7Reload this view."
previous:
material: ARROW
name: "&ePrevious Page"
lore:
- "&7Go back one page."
next:
material: ARROW
name: "&eNext Page"
lore:
- "&7Go forward one page."
back:
material: OAK_DOOR
name: "&eBack"
lore:
- "&7Return to the previous view."
close:
material: BARRIER
name: "&cClose"
lore:
- "&7Close this menu."
confirm:
material: LIME_CONCRETE
name: "&aConfirm Bounty"
lore:
- "&7Target: &f{target}"
- "&7Amount: &f{amount}"
- "&7Fee: &f{fee}"
- "&7Total cost: &f{cost}"
- "&7Reason: &f{reason}"
- ""
- "&aClick to confirm."
cancel:
material: RED_CONCRETE
name: "&cCancel"
lore:
- "&7Return without placing this bounty."
admin-active:
material: CHEST
name: "&4Active Bounties"
lore:
- "&7Review and inspect all active bounties."
admin-history:
material: WRITABLE_BOOK
name: "&4Recent Claims and Changes"
lore:
- "&7Review bounty history records."
admin-suspicious:
material: REDSTONE_TORCH
name: "&4Suspicious Activity"
lore:
- "&7Review blocked and suspicious claims."
+105
View File
@@ -0,0 +1,105 @@
prefix: "&#3A2416&lᴅ&#4A2D1B&lɪ&#5A351F&lʀ&#6A3F24&lᴛ&#7A4A2A&lʙ&#8B6B35&lᴀ&#A8873F&lɢ&#D4AF37&lᴍ&#B9C63F&l &8» "
no-permission: "{prefix}&cYou do not have permission to do that."
player-only: "{prefix}&cOnly players can use that command."
unknown-command: "{prefix}&cUnknown bounty command. Use &f/bounty help&c."
reload-complete: "{prefix}&aDirtBounties reloaded."
invalid-number: "{prefix}&cThat amount is not valid."
invalid-player: "{prefix}&cCould not find that player."
invalid-world: "{prefix}&cBounties cannot be claimed in this world."
economy-missing: "{prefix}&cEconomy is not available. Ask staff to check Vault or CMI's Vault injector."
not-enough-money: "{prefix}&cYou need &f{cost}&c, including fees, to place that bounty."
cooldown: "{prefix}&cSlow down. Try again in &f{time}&c."
reason-too-long: "{prefix}&cThat reason is too long. Maximum: &f{max}&c characters."
target-self: "{prefix}&cYou cannot place or claim a bounty on yourself."
target-banned: "{prefix}&cThat player cannot receive bounties while banned."
amount-too-low: "{prefix}&cMinimum bounty amount is &f{min}&c."
amount-too-high: "{prefix}&cMaximum bounty amount is &f{max}&c."
amount-would-exceed-max: "{prefix}&cThat would put the bounty above the maximum of &f{max}&c."
no-active-bounties: "{prefix}&7There are no active bounties right now."
bounty-not-found: "{prefix}&cThere is no active bounty on &f{target}&c."
claim-denied-format: "{prefix}&cBounty claim denied: &f{reason}"
help:
- "{prefix}&6&lDirtBounties Commands"
- "&8- &e/bounty &7Open the bounty GUI."
- "&8- &e/bounty place <player> <amount> [reason] &7Place a bounty."
- "&8- &e/bounty add <player> <amount> [reason] &7Increase a bounty."
- "&8- &e/bounty list &7List active bounties."
- "&8- &e/bounty top &7View top bounties."
- "&8- &e/bounty view <player> &7View bounty details."
- "&8- &e/bounty claiminfo <player> &7View claim rules."
admin-help:
- "{prefix}&6&lDirtBounties Admin"
- "&8- &e/bountyadmin reload &7Reload configs and storage."
- "&8- &e/bountyadmin remove <player> &7Remove a bounty and refund by config."
- "&8- &e/bountyadmin clearall confirm &7Remove every active bounty."
- "&8- &e/bountyadmin set <player> <amount> &7Set a bounty value."
- "&8- &e/bountyadmin expire <player> &7Expire a bounty."
- "&8- &e/bountyadmin history <player> &7Show history."
- "&8- &e/bountyadmin suspicious &7Show suspicious activity."
- "&8- &e/bountyadmin gui &7Open admin GUI."
bounty:
placed: "{prefix}&aPlaced a bounty of &f{amount}&a on &f{target}&a. Fee: &f{fee}&a."
added: "{prefix}&aAdded &f{amount}&a to &f{target}&a's bounty. New total: &f{total}&a."
broadcast-placed: "{prefix}&6{placer}&e placed a bounty of &f{amount}&e on &c{target}&e."
broadcast-added: "{prefix}&6{placer}&e increased &c{target}&e's bounty to &f{total}&e."
milestone: "{prefix}&c{target}&6's bounty has reached &f{total}&6."
claimed: "{prefix}&aYou claimed &f{payout}&a from &c{target}&a's bounty."
claim-broadcast: "{prefix}&c{killer}&6 claimed &f{payout}&6 for killing &c{target}&6."
expired: "{prefix}&7The bounty on &f{target}&7 expired."
removed: "{prefix}&aRemoved the bounty on &f{target}&a."
set: "{prefix}&aSet &f{target}&a's bounty to &f{amount}&a."
clearall-warning: "{prefix}&cUse &f/bountyadmin clearall confirm &cto remove all active bounties."
clearall-done: "{prefix}&aRemoved &f{count}&a active bounties."
list-line: "&8- &c{target} &7» &f{amount} &8({contributors} contributors)"
top-line: "&6#{rank} &c{target} &7» &f{amount}"
view:
- "{prefix}&6&lBounty: &c{target}"
- "&7Amount: &f{amount}"
- "&7Contributors: &f{contributors}"
- "&7Expires: &f{expires}"
- "&7Reason: &f{reason}"
claiminfo:
- "{prefix}&6&lClaim Rules for &c{target}"
- "&8- &7PvP kill required: &f{pvp}"
- "&8- &7Same-IP claims blocked: &f{same_ip}"
- "&8- &7Allowed worlds: &f{worlds}"
- "&8- &7Combat requirement: &f{combat}"
claim-denied:
no-bounty: "No active bounty exists."
no-permission: "You do not have permission to claim bounties."
self: "Self-claims are blocked."
same-ip: "Same-IP bounty claims are blocked."
shared-known-ip: "Shared known-IP bounty claims are blocked."
world: "Claims are disabled in this world."
gamemode: "Your game mode cannot claim bounties."
combat: "Combat requirements were not met."
cooldown: "A claim cooldown is active."
pair-limit: "This killer-target pair has too many recent claims."
target-offline: "The target must be online at death."
gui:
unavailable: "{prefix}&cThe bounty GUI is disabled."
prompt-target: "{prefix}&eType the target player's name in chat, or type &fcancel&e."
prompt-amount: "{prefix}&eType the bounty amount for &f{target}&e, or type &fcancel&e."
prompt-reason: "{prefix}&eType a short reason for &f{target}&e, use &f-&e for none, or type &fcancel&e."
input-cancelled: "{prefix}&7Bounty input cancelled."
input-expired: "{prefix}&cYour bounty input expired."
confirm-opened: "{prefix}&7Review and confirm the bounty."
admin-opened: "{prefix}&7Opened the admin bounty view."
admin:
history-empty: "{prefix}&7No bounty history found for &f{target}&7."
suspicious-empty: "{prefix}&7No suspicious bounty activity has been logged."
suspicious-line: "&8- &c{time} &7{type}: &f{details}"
history-line: "&8- &e{time} &7{type}: &f{amount} &8({note})"
refunded: "{prefix}&aRefunded &f{amount}&a to &f{player}&a."
action-logged: "{prefix}&7Admin action logged."
webhook:
placement-title: "New bounty placed"
claim-title: "Bounty claimed"
admin-title: "Bounty admin action"
+67
View File
@@ -0,0 +1,67 @@
name: DirtBounties
version: 1.0.0
main: com.dirtbagmc.dirtbounties.DirtBountiesPlugin
api-version: '1.21'
author: DirtbagMC
website: https://dirtbagmc.com
description: Premium bounty system for Paper SMP and anarchy servers.
softdepend:
- Vault
- CMI
- PlaceholderAPI
commands:
bounty:
description: Open and manage player bounties.
usage: /bounty help
aliases:
- bounties
- dbounty
bountyadmin:
description: Admin controls for DirtBounties.
usage: /bountyadmin help
aliases:
- dbountyadmin
- ba
permissions:
dirtbounties.use:
description: Allows opening the bounty GUI and using basic commands.
default: true
dirtbounties.place:
description: Allows placing new bounties.
default: true
dirtbounties.add:
description: Allows increasing existing bounties.
default: true
dirtbounties.view:
description: Allows viewing bounty details.
default: true
dirtbounties.top:
description: Allows viewing top bounties.
default: true
dirtbounties.claim:
description: Allows claiming bounties by killing targets.
default: true
dirtbounties.anonymous:
description: Allows placing anonymous bounties when enabled.
default: op
dirtbounties.bypass.cooldowns:
description: Bypasses placement and claim cooldown checks.
default: op
dirtbounties.bypass.claimrules:
description: Bypasses configured claim restrictions.
default: op
dirtbounties.admin:
description: Full DirtBounties administration access.
default: op
children:
dirtbounties.use: true
dirtbounties.place: true
dirtbounties.add: true
dirtbounties.view: true
dirtbounties.top: true
dirtbounties.claim: true
dirtbounties.anonymous: true
dirtbounties.bypass.cooldowns: true
dirtbounties.bypass.claimrules: true
+3
View File
@@ -0,0 +1,3 @@
artifactId=DirtBounties
groupId=com.dirtbagmc
version=1.0.0
@@ -0,0 +1,36 @@
com/dirtbagmc/dirtbounties/util/NumberUtil.class
com/dirtbagmc/dirtbounties/service/BountyService.class
com/dirtbagmc/dirtbounties/listener/BountyListener.class
com/dirtbagmc/dirtbounties/service/PlayerCacheService.class
com/dirtbagmc/dirtbounties/command/BountyAdminCommand.class
com/dirtbagmc/dirtbounties/command/BountyCommand.class
com/dirtbagmc/dirtbounties/service/HistoryService.class
com/dirtbagmc/dirtbounties/service/CombatTracker.class
com/dirtbagmc/dirtbounties/service/BountyService$Fee.class
com/dirtbagmc/dirtbounties/webhook/WebhookService.class
com/dirtbagmc/dirtbounties/gui/GuiManager$1.class
com/dirtbagmc/dirtbounties/service/AntiAbuseService.class
com/dirtbagmc/dirtbounties/model/BountyContribution.class
com/dirtbagmc/dirtbounties/gui/GuiHolder.class
com/dirtbagmc/dirtbounties/gui/GuiType.class
com/dirtbagmc/dirtbounties/util/TimeUtil.class
com/dirtbagmc/dirtbounties/DirtBountiesPlugin.class
com/dirtbagmc/dirtbounties/hook/DirtBountiesExpansion.class
com/dirtbagmc/dirtbounties/service/CombatTracker$CombatRecord.class
com/dirtbagmc/dirtbounties/economy/EconomyService$EconomyResult.class
com/dirtbagmc/dirtbounties/storage/StorageManager.class
com/dirtbagmc/dirtbounties/util/ColorUtil.class
com/dirtbagmc/dirtbounties/service/MessageService.class
com/dirtbagmc/dirtbounties/model/Bounty.class
com/dirtbagmc/dirtbounties/service/PlayerCacheService$CacheEntry.class
com/dirtbagmc/dirtbounties/model/ClaimValidation.class
com/dirtbagmc/dirtbounties/storage/StorageManager$PlayerCacheData.class
com/dirtbagmc/dirtbounties/util/ItemBuilder.class
com/dirtbagmc/dirtbounties/model/BountyHistoryRecord.class
com/dirtbagmc/dirtbounties/command/BountyCommand$ReasonInput.class
com/dirtbagmc/dirtbounties/gui/PendingBountyInput.class
com/dirtbagmc/dirtbounties/gui/PendingBountyInput$Stage.class
com/dirtbagmc/dirtbounties/config/ConfigService.class
com/dirtbagmc/dirtbounties/economy/EconomyService.class
com/dirtbagmc/dirtbounties/model/SuspiciousActivity.class
com/dirtbagmc/dirtbounties/gui/GuiManager.class
@@ -0,0 +1,28 @@
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/DirtBountiesPlugin.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/command/BountyAdminCommand.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/command/BountyCommand.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/config/ConfigService.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/economy/EconomyService.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/gui/GuiHolder.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/gui/GuiManager.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/gui/GuiType.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/gui/PendingBountyInput.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/hook/DirtBountiesExpansion.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/listener/BountyListener.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/model/Bounty.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/model/BountyContribution.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/model/BountyHistoryRecord.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/model/ClaimValidation.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/model/SuspiciousActivity.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/service/AntiAbuseService.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/service/BountyService.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/service/CombatTracker.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/service/HistoryService.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/service/MessageService.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/service/PlayerCacheService.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/storage/StorageManager.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/util/ColorUtil.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/util/ItemBuilder.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/util/NumberUtil.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/util/TimeUtil.java
/home/bitnix/Desktop/DirtBounties/src/main/java/com/dirtbagmc/dirtbounties/webhook/WebhookService.java