CombatJobs Documentation
CombatJobs is combat-first job progression for Paper: 13 combat jobs, 7 passive jobs and one that fits either slot, each with 500-level skill trees, tiered titles and skill decay — built around an interdependent economy, clans, bounties, ranked arenas, tournaments, a seasonal pass, prestige and leaderboards. It has no hard dependencies: every integration is optional and has a working built-in fallback.
Overview
The three ideas the rest follows from
- One job at a time. A player runs a single job until they craft the Oathstone, which unlocks a second job in the opposite category — a combat player gains a passive job, a passive player gains a combat one. The Oathstone is also the switching device, and switching is deliberately gated: 20 blocks of clear space, 20 seconds without taking damage, and a cooldown.
- Every job has a weakness that another job answers. Weaknesses are shown to a player before they commit. A Warrior burns through armour; a Blacksmith repairs it. That demand is what makes the economy work, and why a server can be deliberately combat-weighted — a few passive players supply a large fighting population through owned Workstations.
- Combat is never penalised for being popular. Balance is done by raising scarce rewards, never by lowering plentiful ones. If passive players are rare, their Workstation payouts and quest rewards go up; combat rewards never go down.
What is data and what is code
Jobs, skill trees, titles and abilities are YAML. Adding a job is a file. An ability names one of 25 primitives and gives it parameters, so a new ability is data too. The default roster ships 275 abilities (133 active, 142 passive). See Writing jobs in YAML.
Getting Started
Requirements
| Server | Paper 1.21+ (built and tested against Paper 26.2) |
| Java | 21 or newer. The jar is Java 21 bytecode; the server itself may need newer. |
| Dependencies | None. depend: [], and the plugin runs on bare Paper. |
| Database | Nothing to set up. SQLite by default; MySQL/MariaDB for a network. |
Install
- Drop the jar in
plugins/and start the server. - Read the start-up banner. It prints what the plugin actually found:
Start every support conversation with this block. It is the difference between what a server has and what its owner believes it has.Storage ............. SQLite (combatjobs.db) Jobs ................ 21 (13 combat, 7 passive, 1 either), 506 titles Abilities ........... 275 abilities (133 active, 142 passive) from 25 primitives Permissions ......... LuckPerms 5.5.77 (contexts + meta) Economy ............. internal economy (online players only) Anti-cheat .......... none Land claims ......... none (world list unrestricted) Network ............. none (single server) - Stop the server, edit
plugins/CombatJobs/config.yml, start it again.
A bad value in config.yml is rejected as a whole file, with every problem named, and the previous settings keep running. A typo never half-applies.
Verify it
/cj capabilities what integrations resolved
/cj debug cache profiles in memory
/cj leaderboard which boards this server has, and how full
/cj diagnose writes a full support report to plugins/CombatJobs/diagnostics/
/cj diagnose contains no passwords or tokens — only whether each is set — so it is safe to attach to a support thread.
Five Settings to Decide
1. Storage
SQLite needs nothing and is right for one server. For a network, point every server at one MySQL/MariaDB:
storage:
type: MYSQL
host: 10.0.0.5
database: combatjobs
username: combatjobs
password: '…'
use-ssl: false # true means full certificate verification
use-ssl: false disables TLS entirely and is only safe on the same host or private network. true means sslMode=verify-full, which refuses a self-signed certificate.
2. Economy
With Vault and an economy behind it, the plugin uses that. Without, it uses an internal economy — which works, but only knows about online players, so an offline player cannot be paid by a Workstation until they log in. That is why Vault is worth having.
3. Anti-cheat exemptions
Dashes, leaps and speed buffs look exactly like the cheats a movement check exists to catch. Exemption is done by bypass permission, granted for the length of the exemption window. Set this before you open to players — see Compatibility.
4. Arenas — define one before switching them on
arenas.enabled ships false, and the loader refuses true with no arena defined. Stand where one side should arrive and run /cj arena define <id>; walk to the other side and run it again. The second run prints the block, ready to paste under arenas.arenas:
colosseum:
display-name: 'Colosseum'
world: world
enabled: true
spawns:
- { x: 100.5, y: 65.0, z: 100.5, yaw: 0, pitch: 0 }
- { x: 130.5, y: 65.0, z: 100.5, yaw: 180, pitch: 0 }
Then set arenas.enabled: true and /cj reload. One spawn per side, not per player — two spawns is all a 3v3 needs. It prints rather than saves on purpose: rewriting config.yml from code would strip every comment in it.
5. Which optional systems you want
Workstations, trading, the tavern, quests, bounties, clans, arenas, tournaments, the pass, prestige, leaderboards and decay each have an enabled switch. Turning one off removes it cleanly — its commands say so, its leaderboards stop existing, and anything that checked it stops checking.
The Job Roster
Every combat job declares an archetype, which arena matchmaking uses to balance teams by role as well as rating.
Combat jobs
| Job | Archetype | Identity |
|---|---|---|
| Warrior | Bulwark | Frontline anchor. Holds a line, absorbs punishment and controls the fight. |
| Templar | Bulwark | Tank and support in one. Shields allies, holds the line, hits like a pillow. |
| Assassin | Skirmisher | Stealth and a single decisive strike. Devastating opener, nothing afterwards. |
| Duelist | Skirmisher | The one-on-one specialist. Timing, counters, and total dominance of a fair fight. |
| Rogue | Skirmisher | Hit hard, leave immediately. The highest skill ceiling on the roster. |
| Monk | Brawler | Unarmed, unarmoured and unstoppable. Mobility and self-sustain instead of gear. |
| Reaver | Brawler | Damage climbs as your own health falls. Lifesteal, no brakes, no retreat. |
| Archer | Ranged | Ranged damage and kiting. Punishing at distance, helpless once closed down. |
| Mage | Caster | Area damage, utility and burst. Devastating at range, fragile up close. |
| Healer | Support | Keeps everyone else alive. Cannot win a fight alone, and is not meant to. |
| Bard | Support | Amplifies everyone around you. Alone, you are almost harmless. |
| Beastmaster | Commander | Your beasts do the fighting. Without them you are barely a threat. |
| Necromancer | Commander | Replaces allies with minions. Slow to start, overwhelming once rolling. |
Passive jobs
| Job | Identity |
|---|---|
| Blacksmith | Weapons, armour and repairs. Every gear-dependent job on the server needs you. |
| Enchanter | Enchantments and runes. Everyone is your customer; your own progress pays for it. |
| Farmer | The root of the chain. Crops, feathers and reagents that four other jobs depend on. |
| Fletcher | Arrows, bows and quivers. The Archer does not exist without you. |
| Innkeeper | Bonus food and tavern services. Every combat player visits you before a fight. |
| Merchant | Produces nothing, moves everything. Sets the price of every good on the server. |
| Miner | The bottom of the supply chain. Ore, stone, lapis and gems for everyone else. |
Either slot
Alchemist (Caster) — debuffs and area denial in a fight; potions and reagents in a town.
Optional job pack
Six extra passive jobs — baker, diplomat, fisherman, guide, lumberjack, tailor — ship inside the jar under jobs-optional/ rather than switched on. Copy the ones you want into plugins/CombatJobs/jobs/ and restart.
Progression
Skill trees and levels
- Each job has its own trees, and each tree levels 0–500 independently.
- The average of a job's trees drives the title tier and the Oathstone level gate — the same number shown on
/skillsand on the leaderboard. - Nodes unlock an ability at a breakpoint; scaling applies at every single level, so the gaps between breakpoints still count.
- XP cost starts at
progression.xp.base(100) and grows bygrowth(1.012) per level.
Abilities
Passive abilities apply while their tree level is held. Active abilities are bound to a hotbar slot in /abilities and cast with sneak + right-click.
Titles
Each job has a tiered title ladder; titles are globally unique across jobs. /title reroll rerolls within your tier for a fee (free with combatjobs.reroll.free).
The Oathstone and switching
The Oathstone unlocks your second job (in the opposite category) at job level 100 and is the item you switch with. The default recipe:
E S E E = Echo Shard (Ancient City)
N H N S = Nether Star (the Wither)
E T E N = Netherite Ingot
H = Heart of the Sea (buried treasure)
T = Totem of Undying (Woodland Mansion)
Right-click it to switch. Every condition must hold at once, and a failed check says which one and how long is left:
| Setting | Default | Meaning |
|---|---|---|
switch.min-player-distance | 20 | No other player within this many blocks |
switch.damage-free-seconds | 20 | No damage taken for this long |
switch.cooldown-seconds | 86400 | 24 hours between switches (bypass: combatjobs.switch.bypass-cooldown) |
switch.blocked-in-arena | true | No switching during an arena match |
The job you are not running still earns 25% of its normal XP and decays at 50% of the normal rate (inactive-job.*). Lost your Oathstone? /oathstone re-issues it.
Decay
Skills decay when a player is idle — but with guard rails so it is never punishing: nothing decays for the first 72 hours idle, then 1 level per hour, never below level 100, and never below the floor of the title tier you hold (decay.*).
Hero
Taking a job to the mastery cap — level 500 in all of its trees, not on average — gives a small chance (0.5% by default) to be crowned Hero. Heroes get an exclusive Ascendance tree that levels from a share of the XP they already earn, and carry an economic tax that applies at all times. hero.roll-trigger can roll on MASTERY, on PRESTIGE, or BOTH.
Prestige
/prestige previews, then /prestige confirm resets a mastered job for a permanent perk. Prestiging takes you off that job's level board, because its trees go back to zero; the prestige board ranks you instead.
Workstations & Economy
Everything a player can pay — a repair, a meal, a trade, an enchant — is priced through that player's own attributes, so a job's economic weakness is real rather than documented.
Workstations
Passive players place and own Workstations, set a fee with /workstation fee <percent> (default 15%, maximum 40%), and earn while combat players use them — including while the owner is offline, capped at 24 hours of output. Up to 3 per player, from job level 50, at least 16 blocks apart.
| Workstation | Owned by |
|---|---|
| Forge | Blacksmith |
| Fletching Bench | Fletcher |
| Rune Table | Enchanter |
| Brewery | Alchemist |
| Tavern Bar | Innkeeper |
| Mill | Farmer |
| Market Stall | Merchant |
Population and scarcity
population.combat-target and passive-target set the split the server aims for. When passive players are below target, Workstation payouts, quest rewards and the tavern markup rise. One-directionally: nothing ever falls below its configured value when combat players are plentiful. Put %combatjobs_scarcity_<job>% somewhere players can see it — it tells them which job is underserved and paying more.
Trading, the tavern and quests
/trade <player>runs an escrowed trade of items and currency, with a configurable tax and a list of things that may not be traded.- The tavern innkeeper sells bonus food with rarity tiers and spoilage.
/questsopens the quest board, served by guild workers in the world.
Clans, Arenas & the Pass
- Bounties —
/bounty place <player> <amount>puts a price on a head;/bounty withdrawtakes your own stake back. Heroes carry a standing bounty. - Clans — ranks, a shared vault, renown, and wars declared with a stake (
/clan war declare <clan> <stake>). Area abilities spare your own clan. - Ranked arenas — 1v1, 2v2 and 3v3 brackets with Elo ratings, matchmaking balanced by rating and archetype.
/arena topis the ladder. - Tournaments — scheduled, with an entry fee and a prize table; rounds are arena matches.
- Season pass — 50 tiers with free and premium tracks and a daily XP cap. Pass XP comes from skill levels, Workstation use, bounties, arena matches and wins, tournaments and prestige. Premium is held through
combatjobs.pass.premiumor a stored purchase. - Seasons — incrementing
season.numberstarts a new season for the pass, arena ratings and per-season boards at once. Nothing is deleted. - Leaderboards — 28 boards on the default roster, refreshed every 5 minutes.
/topprints each board's age.
Writing Jobs in YAML
There are three layers, and each one names the layer under it:
jobs/warrior.yml a tree node names an ABILITY -> cj:shield_wall
abilities.yml an ability names a PRIMITIVE -> shield, radius 4, 6s
(code) 25 primitives the only part in Java
A job file
plugins/CombatJobs/jobs/<id>.yml — the file name is the job id.
display-name: 'Warrior'
slot: COMBAT # COMBAT | PASSIVE | EITHER
rarity: common
archetype: BULWARK # combat jobs only
identity: 'Frontline anchor. Holds a line, absorbs punishment and controls the fight.'
# Shown to the player BEFORE they commit to this job.
combat-weakness: 'Slow on foot, poor against anything that kites, and a low critical rate.'
economic-weakness: '1.5x armour and weapon durability loss.'
creates-demand-for: [ 'blacksmith', 'miner' ]
strengths:
damage_taken: { op: MULTIPLY, value: 0.88, range: [0.85, 0.95] }
max_health: { op: ADD, value: 4.0, range: [2.0, 8.0] }
weaknesses:
movement_speed: { op: MULTIPLY, value: 0.92, range: [0.88, 0.96] }
durability_loss_multiplier: { op: MULTIPLY, value: 1.5, range: [1.3, 1.7] }
trees:
tank:
display-name: 'Tank'
description: 'Soak damage and hold ground.'
scaling:
damage_taken: { op: MULTIPLY, per-level: -0.0004, cap: 0.2 }
nodes:
- { level: 1, ability: 'cj:damage_reduction' }
- { level: 20, ability: 'cj:knockback_resist' }
- { level: 440, ability: 'cj:last_stand' }
titles:
- { tier: 1, min-level: 0, names: [ 'Recruit', 'Footman' ] }
- { tier: 2, min-level: 50, names: [ 'Sergeant', 'Shieldbearer' ] }
Rules the loader enforces
- Every job needs a declared weakness. A job with no weakness generates no demand for another job.
- Title strings are globally unique. The plugin refuses to start on a collision.
- A combat job should declare an
archetype— one of seven. An unrecognised one is refused; a missing one is a warning. - An ability key that does not exist unlocks nothing and is named in the log at start-up.
range is the band a value may move within when it is rolled per player, which is what makes two Warriors slightly different. Strengths and weaknesses feed the same resolver, so a strength and an equal weakness cancel out exactly.
An ability
abilities:
'cj:shield_wall':
name: 'Shield Wall'
description: 'Raise a barrier that absorbs the next few hits.'
primitive: shield
cooldown: 45
params:
amount: 8.0
duration: 6
Whether an ability is passive or active is decided by its primitive. An ability that moves a player declares its anti-cheat exemption reason on the primitive, so a dash added as YAML is exempted without anyone remembering to do it. After editing, run /cj reload: a bad roster is refused with every problem named, and the previous roster keeps serving players.
Commands
Player commands
Every player command defaults to everyone, through combatjobs.command.<name>.
| Command | What it does |
|---|---|
/job · /job compare <job> | Your job, its strengths and weaknesses; side by side with another job |
/skills | Progress in each of your job's skill trees |
/title · /title reroll | Your current title; reroll within your tier for a fee |
/abilities | Your abilities, and hotbar binding |
/oathstone | Re-issue your Oathstone if it has gone missing |
/workstation · /workstation fee <percent> | The Workstations you own; set what you charge (alias /ws) |
/trade <player> · accept · deny | Offer a trade, or answer one |
/quests | The quest board |
/bounty · place <player> <amount> · withdraw <player> | The bounty board; put a price on somebody; take your stake back |
/clan · create/invite/kick/promote/leave/disband | Your clan, or how to found one; run it |
/clan deposit <amount> · /clan war declare <clan> <stake> | Pay into the vault; start a war |
/prestige · /prestige confirm | Preview, then confirm, a prestige |
/arena | Queue, leave, stats and the ladder |
/tournament | Sign up, leave, and see the bracket |
/pass · claim · rewards | Season pass progress, and collecting rewards |
/top · /top <board> | Which boards this server has; one board with your rank and its age |
Admin commands
All under /cj (alias /combatjobs).
| Command | What it does | Permission |
|---|---|---|
/cj reload | Re-read config and messages | combatjobs.admin.reload |
/cj capabilities | What integrations resolved, and to what | combatjobs.admin.reload |
/cj debug stats [player] | Resolved attributes next to their base values | combatjobs.admin.debug |
/cj debug cache|abilities|oathstone|population|workstations|bounties|clans | Live state of one subsystem | combatjobs.admin.debug |
/cj setjob <player> <job> | Move somebody to a job | combatjobs.admin.setjob |
/cj setlevel <player> <skill> <level> | Set a tree's level | combatjobs.admin.setlevel |
/cj grant hero|oathstone <player> | Crown a Hero, or issue an Oathstone | combatjobs.admin.givehero |
/cj eco give|take|set|balance <player> [amount] | The internal economy | combatjobs.admin.eco |
/cj bounty clear <player> | Take a price off a head | combatjobs.admin.bounty |
/cj clan disband <clan> · war cancel · renown <clan> <n> | Take clans apart | combatjobs.admin.clan |
/cj arena list|cancel|clearqueue|setrating <player> <bracket> <n> | Arena operations | combatjobs.admin.arena |
/cj arena define <id> · define <id> clear | Mark an arena out by standing in it | combatjobs.admin.arena |
/cj tournament open|start|cancel|info | Tournament operations | combatjobs.admin.tournament |
/cj pass grant <player> · xp <player> <n> · info <player> | Pass operations | combatjobs.admin.pass |
/cj leaderboard · refresh | Every board and its rows; re-read them now, off the main thread | combatjobs.admin.leaderboard |
/cj network · players · peers · ping | The cross-server bridge: transport, peers, traffic, handoffs | combatjobs.admin.network |
/cj player <name> | Everything the plugin knows about somebody, online or offline — and which of the two it read | combatjobs.admin.player |
/cj purge <days> | Delete players nobody has seen for that long (minimum 30). Asks twice | combatjobs.admin.purge |
/cj diagnose | Write a support report to plugins/CombatJobs/diagnostics/ | combatjobs.admin.diagnose |
/cj purge deletes player data with no undo, and takes purged players' Workstations and clan memberships with them. Purging a clan's leader leaves the clan without one. It keeps anybody online, here or anywhere on the network.
Permissions
| Permission | Default | Effect |
|---|---|---|
combatjobs.command.<name> | everyone | Use that player command (job, skills, title, oathstone, abilities, workstation, trade, quests, bounty, clan, prestige, arena, tournament, pass, top) |
combatjobs.admin.* | op | Every admin permission except combatjobs.admin.purge, which must be granted by name |
combatjobs.admin.<area> | op | reload, debug, setjob, setlevel, givehero, workstation (break someone else's), eco, bounty, clan, arena, tournament, pass, leaderboard, network, player, purge, diagnose |
combatjobs.pass.premium | false | Hold the premium pass track (e.g. from a donor rank) |
combatjobs.reroll.free | false | Reroll a title without paying |
combatjobs.switch.bypass-cooldown | false | Switch jobs without waiting out the cooldown |
Placeholders
Through PlaceholderAPI as %combatjobs_<key>% and through MiniPlaceholders as <combatjobs_<key>>. Every value is read from memory — nothing here touches the database.
| Key | Value |
|---|---|
job · job_id | Active job's display name · id |
job_combat · job_passive · slot | Combat and passive job names; which slot is active |
title · tier · rarity | Current title, its tier, the active job's rarity |
level · skill_<tree> · level_<job> | Average level of the active job · one tree · a named job |
mastery_count · hero · oathstone · switch_cooldown | Mastered jobs, Hero status, Oathstone held, time left to switch |
prestige · prestige_total · prestige_marker | Prestige of the active job, across every job, and its symbol |
clan · clan_tag · clan_rank · clan_vault · clan_renown · clan_members · clan_wins · clans | Clan details, and how many clans exist |
rating_<bracket> | Rating in 1v1, 2v2, 3v3 |
pass_tier · pass_tiers · pass_xp · season · season_name | Season pass and season |
population_total · population_combat · population_passive · population_<job> | Players online with a job, by slot and by job |
population_combat_share · population_passive_share | The split as a percentage of target |
scarcity_<job> | The income multiplier scarcity is applying to that job |
top_<board>_<n> · top_<board>_<n>_value · rank_<board> | Leaderboard rows, and this player's position (blank outside the board) |
Board ids come from /top: a job board is level_<job>; the rest are level, mastery, prestige, pass, balance, clan_renown, clan_wins. n is bounded by leaderboards.size. Values are inserted unparsed, so apply your own colours around them.
Configuration
config.yml is the reference — every setting carries a comment saying what it does and why the default is the default. messages.yml holds every line the plugin says, in MiniMessage.
How a reload works
/cj reload re-reads config.yml and messages.yml. An invalid file is rejected as a whole and the previous settings keep running. storage.*, network.transport, network.redis.* and license.key need a restart. A reload also calls off running arena matches (unrated), cancels and refunds a running tournament, re-places innkeepers and guild workers, and rebuilds leaderboards.
The sections
| Section | What it decides |
|---|---|
license | Your licence key — only the released jar checks it |
general | Debug logging, bStats, locale |
storage | SQLite or MySQL, and the write-behind interval |
integrations | Vault, LuckPerms depth, PlaceholderAPI, Discord, anti-cheat exemptions |
first-job · progression | What a new player rolls into; level cap, XP curve, mastery cap |
switch · inactive-job · oathstone | The switching gate; the off-job's XP and decay rates; the recipe and level gate |
titles · decay · hero · prestige | Reroll cost and display; decay rules and floors; the Hero roll and tree; prestige cap |
population | The combat/passive target split and the scarcity multipliers it drives |
combat · gathering · abilities | Damage listener priority; which blocks route XP where; cooldowns and hotbar binding |
display | Nameplates, tab list and chat — each switchable |
workstations · trading · tavern · quests | The economy systems |
bounties · clans · arenas · tournaments | The PvP systems |
season · pass · leaderboards | Season number and name, the pass, and the boards |
network | Cross-server sync — see Networks |
Settings whose consequences are not local
storage.write-behind-seconds(30) — a ceiling on what a hard crash can lose, and on a network the latency of clan and bounty sync.progression.mastery-level— what "mastered" means for Hero, prestige and themasteryboard at once.combat.damage-listener-priority(NORMAL) — where this plugin's damage scaling sits relative to mcMMO, Jobs Reborn or custom-enchant plugins.leaderboards.refresh-minutes(5) — lower is not better: each refresh is one query per board against the shared database.
Networks
Point every server at the same MySQL/MariaDB database first. That alone gives one profile per player wherever they log in, and leaderboards that are network-wide by construction. The bridge adds what memory-held state needs:
| Without the bridge | With it | |
|---|---|---|
| A player switching servers | May lose up to write-behind-seconds of progress | Nothing lost (profile handoff) |
| Clan rosters, vaults, wars, bounties | Stale on other servers until restart | In step within one write-behind sweep |
| The arena ladder | Per server | One ladder |
| Hero crowned, bounty placed or collected, tournament won, war ended | Announced on one server | Announced on all of them |
The bridge carries notices; the database carries state. A message says "clan 3f2a changed" and the server that hears it re-reads clan 3f2a — so a message applied twice, out of order or lost can never cost anybody a coin.
Transports
network:
enabled: true
server-id: lobby-1 # MUST differ on every server
transport: REDIS # REDIS | PROXY | NONE
channel: combatjobs
redis:
host: 10.0.0.6
port: 6379
password: '…'
REDIS(recommended) works with nobody online and between servers not behind the same proxy. Tested against a real Redis 8.10.1.PROXYuses BungeeCord's / Velocity'sForwardsubchannel, with one limitation: a server with nobody online cannot send. Those messages are dropped and counted in/cj network.NONE(default) is correct for one server.
server-id must be unique. Two servers sharing an id each ignore everything the other says, while the bridge reports itself healthy. Tune handoff-timeout-ms (750, bounded 50–5000) and heartbeat-seconds (30) for your latency.
Compatibility
Run means exercised on a running server; Compiled means compiled against the real jar but not yet run with it installed.
| Integration | Status | Notes |
|---|---|---|
| LuckPerms | Run | Job contexts (combatjobs:job=warrior), meta values, optional prefix sync |
| Vault | Run | Any Vault economy. Internal fallback is online players only |
| PlaceholderAPI · MiniPlaceholders | Run | Both can be installed at once |
| Shared MySQL/MariaDB · Redis | Run | Profiles, leaderboards and the bridge |
| BungeeCord / Velocity messaging | Compiled | Needs a player online to send |
| Towny · WorldGuard · GriefPrevention · Lands | Compiled | Consulted before a Workstation is placed. WorldGuard gets the flags combatjobs-workstations and combatjobs-abilities |
| Citizens · ItemsAdder | Compiled | Innkeeper and guild worker NPCs; weapon skins. Built-in NPCs and vanilla items are the fallback |
| DiscordSRV | Compiled | Hero and bounty announcements. Off by default |
| GrimAC · NoCheatPlus · Vulcan · Matrix · Spartan | Configured, not verified | Exempted by bypass permission — see below |
| PlotSquared | Not written | Its API does not resolve from any public repository |
Anti-cheat
integrations:
anticheat:
exempt-on-ability: true
linger-millis: 1500
bypass-permissions:
- 'grim.exempt' # GrimAC
- 'vulcan.bypass' # Vulcan
- 'spartan.bypass' # Spartan
- 'matrix.bypass' # Matrix
- 'nocheatplus.checks' # NoCheatPlus
# Optional: narrower nodes per reason (velocity | teleport | movement | fall | combat)
bypass-permissions-by-reason:
teleport: [ 'nocheatplus.checks.moving.morepackets' ]
None of these anti-cheats had a Minecraft 26.2 build when this was tested, so check the node against your anti-cheat's own documentation for the version you run.
Known overlaps
- Other job and damage plugins (Jobs Reborn, mcMMO, custom enchants) all scale the same hit; the result is their multipliers times ours.
combat.damage-listener-prioritydecides the order. - Combat tagging plugins have their own idea of "in combat"; this plugin's damage-free switch timer is independent of theirs.
- Chat and tab plugins — switch the matching
displayoption off and use the placeholders instead.
Licensing
The released jar checks a licence key, put in plugins/CombatJobs/license.key as a single line (preferred) or in config.yml under license.key. The check is entirely offline: the key is a signed statement verified locally, with no phone-home, heartbeat or telemetry.
| State | What the plugin does |
|---|---|
| Valid | Starts. The banner names the licence holder |
| Missing, malformed, or not signed | Refuses to start, with a boxed message saying why |
| Expired, within 14 days | Starts, with a boxed warning counting down the days |
| Expired, more than 14 days ago | Refuses to start |
Nothing is ever deleted. A refusal leaves the database exactly as it was; fix the key and restart. Builds handed out from the bench may not check a key at all — ask when you request one.
Troubleshooting
Start with /cj diagnose.
Q: The plugin will not start
A: Read the console — config.yml has N problem(s) lists them all; Jobs could not be loaded means a malformed job file or two jobs sharing a title; Storage could not be opened names the database problem; arenas.enabled is true with no arena defined means define one or set it back to false.
Q: Nothing happens when I use an ability
A: Actives need a hotbar slot (/abilities) and are cast with sneak + right-click. Check it is unlocked on /skills, and look for undefined: ability keys in the start-up log.
Q: Players are kicked for flying
A: Set integrations.anticheat.bypass-permissions before opening to players.
Q: The leaderboard does not show me and I just levelled
A: Boards are snapshots refreshed on a timer; /top prints the age. /cj leaderboard refresh re-reads them now.
Q: Workstations are not earning while I am offline
A: You are on the internal economy, which only knows online players. Install Vault with any economy behind it.
Q: Two servers disagree about a clan, a bounty or the ladder
A: Run /cj network on both. Connected: no names the transport problem; Peers: 0 usually means a different channel; everything green but still disagreeing means two servers share a server-id.
Q: A player lost progress when they changed servers
A: Without the bridge that is expected. With it, watch Handoffs … timed out in /cj network and raise handoff-timeout-ms if servers are far apart.
Q: Need a build?
A: CombatJobs is not released. Ask for it in the Discord server.