A lightweight, fully data-driven jobs plugin for Bukkit, Spigot, Paper, Purpur, and Folia — mine, farm, hunt, fish, buil
VJobs
Your server. Your economy.
A lightweight, fully data-driven jobs plugin — mine, farm, hunt, fish, build, brew, enchant and craft your way to a bigger wallet. Every price, every XP value, every job is yours to configure.
✨ Features
| Feature | Description |
|---|---|
| 10 built-in jobs | Miner, Farmer, Lumberjack, Hunter, Fisherman, Builder, Digger, Brewer, Enchanter, Weaponsmith. |
| 100% data-driven | Every material, mob, price and XP value lives in config.yml — add, remove, or rebalance jobs freely. |
| Leveling & Prestige | Configurable XP curve per job, plus a prestige system that resets a job for a permanent payout bonus. |
| Stacking Multipliers | Per-world, per-permission (VIP/MVP), and timed server-wide boost events. |
| Level-Up Rewards | Automatically pay bonus money and run console commands when a player hits a milestone level. |
| Anti-Exploit Cooldown | Location-based payout cooldown stops ore-regen farms, mine-and-replace tricks, and AFK grinders. |
| Job Limits & Switch Cooldown | Control how many jobs a player can hold and how often they can swap — all permission-driven. |
| Bedrock-friendly GUI | Clean chest GUI to browse, join, and leave jobs; click-only, works flawlessly via Geyser/Floodgate. |
| Per-job Leaderboards | See who's grinding hardest at a glance. |
| PlaceholderAPI Support | Job level, XP, and prestige for scoreboards, tab lists, and holograms. |
| SQLite or MySQL | Zero-setup local storage or a pooled MySQL backend for networks. |
📦 Dependencies
- Bukkit, Spigot, Paper, Purpur, or Folia — 1.21.x (Java 21) —
required - Vault —
required— SpigotMC (with any Vault-compatible economy plugin) - PlaceholderAPI —
optional— Modrinth
🔧 How It Works
Players pick one or more jobs via /vjobs. Each job listens for specific in-game actions — breaking blocks, harvesting crops, killing mobs, fishing, brewing, enchanting, crafting, or placing blocks — and pays out money and XP the moment a matching action happens, provided the location hasn't paid out again too recently.
XP accumulates per job using a configurable curve (xp-base * level ^ xp-exponent). Payouts are scaled by up to four stacking factors: world multiplier, permission multiplier (e.g. VIP/MVP), a timed boost event, and a permanent prestige bonus. Once a job hits its configured prestige level, players can reset it to level 1 for a permanent payout bump — up to a configurable number of tiers.
An anti-exploit cooldown tracks the exact location of every payout (block, fishing spot, brewing stand, kill spot) so the same spot can't be farmed repeatedly within a short window — without limiting normal, spread-out gameplay at all.
⚙️ Configuration
Every job, material, price, and XP value below is the shipped default — edit config.yml freely, nothing is hardcoded.
Click to expand the full config.yml
# =====================================================================
# VJobs - Configuration
# Everything here is 100% customizable: prices, XP, multipliers, cooldowns.
# =====================================================================
storage:
type: sqlite # sqlite or mysql
filename: local.db
mysql:
host: localhost
port: 3306
database: vjobs
user: root
password: ""
ssl: false
pool-size: 10
messages:
prefix: "&8[&6VJobs&8] &r"
actionbar-notification: true # "+12$ (Miner)" as an action bar message on every payout
# How many jobs a player may have at the same time.
# Additional slots via the permissions jobs.limit.<number> (highest matching number wins).
jobs-limit:
default: 1
# Cooldown before a player may take on a new job after last joining/leaving a job.
# default-seconds applies if the player has NONE of the cooldown permissions listed below
# (e.g. 86400 = only 1x per day). If a player has one or more of the permissions, the
# SHORTEST matching value applies.
job-switch-cooldown:
default-seconds: 86400
permissions:
jobs.cooldown.hour: 3600
jobs.cooldown.instant: 0
# Anti-exploit: the same block/spot (block coordinate, rounded fishing spot, brewing stand
# position, kill location) only pays out again once at least this many seconds have passed
# since the last payout at that exact spot. Prevents ore regeneration farming,
# mine+replace tricks, and automated mob/harvest farms at a fixed spot.
anti-exploit:
block-cooldown-seconds: 10
# XP required for level "n": xp-base * n ^ xp-exponent
xp-curve:
xp-base: 100
xp-exponent: 1.5
max-level: 100
prestige:
enabled: true
from-level: 100 # level at which prestige becomes available (=max-level)
max-tier: 10
bonus-per-tier-percent: 2.0 # permanent payout bonus per prestige tier
# Global multipliers applied to every payout (money + XP).
multipliers:
worlds:
world_nether: 1.2
world_the_end: 1.3
permissions:
jobs.multiplier.vip: 1.25
jobs.multiplier.mvp: 1.5
boost:
active: false
multiplier: 2.0
until-unix-millis: 0 # 0 = no time limit, otherwise automatically disabled after this point
# Rewards for reaching certain levels in a job.
# Optional: money (bonus payout), commands (console commands, %player% is replaced).
level-rewards:
miner:
"10": { money: 50.0 }
"25": { money: 150.0, commands: ["lp user %player% permission set jobs.perk.miner.fortune true"] }
"50": { money: 500.0 }
farmer:
"10": { money: 50.0 }
"25": { money: 150.0 }
hunter:
"10": { money: 50.0 }
"25": { money: 150.0 }
jobs:
miner:
display-name: "Miner"
description: "Mine ores and stone to earn money."
icon: DIAMOND_PICKAXE
actions:
break:
COAL_ORE: { money: 1.0, xp: 3 }
DEEPSLATE_COAL_ORE: { money: 1.0, xp: 3 }
COPPER_ORE: { money: 1.5, xp: 4 }
DEEPSLATE_COPPER_ORE: { money: 1.5, xp: 4 }
IRON_ORE: { money: 4.0, xp: 8 }
DEEPSLATE_IRON_ORE: { money: 4.0, xp: 8 }
GOLD_ORE: { money: 6.0, xp: 10 }
DEEPSLATE_GOLD_ORE: { money: 6.0, xp: 10 }
NETHER_GOLD_ORE: { money: 5.0, xp: 9 }
REDSTONE_ORE: { money: 3.0, xp: 6 }
DEEPSLATE_REDSTONE_ORE: { money: 3.0, xp: 6 }
LAPIS_ORE: { money: 3.0, xp: 6 }
DEEPSLATE_LAPIS_ORE: { money: 3.0, xp: 6 }
DIAMOND_ORE: { money: 12.0, xp: 20 }
DEEPSLATE_DIAMOND_ORE: { money: 12.0, xp: 20 }
EMERALD_ORE: { money: 15.0, xp: 25 }
DEEPSLATE_EMERALD_ORE: { money: 15.0, xp: 25 }
NETHER_QUARTZ_ORE: { money: 2.0, xp: 5 }
ANCIENT_DEBRIS: { money: 40.0, xp: 60 }
STONE: { money: 0.1, xp: 1 }
DEEPSLATE: { money: 0.1, xp: 1 }
COBBLESTONE: { money: 0.05, xp: 1 }
farmer:
display-name: "Farmer"
description: "Harvest crops to earn money."
icon: WHEAT
actions:
harvest:
WHEAT: { money: 1.0, xp: 3 }
CARROTS: { money: 1.0, xp: 3 }
POTATOES: { money: 1.0, xp: 3 }
BEETROOTS: { money: 1.2, xp: 3 }
NETHER_WART: { money: 1.5, xp: 4 }
PUMPKIN: { money: 2.5, xp: 5 }
MELON: { money: 2.0, xp: 4 }
SUGAR_CANE: { money: 0.8, xp: 2 }
COCOA: { money: 1.5, xp: 4 }
CACTUS: { money: 0.8, xp: 2 }
lumberjack:
display-name: "Lumberjack"
description: "Chop trees to earn money."
icon: OAK_LOG
actions:
break:
OAK_LOG: { money: 1.5, xp: 4 }
SPRUCE_LOG: { money: 1.5, xp: 4 }
BIRCH_LOG: { money: 1.5, xp: 4 }
JUNGLE_LOG: { money: 1.8, xp: 4 }
ACACIA_LOG: { money: 1.8, xp: 4 }
DARK_OAK_LOG: { money: 2.0, xp: 5 }
MANGROVE_LOG: { money: 2.0, xp: 5 }
CHERRY_LOG: { money: 2.0, xp: 5 }
CRIMSON_STEM: { money: 2.2, xp: 5 }
WARPED_STEM: { money: 2.2, xp: 5 }
hunter:
display-name: "Hunter"
description: "Kill monsters to earn money."
icon: IRON_SWORD
actions:
kill:
ZOMBIE: { money: 3.0, xp: 6 }
SKELETON: { money: 3.0, xp: 6 }
SPIDER: { money: 3.0, xp: 6 }
CREEPER: { money: 4.0, xp: 8 }
ENDERMAN: { money: 6.0, xp: 12 }
WITCH: { money: 6.0, xp: 12 }
DROWNED: { money: 3.5, xp: 7 }
PILLAGER: { money: 4.0, xp: 8 }
VINDICATOR: { money: 5.0, xp: 10 }
BLAZE: { money: 7.0, xp: 14 }
WITHER_SKELETON: { money: 8.0, xp: 16 }
WARDEN: { money: 100.0, xp: 200 }
ENDER_DRAGON: { money: 250.0, xp: 500 }
WITHER: { money: 200.0, xp: 400 }
fisherman:
display-name: "Fisherman"
description: "Fish for treasure to earn money."
icon: FISHING_ROD
actions:
fish:
COD: { money: 2.0, xp: 5 }
SALMON: { money: 2.5, xp: 5 }
PUFFERFISH: { money: 3.0, xp: 6 }
TROPICAL_FISH: { money: 4.0, xp: 8 }
BOW: { money: 5.0, xp: 10 }
NAME_TAG: { money: 8.0, xp: 15 }
SADDLE: { money: 10.0, xp: 18 }
ENCHANTED_BOOK: { money: 15.0, xp: 25 }
builder:
display-name: "Builder"
description: "Place blocks to earn money."
icon: BRICKS
actions:
place:
STONE: { money: 0.05, xp: 1 }
BRICKS: { money: 0.3, xp: 1 }
OAK_PLANKS: { money: 0.2, xp: 1 }
GLASS: { money: 0.2, xp: 1 }
WHITE_WOOL: { money: 0.2, xp: 1 }
QUARTZ_BLOCK: { money: 0.4, xp: 2 }
DEEPSLATE_TILES: { money: 0.4, xp: 2 }
digger:
display-name: "Digger"
description: "Dig dirt and sand to earn money."
icon: DIAMOND_SHOVEL
actions:
break:
DIRT: { money: 0.1, xp: 1 }
GRASS_BLOCK: { money: 0.1, xp: 1 }
SAND: { money: 0.1, xp: 1 }
GRAVEL: { money: 0.15, xp: 1 }
CLAY: { money: 0.3, xp: 2 }
SOUL_SAND: { money: 0.2, xp: 1 }
SNOW_BLOCK: { money: 0.1, xp: 1 }
brewer:
display-name: "Brewer"
description: "Brew potions to earn money."
icon: BREWING_STAND
actions:
brew:
POTION: { money: 3.0, xp: 6 }
SPLASH_POTION: { money: 5.0, xp: 10 }
LINGERING_POTION: { money: 7.0, xp: 14 }
enchanter:
display-name: "Enchanter"
description: "Enchant items to earn money."
icon: ENCHANTING_TABLE
actions:
enchant:
# applies to every enchantment, scaled by the XP levels consumed
default: { money-per-level: 2.0, xp-per-level: 5 }
weaponsmith:
display-name: "Weaponsmith"
description: "Craft weapons to earn money."
icon: DIAMOND_SWORD
actions:
craft:
WOODEN_SWORD: { money: 1.0, xp: 2 }
STONE_SWORD: { money: 2.0, xp: 4 }
IRON_SWORD: { money: 6.0, xp: 10 }
GOLDEN_SWORD: { money: 6.0, xp: 10 }
DIAMOND_SWORD: { money: 20.0, xp: 30 }
NETHERITE_SWORD: { money: 40.0, xp: 60 }
BOW: { money: 8.0, xp: 12 }
CROSSBOW: { money: 10.0, xp: 15 }
🔑 Commands & Permissions
| Command | Permission | Default |
|---|---|---|
/vjobs [gui] |
jobs.use |
true |
/vjobs join <job> |
jobs.use |
true |
/vjobs leave <job> |
jobs.use |
true |
/vjobs info <job> |
jobs.use |
true |
/vjobs top <job> |
jobs.use |
true |
/vjobs prestige <job> |
jobs.use |
true |
/vjobs togglenotify |
jobs.use |
true |
/vjobs admin reload |
jobs.admin |
op |
/vjobs admin set <player> <job> <level> |
jobs.admin |
op |
| — | jobs.limit.2 – jobs.limit.5 |
false |
| — | jobs.cooldown.hour / jobs.cooldown.instant |
false |
| — | jobs.multiplier.<name> (custom, defined in config) |
— |
Aliases: /jobs, /job
📋 Placeholders
Requires PlaceholderAPI to be installed.
| Placeholder | Description |
|---|---|
%jobs_level_<job>% |
Player's current level in <job> |
%jobs_xp_<job>% |
Player's current XP in <job> |
%jobs_prestige_<job>% |
Player's current prestige tier in <job> |
🚀 Getting Started
- Drop
VJobs-<version>.jarinto yourplugins/folder. - Start your server once to generate
config.ymlandmessages.yml. - Tweak jobs, prices, and storage settings to fit your server.
- Reload with
/vjobs admin reload— no restart needed.
👥 Credits
| LucasTHCR | Creator & maintainer |
Discord: dc.gg/paperstream
Open source under the MIT License. VJobs depends only on the standard Vault and PlaceholderAPI ecosystem — free of third-party plugin lock-in.
Pinned Versions
- R1.21–26.2
Pages
Members
Owner