Jobs

A job watches for one kind of action and pays money and xp when it fires. Players do not join or leave a job, everyone works all six at once.

The six bundled jobs

Job Trigger Pays for
Miner BLOCK_BREAK Stone, deepslate, the ore family, ancient debris
Lumberjack BLOCK_BREAK Logs and nether stems
Hunter ENTITY_KILL Any mob, priced per heart
Farmer BLOCK_BREAK Crops, multi-stage plants, right-click harvests
Fisherman FISH Anything reeled in
Enchanter ENCHANT Each enchant at a table
Six is not a limit

The job list is just config. Add a seventh block to jobs.yml with its own name, trigger, and icon and it shows up in the menu. See jobs.yml.

How a payout is worked out

Money on each matching action:

payout = units / per * (base + per-level * currentLevel)
  • units is 1 for a block, a fish, or an enchant. For a per-heart job it is the mob’s hearts.
  • per spreads the base across several actions. The miner ships at base: 0.10 with per: 10, so ten blocks pay 0.10 in total at level 1.
  • per-level is what each job level adds to the base.

XP is simpler:

xp += per-action     (times the mob's hearts when scale-by-hearts is on)
Check the numbers in game

/corejobs job setlevel <player> <job> <level> jumps a job to a level so you can see what the payout reads like there without grinding to it.

Per-block pricing

A BLOCK_BREAK job can price single materials instead of paying one flat rate:

money:
  base: 0.05
  per: 1
  per-level: 0.0
  per-block:
    CHORUS_FLOWER: 0.10
    CHORUS_PLANT: 0.05
xp:
  per-action: 1.0
  per-block:
    CHORUS_FLOWER: 1.0
    CHORUS_PLANT: 0.5

A material listed under per-block uses that value. Everything else falls back to money.base and xp.per-action. That is how one job can pay differently for stone and diamond ore, or split a chorus flower from a chorus stem.

Multi-stage plants

Breaking the bottom of a sugar cane stack drops every block above it, but the server only reports the one block the player hit. Without help, that is all the plugin would pay for.

The multi-block section of config.yml fixes that by counting the whole plant on the one break:

Column
Connected up
Connected down

Sugar cane, cactus, bamboo, kelp. Breaking one counts everything stacked directly on top.

Chorus plant and chorus flower. Breaking a stem counts it and every attached block at or above it, so a trunk pays for the branches and flowers it carries. Breaking a flower off the top pays for the flower alone.

Vines. Breaking one counts it and every attached block at or below it, which is how a vine curtain drops.

Price each block under per-block so a tall stack pays a sensible total.

Maturity does not gate these

require-mature: true on the farmer stops an unripe wheat crop from paying. Multi-stage plants never report as mature, so they are handled by multi-block instead and skip that check.

Harvest blocks

harvest-blocks covers materials you pick by right-clicking when ripe, the way sweet berries and glow berries work in vanilla. The pick grants xp, and money only if you give the material a money.per-block entry.

List them under harvest-blocks, not blocks

A harvest material listed under blocks would also pay when the bush itself is broken, which is not what you want.

Anti place-and-break

anti-placement-dupe: true in config.yml stops the loop where a player places a block and breaks it again for free xp. A block the player placed by hand pays no xp, no money, and no drops.

Still paid in full:

  • A plant that grew on its own off a placed base, like a sugar cane stalk growing up.
  • A crop that reached maturity after being planted.
  • A placed block that has since turned into something else, like a chorus flower that grew into a chorus plant.
The record is in memory

A restart forgets every placement. That is fine in practice since nobody grinds through a restart, but it does mean the protection starts fresh each boot.

Next

Levels, the xp curve, and the prestige loop are on Levels & Prestige. Every key behind the numbers above is on jobs.yml.