All pluginsMC Skylines

Police & courts

Justice

Persistent policing, custody, courts, corrections, warrants, contraband, K9 work, and forensic investigation.

01

Feature reference

What it handles

Custody

Timed cuffing, two-suspect dragging, searches, booking, holding, prison sentences, release, and staff safeguards.

Charges & fines

Recorded criminal charges, official fines, traffic tickets, court referral, and Economy-backed debt collection.

Wanted cases

Add, remove, and review wanted records through a dedicated police workflow.

Warrants

Request, judicial review, approval, execution, and property-scoped lock bypass for valid searches.

Contraband

Exact serialized item identities and recursive container searches preserve custom item integrity.

K9 units

Spawn, manage, and scan with non-combat alert behavior and bounded loaded-chunk property searches.

Forensics

Temporary native bodies, equipment presentation, examination, autopsy permissions, and audited disposal.

Cross-plugin custody

Vehicles, elevators, Economy, Property, Lock, WeaponMechanics, and custom items participate through guarded bridges.

02

Setup & operation

Detailed guide

This guide covers installation, configuration, permissions, facility creation, police workflows, courts and fines, custody, contraband, K9s, forensic bodies, persistence, integrations, and troubleshooting for Justice 1.3.1.

1. Requirements

Justice targets:

  • Paper 1.21.11
  • Java 21
  • WorldEdit and WorldGuard 7.0.14 or a compatible build
  • Economy, the matching server economy module

Optional integrations:

  • Core for the server's /modmode and transient staff-bypass permission
  • WeaponMechanics 4.3.1 for firearm blocking and detailed firearm evidence
  • Simple Elevators 3.15.0 or newer for carrying restrained suspects between elevator floors
  • Oraxen and ExecutableItems for custom items; contraband identity is preserved through complete Bukkit item serialization

WorldGuard and Economy must load successfully before Justice. WeaponMechanics, Simple Elevators, Core, Oraxen, and ExecutableItems are optional.

2. Installation and updates

  1. Stop the server completely.
  2. Install WorldEdit, WorldGuard, and Economy.
  3. Copy MCSkylines-Justice-1.3.1.jar into plugins/.
  4. Remove any stale Justice JAR from plugins/update/.
  5. Start the server once. Justice creates plugins/Justice/ and its default files.
  6. Review config.yml, charges.yml, and messages.yml.
  7. Restart after changing the database backend or connection settings.
  8. Create holding and prison facilities before officers begin using custody features.

Use /justice reload for ordinary configuration and message changes. Do not use a global plugin reload. Database backend changes require a full restart.

Generated files

| Path | Purpose | | --- | --- | | plugins/Justice/config.yml | Main settings | | plugins/Justice/charges.yml | Initial charge seed data | | plugins/Justice/messages.yml | MiniMessage-formatted messages | | plugins/Justice/data.db | Default SQLite database | | plugins/Justice/backups/ | SQLite startup backups | | plugins/Justice/audit-YYYY-MM-DD.log | Human-readable daily audit log |

3. First-start checklist

  • Confirm /justice status reports the intended database type.
  • Create at least one prison facility and one prison cell. Logouts while tased or in holding need a prison destination.
  • Create holding facilities and cells if temporary detention will be used.
  • Set each facility's release point.
  • Review maximum prison and holding times.
  • Set the Economy government treasury account through Economy.
  • Configure police, judge, forensic, K9, and administrator permissions.
  • Review or replace the default charges through /charges.
  • Populate the contraband catalog through /contraband.
  • Test local chat routing with the configured /l command.
  • Test one cuff, holding booking, prison booking, fine, ticket, K9 alert, and body examination before opening the system to players.

4. Creating facilities with WorldEdit selections

Justice creates and updates its WorldGuard regions directly from the executing administrator's current WorldEdit selection. Both cuboid and polygon selections are supported.

Facility and cell IDs are converted to lowercase. IDs may contain lowercase letters, numbers, underscores, and hyphens and may be at most 64 characters.

4.1 Create a holding drop-off

  1. Use WorldEdit to select the entire holding intake/drop-off area.
  2. Keep the selection active and remain in the same world.
  3. Stand at the location that should initially serve as the release point. This does not have to be inside the selected drop-off.
  4. Run:

text /justice facility cityholding holding

Justice creates the WorldGuard region:

justice_dropoff_cityholding

4.2 Create a prison drop-off

Repeat the process with a prison intake selection:

/justice facility cityprison prison

This creates:

justice_dropoff_cityprison

4.3 Add cells

Cells must be registered one at a time.

  1. Select the complete cell with WorldEdit.
  2. Stand inside that selection at the exact safe location and facing direction where inmates should appear.
  3. Run:

text /justice cell cityprison cell1

Justice creates:

justice_cell_cityprison_cell1

Repeat for every cell:

/justice cell cityprison cell2
/justice cell cityprison cell3

A cell cannot be added to an unknown facility. The combined generated WorldGuard region ID must not exceed 128 characters.

4.4 Set the final release point

Stand where released players should be sent and run:

/justice releasepoint cityprison

Do the same for each holding facility.

4.5 Resizing a configured region

Make a new WorldEdit selection and repeat the same facility or cell command with the same IDs. Justice replaces the region's shape while preserving its existing WorldGuard flags, owners, members, priority, and parent.

Justice does not automatically apply gameplay flags. Configure any desired WorldGuard flags normally after creation.

5. Permissions

5.1 Permission bundles

| Permission | Default | Includes | | --- | --- | --- | | justice.admin | Operators | All Justice permissions, including staff bypass and bypass override | | justice.police | Nobody | Cuffing, dragging, frisking, booking, holding release, wanted-list access, tickets, and contraband viewing | | justice.bail | Everyone | Paying personal bail |

The police bundle deliberately does not grant direct fines, K9s, property scans, forensics, autopsies, body disposal, charge management, contraband management, or administrative setup.

5.2 Individual permissions

| Permission | Function | | --- | --- | | justice.reload | Reload configuration, messages, and recipes | | justice.status | View database and registry counts | | justice.setup | Create facilities, cells, and release points | | skylines.give.item.justice.* | Issue Justice custom items through Core | | justice.audit | Read recent database audit entries | | justice.cuff | Cuff and uncuff players | | justice.drag | Attach an already cuffed suspect | | justice.frisk | Open a cuffed suspect's frisk GUI | | justice.book | Send a dragged suspect through intake | | justice.release.holding | Release a holding detainee | | justice.wanted | Add, remove, and view wanted cases | | justice.ticket | Issue traffic tickets | | justice.fine.police | Issue direct fines up to the police cap | | justice.fine.judge | Issue direct fines up to the judge cap | | justice.charge.manage | Add, edit, and delete charges | | justice.contraband.view | Open the contraband catalog | | justice.contraband.manage | Add and remove contraband entries | | justice.k9 | Spawn, manage, and despawn a K9 | | justice.k9.property-scan | Run a K9 property-container scan | | justice.forensics | Use a forensics kit | | justice.autopsy | Use an autopsy kit | | justice.body.dispose | Use a body dissolver | | justice.bail | Buy a sentence reduction with personal bail | | justice.staff-bypass | Exempt staff from normal custody enforcement and protect them from ordinary cuffing | | justice.staff-bypass.override | Allow an authorized staff member to cuff a bypass-protected target |

justice.fine.judge takes precedence over justice.fine.police when a player has both.

6. Command reference

| Command | Permission | Description | | --- | --- | --- | | /justice reload | justice.reload | Reloads config.yml, messages.yml, and recipes | | /justice status | justice.status | Shows database type and facility, cell, charge, and contraband counts | | /justice facility <id> <holding\|prison> | justice.setup | Creates or updates a drop-off from the current WorldEdit selection | | /justice cell <facility> <cell-id> | justice.setup | Creates or updates a cell from the current selection and standing location | | /justice releasepoint <facility> | justice.setup | Sets the facility's release location | | /skylines give justice:<item> [player] [amount] | skylines.give plus the granular item node | Issues a registered Justice item | | /justice audit [count] | justice.audit | Displays recent audit rows; defaults to 10 and is capped at 100 | | /cuff <player> | justice.cuff | Starts the stationary cuff timer | | /uncuff [player] | justice.cuff | Releases the named player or dragged slot one | | /uncuff2 | justice.cuff | Releases dragged slot two | | /drag <player> | justice.drag | Attaches an already cuffed player to the officer | | /frisk <player> | justice.frisk | Opens the frisk GUI for a cuffed online player | | /jail <player> | justice.book | Manually opens prison intake while standing in a prison drop-off | | /release <player> | justice.release.holding | Releases a player from holding | | /charges | justice.charge.manage | Opens the paginated charge-management GUI | | /fine <player> <amount> <reason> | Police or judge fine permission | Issues a direct fine; the target may be offline | | /ticket <player> <amount> <reason> | justice.ticket | Offers an online player a traffic ticket | | /ticketaccept | None | Accepts the player's pending ticket | | /ticketdeny | None | Refuses the player's pending ticket | | /wanted add <player> <charges/reason> | justice.wanted | Adds or appends a wanted entry | | /wanted remove <player> [reason] | justice.wanted | Removes a wanted entry | | /wl | justice.wanted | Opens the paginated wanted-list GUI | | /contraband | justice.contraband.view | Opens the paginated contraband catalog | | /k9 [spawn] | justice.k9 | Spawns a new K9 and removes the officer's previous K9 | | /k9 despawn | justice.k9 | Removes the officer's K9 | | /k9 scan | justice.k9 and justice.k9.property-scan | Scans loaded containers in the current WorldGuard property | | /forensics | Kit-specific permission | Examines the targeted body or starts disposal, depending on the held item | | /bail <minutes> | justice.bail | Pays from the prisoner's wallet to reduce a prison sentence |

Most operational commands are player-only. /justice reload, /justice status, and /justice audit can be used from the console. Item issuance is centralized under /skylines give.

7. Justice items and recipes

Justice items contain persistent identity data and have a maximum stack size of one. Renaming an ordinary item does not turn it into a Justice item.

Handcuffs

 I 
ICI
 I 
  • I: Iron Ingot
  • C: Iron Bars

Forensics kit

 CP
 SB
C  
  • C: Copper Ingot
  • P: Paper
  • S: String
  • B: Brush

A forensics kit begins with 10 uses and is consumed after the tenth examination.

Autopsy kit

 GI
 SG
I G
  • G: Glass Pane
  • I: Iron Ingot
  • S: Shears

An autopsy kit has one use.

Body dissolver

FBF
BSB
FBF
  • F: Fermented Spider Eye
  • B: Blaze Powder
  • S: Slime Ball

The dissolver is consumed immediately when disposal begins, even if disposal is interrupted.

8. Arresting, cuffing, and dragging

An officer can begin cuffing either by right-clicking a player with crafted handcuffs in the main hand or by running /cuff <player> while holding them.

The officer and target must remain within the configured movement tolerance of their starting positions for the configured cuff duration. The default tolerance is a quarter block. The attempt is cancelled if:

  • Either player changes position
  • Either player logs out
  • The officer teleports
  • The officer changes hotbar slot
  • The officer stops holding the handcuffs
  • Either player becomes unavailable or out of the active attempt

Looking around does not count as movement and does not cancel the timer. Small positional corrections within the tolerance are also accepted. On completion, the target is cuffed and automatically attached to the officer.

An officer may drag up to two suspects. Cuffed players cannot move themselves, although they can still turn their camera. Dragged suspects are held at custody.follow-distance directly in front of the officer's current facing direction. With two suspects, both remain in front with a small left/right separation. Justice uses direct controlled positioning instead of velocity pulling, and refuses to move a suspect through a solid block.

Cuffed players cannot fly or begin gliding. Horizontal and upward velocity are removed every tick, including velocity introduced by hits or other plugins. Officer flight does not automatically release suspects: a short vertical rise leaves the safely grounded suspect restrained. A restraint breaks when horizontal separation exceeds custody.leash-break-horizontal or vertical separation exceeds the taller custody.leash-break-vertical. External suspect teleports remain blocked; only Justice's marked short-range front-position update is accepted.

Drag movement checks the suspect's actual player-sized bounding box against every nearby block collision shape. This permits legal placement on the partial surfaces of stairs and slabs up to custody.step-up-height, while rejecting walls, ceilings, full blocks, unsupported air, and paths that would sweep the body through solid geometry. When blocked, the suspect catches on the obstruction; the restraint breaks only if the officer continues far enough to exceed a leash limit.

When Simple Elevators 3.15.0 or newer is installed and integrations.simple-elevators is enabled, its official ElevatorEvent authorizes one otherwise-blocked officer teleport. Justice transfers every actively dragged suspect to the same destination and then resumes front-positioning. The source, destination, world, vertical movement, event lifetime, and final officer position are validated. Other plugin teleports still release the officer's restraints.

Restraint position is server-authoritative. A cancelled movement event sends a correction to the restrained player's client, while a per-tick legal-position anchor repairs any state that bypassed the event path. Suspect-originated displacement is repaired before leash distance is evaluated, so fabricated or desynchronized movement cannot trigger its own release. Unexpected teleports, vehicle entry, riptide propulsion, gliding, flight, velocity, interaction, inventory, and command paths fail closed and significant rejected displacement is rate-limited in the audit log.

Use /uncuff for slot one and /uncuff2 for slot two. /uncuff <player> releases a specifically named online suspect.

All suspects owned by an officer are released if that officer dies or teleports. Actively dragged suspects are released if their officer logs out. A suspect is also released from cuffs on death. A cuffed suspect who logs out remains persistently cuffed for reconnect unless another release rule applies.

Staff with justice.staff-bypass cannot be cuffed unless the officer also has justice.staff-bypass.override.

9. Restrictions and local chat

Cuffed and detected-tased players cannot normally:

  • Interact with entities or blocks
  • Break or place blocks
  • Attack
  • Drop or pick up items
  • Open or use inventories
  • Run non-whitelisted commands
  • Teleport out of restraint
  • Speak in global chat

Their chat is cancelled and redispatched through:

/<custody.local-chat-command> <message>

The default is /l. The local-chat plugin must permit that command and accept the message as trailing arguments. If dispatch fails, the player is told that local chat is unavailable.

custody.allowed-cuffed-commands applies to cuffed and tased players outside a cell. Prison and holding use their separate command whitelists. Command entries should be root labels without / or arguments.

/modmode is always allowed while serving a sentence. If Core grants justice.staff-bypass in mod mode, cell enforcement and normal command restrictions are bypassed until mod mode is disabled. Custody chat still routes locally.

10. WeaponMechanics tase bridge

A player is considered tased only while every effect listed in tase.detection-effects is present. The default combination is Weakness, Slowness, and Jump Boost.

While detected as tased:

  • Normal cuff-style restrictions apply
  • Sprinting is disabled
  • Horizontal velocity is capped
  • Upward velocity is capped to prevent repeated-hit launching
  • Chat is routed through local chat
  • Non-whitelisted commands are blocked

WeaponMechanics shooting is blocked whenever the shooter has Weakness if tase.block-guns-with-weakness is enabled. This firearm check needs only Weakness; full tase restriction detection still needs every configured tase effect. The denial text supports MiniMessage.

Logging out while detected as tased removes cuffs and assigns the maximum configured prison sentence with audit reason Tase Log. Configure a prison facility before relying on this rule. Cuffing and uncuffing do not remove potion effects.

11. Holding and prison intake

11.1 Automatic intake

When an officer walks into a configured drop-off while dragging a suspect, Justice begins intake automatically:

  • Holding drop-off: opens the narrative-book workflow
  • Prison drop-off: opens the charge-selection GUI

Only one pending intake is maintained per suspect.

11.2 Holding intake

The officer receives a virtual writable book. Write the holding reason and sign the book.

  • Closing or submitting without signing cancels intake
  • A blank signed narrative is rejected
  • Successful intake uncuffs the suspect
  • The holding term is the configured maximum holding time
  • The booking and narrative are stored in the database and audit trail

An authorized officer can release a holding detainee with /release <player>.

Logging out while in holding converts the case to the maximum prison sentence with audit reason Holding Log.

11.3 Prison intake

The prison GUI shows all configured charges.

  • Left-click a charge to increase its count
  • Right-click to decrease its count
  • Counts cannot exceed the charge's configured maximum
  • Use the arrows for pagination
  • Click Submit after choosing at least one charge
  • Write and sign the narrative book

Justice totals the selected charges, caps prison time at maximum-prison-minutes, applies the automatic charge fine, removes the suspect from the wanted list, logs the booking, and places the suspect in the first available cell.

There is no overall cap on automatic charge fines. Each charge's own maximum count limits its contribution.

If the suspect is transferred directly from holding into prison, time already served in holding is deducted from the prison term. If the credit satisfies the entire term, the suspect is released.

11.4 Cell assignment and sentence clocks

  • Cells are occupied by one sentence at a time
  • Stale cell occupancy is reconciled at startup
  • If every cell is occupied, intake is stored in a pending queue
  • Pending terms do not count down until a cell becomes available
  • A queued suspect is assigned to the first available cell automatically
  • Active sentence time counts down only while the player is online
  • The configured warning is sent near the end of the term
  • A separate absolute real-time deadline releases custody even if the player remains offline
  • Prisoner death releases the sentence
  • Leaving the configured cell causes the inmate to be returned to its safe teleport point

12. Bail and external sentence reductions

Bail is available only for prison sentences.

/bail <minutes>

Bail:

  • Uses the player's wallet only
  • Transfers funds to the Economy government treasury
  • Costs bail.cost-per-minute
  • Cannot reduce more than bail.maximum-sentence-percent of the original sentence
  • Fails without sufficient wallet funds
  • Releases the player if the reduction reaches zero remaining time

Other plugins can reduce time without consuming the bail allowance through the public JusticeApi.reduceSentence method. This is intended for future prison work, mining, activities, or similar systems.

13. Charges

The default seed contains Assault, Murder, and Possession of Contraband.

charges.yml is imported only when the database has no charge records. Once charges exist in the database, editing charges.yml does not replace them. Use /charges for live management.

Add a charge

Open /charges, click Add charge, and answer in chat using:

id | name | description | MATERIAL | prison minutes | fine | max count

Example:

burglary | Burglary | Entering a property to commit a crime | IRON_PICKAXE | 8 | 750.00 | 10

Edit or delete

  • Click a charge and enter the replacement fields without the ID
  • Shift-right-click a charge to delete it
  • Enter cancel in chat to cancel an edit

Charge IDs use the same lowercase ID rules as facilities. Prison minutes and fines may be zero but not negative. Maximum count must be at least one. The icon must be a valid Bukkit Material name.

14. Fines, debt, and traffic tickets

Direct fines

/fine <player> <amount> <reason>

The cap is selected from the issuer's permissions:

  • justice.fine.police: fines.police-cap
  • justice.fine.judge: fines.judge-cap

Amounts must be positive and within the applicable cap. Negative or malformed values are rejected.

Payment is collected in this order:

  1. Active wallet
  2. Active checking accounts
  3. Unpaid remainder becomes Economy fine debt

Transfers and later debt garnishment go to the Economy government treasury. The debt reference prevents Justice from manufacturing funds or treating a negative amount as payment.

An online recipient receives a detailed message naming the issuer and reason, the total fine, the amount collected immediately, and the amount added as debt. Automatic charge fines also report the charged, paid, and debt amounts.

Traffic tickets

/ticket <online-player> <amount> <reason>

The amount must be positive and no greater than fines.traffic-cap. The recipient receives clickable PAY and DENY choices.

  • /ticketaccept collects the ticket as an automatic fine or registers debt
  • /ticketdeny refuses it without collecting payment
  • No answer before the timeout auto-denies the ticket
  • The issuing officer is notified of acceptance, denial, or timeout while online
  • The recipient receives an immediate confirmation after accepting or denying; accepted tickets then report the paid and debt amounts

15. Wanted list

Add a player with:

/wanted add <player> <charges or reason>

Adding an already wanted player appends a timestamped officer entry and extends the summary rather than replacing history.

Open /wl to view a paginated inventory of player heads. Each entry shows the marking officer, date, summary, and full history in its item tooltip.

Remove a case manually with:

/wanted remove <player> [reason]

Justice also removes wanted status when:

  • The player is successfully booked into prison
  • The player dies from a cause not classified as suicide or an uncredited fall

An explicit suicide or ordinary fall without an attributed killer preserves wanted status. A player-attributed pushed fall is treated according to Bukkit's killer attribution.

16. Contraband and frisking

Contraband uses exact Bukkit item identity, not material alone. One registered custom pistol does not automatically make every item with the same base material illegal. Persistent data, components, custom models, enchantments, names, and custom-item metadata remain part of the comparison.

Manage the catalog

  1. Hold or carry the exact item to register.
  2. Open /contraband with justice.contraband.manage.
  3. Click the item in your lower player inventory while the GUI is open.
  4. Click a registered item in the top catalog to remove it.

Users with only justice.contraband.view receive a read-only paginated catalog.

Frisk a suspect

The target must be cuffed and online:

/frisk <player>

The GUI displays the target's storage, armor, and offhand slots. Registered contraband is marked. Clicking marked content confiscates only registered illegal items and transfers them to the officer.

Search and extraction recurse through bundles and block-state containers, including nested shulker boxes, to a maximum depth of eight. Scans are also bounded to prevent pathological item trees. The officer needs enough empty inventory slots for confiscated stacks.

Ender Chests

Players cannot deposit direct or nested registered contraband into an Ender Chest through clicks, hotbar swaps, shift-clicks, or inventory drags. Removing existing content is not blocked.

17. K9 operations

Spawn one K9 with /k9 or /k9 spawn. Spawning a new dog despawns the officer's previous dog.

The K9:

  • Is a normal, damageable tamed wolf
  • Never deals damage through Justice
  • Scans nearby player inventories on the configured interval
  • Recursively detects registered contraband
  • Skips its owner and staff with justice.staff-bypass
  • Enters an interested alert stance, stands, looks at, and physically paths toward the nearest carrier
  • Stops at k9.approach-distance, barks at k9.bark-interval-seconds, and continues sending the officer an action-bar summary
  • Clears combat targets and cannot deal damage, so tracking never becomes an attack
  • Applies a ten-second alert cooldown per dog and suspect

Shift-right-click your dog to open its management GUI. The GUI can rename it, leash or unleash it, make it sit or stand, and despawn it. Renaming consumes the officer's next chat message as the name; enter cancel to stop.

Property scan

Stand inside the WorldGuard property and run:

/k9 scan

The scan checks containers that are inside at least one WorldGuard region applicable at the officer's location. It inspects only already loaded chunks near the officer, never force-loads chunks, stops at k9.property-container-limit, and recursively scans portable containers inside those inventories.

The command reports the number of contraband matches, not the number of unique containers or item stacks.

18. Bodies, forensics, and autopsies

Every player death creates a temporary body using native server entities:

  • A native Paper mannequin uses the victim's complete player profile and skin in a fixed horizontal sleeping pose
  • Three Interaction entities create a full-length usable hitbox
  • The body displays visual copies of the victim's armor, main-hand item, and off-hand item
  • Corpse interaction is always intercepted, all displayed equipment has a zero drop chance, and the corpse cannot be damaged, so players cannot take the skin head or displayed items
  • Normal death drops are not removed or stored by the body
  • No ProtocolLib packet NPC is used

Bodies naturally disappear after bodies.despawn-seconds and do not survive a server restart.

Forensics

Hold a forensics kit, target or right-click the body, and use /forensics if needed. The examiner receives approximate time, cause, weapon, an obscured assailant clue when attributable, and suicide classification. One use is deducted.

Autopsy

Hold an autopsy kit with justice.autopsy. The report includes the victim, exact recorded time, cause, attributable killer, weapon, ammunition, hit location, distance, and suicide classification. The one-use kit is consumed.

WeaponMechanics evidence records the most recent relevant firearm hit for up to 30 seconds before death, including weapon title, ammunition when available, hit point, and distance. Without that integration, Justice falls back to Bukkit damage and killer information.

Body disposal

Hold a body dissolver and right-click or target the body with /forensics.

  • The dissolver is consumed at the start
  • The player must remain near both the body and the starting location
  • Disposal lasts bodies.dissolve-seconds
  • Entity-caused damage, logout, moving out of range, body despawn, or body removal interrupts the action
  • An interrupted action does not refund the dissolver
  • Successful disposal removes the body but forensic and autopsy examinations do not

19. Configuration reference

Database

| Setting | Default | Meaning | | --- | --- | --- | | database.type | SQLITE | SQLITE or MYSQL | | database.sqlite-file | data.db | Relative path inside plugins/Justice/ | | database.busy-timeout-ms | 10000 | SQLite lock wait timeout | | database.backup-on-startup | true | Copies an existing SQLite database before opening it | | database.backup-retention | 14 | Number of newest startup backups retained | | database.mysql.host | localhost | MySQL hostname | | database.mysql.port | 3306 | MySQL port | | database.mysql.database | justice | Database/schema name | | database.mysql.username | minecraft | Database user | | database.mysql.password | change-me | Database password | | database.mysql.use-ssl | true | Uses MySQL VERIFY_IDENTITY; requires valid TLS hostname trust | | database.mysql.pool-size | 6 | Connection pool size, clamped from 2 to 32 |

Switching database types does not migrate existing Justice data.

Currency and custody

| Setting | Default | Meaning | | --- | --- | --- | | currency.symbol | $ | Display symbol | | currency.decimal-places | 2 | Currency scale used for parsing and display | | custody.cuff-seconds | 3 | Stationary cuff time, clamped from 1 to 30 seconds | | custody.reach | 4.5 | Maximum initial cuff distance | | custody.cuff-movement-tolerance | 0.25 | Maximum distance either participant may move from the cuff attempt's starting point | | custody.max-dragged | 2 | Drag slots, clamped from 1 to 2 | | custody.follow-distance | 1.25 | Distance at which suspects are held in front of the officer; effective values are clamped from 0.75 to 1.35 blocks | | custody.leash-break-horizontal | 5.0 | Horizontal separation at which restraints break, clamped from 2 to 32 blocks | | custody.leash-break-vertical | 8.0 | Vertical separation at which restraints break, clamped from 3 to 64 blocks | | custody.step-up-height | 1.05 | Maximum collision-checked stair/slab rise, clamped from 0.5 to 1.25 blocks | | custody.handcuffs-material | IRON_NUGGET | Base material for crafted handcuffs | | custody.handcuffs-custom-model-data | 0 | Modern custom-model float; zero disables it | | custody.local-chat-command | l | Root local-chat command without / | | custody.allowed-cuffed-commands | [] | Root commands allowed while cuffed or tased |

Changing the handcuff material or model does not convert existing items. Give or craft new handcuffs after changing identity-related presentation.

Tase

| Setting | Default | Meaning | | --- | --- | --- | | tase.bridge-enabled | true | Enables effect-combination tase detection | | tase.detection-effects | WEAKNESS, SLOWNESS, JUMP_BOOST | Every listed effect must be active | | tase.block-guns-with-weakness | true | Cancels WeaponMechanics shooting with Weakness | | tase.blocked-gun-message | Configured MiniMessage | Firearm denial message | | tase.velocity-cap-horizontal | 0.35 | Maximum horizontal velocity while tased | | tase.velocity-cap-upward | 0.08 | Maximum upward velocity while tased |

Sentences and bail

| Setting | Default | Meaning | | --- | --- | --- | | sentences.maximum-prison-minutes | 60 | Maximum prison term, clamped from 1 to 525,600 | | sentences.maximum-holding-minutes | 15 | Holding term and abuse cap, clamped from 1 to 1,440 | | sentences.absolute-offline-release-hours | 24 | Real-time safety release, clamped from 1 to 8,760 hours | | sentences.warning-minutes | 1 | Remaining-time warning threshold, clamped from 1 to 60 | | sentences.prison-command-whitelist | l, msg, r, help | Allowed root commands in prison | | sentences.holding-command-whitelist | l | Allowed root commands in holding | | bail.enabled | true | Enables personal bail | | bail.cost-per-minute | 100.00 | Wallet cost per minute; must be positive | | bail.maximum-sentence-percent | 50 | Maximum original sentence percentage removable through bail |

Fines, bodies, and K9

| Setting | Default | Meaning | | --- | --- | --- | | fines.police-cap | 10000.00 | Maximum direct police fine | | fines.judge-cap | 100000.00 | Maximum direct judge fine | | fines.traffic-cap | 500.00 | Maximum traffic ticket | | fines.ticket-timeout-seconds | 60 | Response window, clamped from 10 to 600 seconds | | bodies.despawn-seconds | 300 | Natural body lifetime, clamped from 10 to 86,400 seconds | | bodies.dissolve-seconds | 60 | Required disposal time, clamped from 1 to 3,600 seconds | | bodies.dissolve-range | 3.0 | Maximum distance from body and starting location | | k9.scan-range | 12 | Nearby player scan radius, clamped from 2 to 64 blocks | | k9.scan-seconds | 1 | Scan interval, clamped from 1 to 60 seconds | | k9.property-container-limit | 256 | Maximum property containers per scan, clamped from 1 to 4,096 | | k9.bark-interval-seconds | 2 | Bark interval while tracking contraband, clamped from 1 to 30 seconds | | k9.approach-distance | 2.0 | Distance at which the K9 stops approaching, clamped from 1.25 to 6 blocks | | k9.tracking-speed | 1.15 | K9 pathfinding speed while approaching, clamped from 0.5 to 2.0 |

Integrations and logging

| Setting | Default | Meaning | | --- | --- | --- | | integrations.weapon-mechanics | true | Enables WeaponMechanics listeners when the plugin is present | | integrations.simple-elevators | true | Enables the official Simple Elevators 3.15+ event bridge when Elevator is installed | | integrations.custom-items | ORAXEN, EXECUTABLE_ITEMS | Declares expected custom-item providers; exact item matching uses serialized Bukkit identity | | logging.human-readable-file | true | Enables dated text audit files | | logging.file | audit.log | Relative base filename used to generate dated files | | logging.retention-days | 90 | Human-readable audit retention, clamped from 1 to 3,650 days | | logging.discord-webhook | Blank | Optional HTTPS Discord-compatible webhook |

Configured file paths must remain inside plugins/Justice/. Absolute paths and traversal outside the data folder are rejected.

20. Messages and MiniMessage

messages.yml supports MiniMessage formatting. <prefix> is replaced with the configured prefix. Runtime placeholders include:

  • {target}
  • {officer}
  • {reason}
  • {amount}
  • {result}

The traffic prompt uses clickable MiniMessage actions for /ticketaccept and /ticketdeny. Run /justice reload after editing messages.

21. Persistence and audit logging

Justice persists:

  • Cuffs and responsible officers
  • Sentences and remaining time
  • Facilities, cells, and occupancy
  • Charges
  • Wanted cases and appended history
  • Exact contraband items
  • Booking narratives and selected charges
  • Audit events

Bodies, active K9 entities, pending tickets, GUI sessions, active cuff attempts, and body-disposal timers are intentionally not restored after restart.

Every significant action is written to the database and server console. When enabled, Justice also writes a dated human-readable file. The optional webhook receives a shortened action summary and must use HTTPS with a valid host.

SQLite uses WAL mode, foreign-key enforcement, a single database worker, and startup backups. MySQL uses HikariCP and a bounded worker pool. On shutdown, Justice waits up to five seconds for queued database work.

22. Public API for other plugins

Justice registers dev.serverplugins.justice.api.JusticeApi through Bukkit's ServicesManager.

JusticeApi justice = Bukkit.getServicesManager().load(JusticeApi.class);

boolean cuffed = justice.isRestrained(playerUuid);
boolean servingTime = justice.isInCustody(playerUuid);

justice.reduceSentence(playerUuid, 300, "Prison mining reward", staffUuid)
    .thenAccept(secondsRemoved -> {
        // Reduction completed.
    });

isRestrained reports persistent handcuffs, not potion-effect tase state. reduceSentence accepts positive seconds and safely schedules sentence mutation on the server thread when called asynchronously. Vehicle plugins can query restraint/custody state before placing or removing a suspect and should leave physical vehicle behavior to their own implementation.

23. Troubleshooting

Justice does not load

  • Confirm Java 21 and Paper 1.21.11
  • Confirm WorldEdit, WorldGuard, and Economy load first
  • Check for a stale JAR under plugins/update/
  • Validate config-version: 1
  • Review database credentials and MySQL TLS settings
  • Read the earliest Justice could not start safely exception, not only the final disable message

Facility or cell setup says the selection is incomplete

  • Make both WorldEdit selection points
  • Use a cuboid or polygon selection
  • Execute the command in the same world as the selection
  • For a cell, stand inside the selection at the safe teleport point

A region has the wrong shape

Make the correct selection and repeat the same setup command with the same IDs. Existing WorldGuard settings are preserved.

A suspect is queued instead of teleported

Every registered cell is occupied or unavailable. Add another cell or release an existing inmate. Queued time begins counting only after assignment.

Tase restrictions do not activate

  • Confirm tase.bridge-enabled: true
  • Confirm every configured potion effect is present simultaneously
  • Use Bukkit potion-effect names
  • Confirm /justice reload succeeded

Weapon blocking has its own test: when enabled, any Weakness effect should block WeaponMechanics shooting.

Local chat says it is unavailable

Confirm the local-chat plugin exposes the configured root command and allows players to execute it in their current state. Store only the root label, such as l, not /l or /l message.

Changes to charges.yml do not appear

The database already contains charges. Manage them with /charges; charges.yml is seed data for an empty charge table only.

A fine is rejected

  • Amount must be positive
  • Issuer must have justice.fine.police or justice.fine.judge
  • Amount must be within that role's cap
  • Economy and its government treasury account must be available

A K9 property scan reports zero

  • Stand inside the intended WorldGuard property
  • Ensure relevant chunks are already loaded
  • Confirm the containers lie in a region also applicable at the officer's position
  • Register the exact item variant as contraband
  • Check the container scan limit

A forensic kit does not work

  • Hold the correct Justice item in the main hand
  • Confirm the matching permission
  • Target the body within five blocks or right-click its hitbox
  • Bodies disappear naturally and on plugin shutdown

/justice reload succeeds but the database did not change

Reload updates configuration values, messages, and recipes. The active database connection and backend are established at startup, so database changes require a full restart.

Before launch, test this sequence with two staff accounts and one suspect account:

  1. Craft and apply handcuffs.
  2. Cancel cuffing through movement and item switching.
  3. Drag two suspects and release each slot.
  4. Confirm command, interaction, teleport, and local-chat restrictions.
  5. Book into holding and release manually.
  6. Transfer a holding detainee to prison and verify time credit.
  7. Fill every cell and verify pending assignment.
  8. Test tase velocity limits, WeaponMechanics denial, and a Tase Log logout.
  9. Issue a direct fine, partially funded fine, unpaid debt, accepted ticket, denied ticket, and timed-out ticket.
  10. Add exact custom contraband, frisk nested containers, and attempt Ender Chest storage.
  11. Spawn and manage a K9 and run a loaded-property scan.
  12. Create a wanted case, append history, book the suspect, and test death-removal rules.
  13. Test a normal body, WeaponMechanics firearm body, forensics, autopsy, interrupted disposal, successful disposal, and natural despawn.
  14. Restart the server and verify cuffs, sentences, cell occupancy, charges, wanted cases, contraband, bookings, and audits persist.

03

Admin reference

Commands

CommandUsageDescriptionPermission
/justice/justice <help|reload|status|facility|cell|releasepoint|audit>Justice administration and setupSubcommand-based
/cuff/cuff <player>Begin cuffing a playerSubcommand-based
/uncuff/uncuff [player]Release a restrained playerSubcommand-based
/uncuff2/uncuff2Release the second dragged suspectSubcommand-based
/drag/drag <player>Attach a cuffed player to your custodySubcommand-based
/frisk/frisk <player>Search a cuffed playerSubcommand-based
/jail/jail <player>Book a cuffed playerSubcommand-based
/release/release <player>Release a holding detaineeSubcommand-based
/charges/chargesView or manage criminal chargesSubcommand-based
/fine/fine <player> <amount> <reason>Impose an official fineSubcommand-based
/ticket/ticket <player> <amount> <reason>Offer a traffic ticketSubcommand-based
/wanted/wanted <add|remove> <player> [reason]Add or remove wanted casesSubcommand-based
/wl/wlOpen the wanted listSubcommand-based
/warrant/warrant request <world:property|property> <probable-cause>Request a property search warrantSubcommand-based
/warrants/warrantsReview pending warrant requestsSubcommand-based
/contraband/contrabandView or manage contrabandSubcommand-based
/k9/k9 [spawn|despawn|scan]Spawn or manage your K9Subcommand-based
/forensics/forensicsExamine the targeted bodySubcommand-based
/bail/bail <minutes>Pay to reduce your prison sentenceSubcommand-based
/ticketaccept/ticketacceptAccept a pending traffic ticketSubcommand-based
/ticketdeny/ticketdenyRefuse a pending traffic ticketSubcommand-based

04

LuckPerms reference

Permissions

NodeDefaultDescription / children
justice.adminopFull Justice access. Operators receive this parent automatically.Includes justice.reload, justice.status, justice.setup, justice.audit, justice.charge.manage, justice.contraband.manage, justice.police, justice.fine.police, justice.fine.judge, justice.contraband.view, justice.k9, justice.k9.property-scan, justice.forensics, justice.autopsy, justice.body.dispose, justice.bail, justice.staff-bypass, justice.staff-bypass.override, justice.warrant.request, justice.warrant.review, justice.warrant.execute
justice.policefalseNo additional description.Includes justice.cuff, justice.drag, justice.frisk, justice.book, justice.release.holding, justice.wanted, justice.ticket, justice.ticket.refer, justice.contraband.view, justice.warrant.request, justice.warrant.execute
justice.reloadfalseNo additional description.
justice.statusfalseNo additional description.
justice.setupfalseNo additional description.
justice.auditfalseNo additional description.
justice.cufffalseNo additional description.
justice.dragfalseNo additional description.
justice.friskfalseNo additional description.
justice.bookfalseNo additional description.
justice.release.holdingfalseNo additional description.
justice.wantedfalseNo additional description.
justice.ticketfalseNo additional description.
justice.ticket.referfalseRefer expired tickets to the courts.
justice.fine.policefalseNo additional description.
justice.fine.judgefalseNo additional description.
justice.charge.managefalseNo additional description.
justice.contraband.viewfalseNo additional description.
justice.contraband.managefalseNo additional description.
justice.k9falseNo additional description.
justice.k9.property-scanfalseNo additional description.
justice.forensicsfalseNo additional description.
justice.autopsyfalseNo additional description.
justice.body.disposefalseNo additional description.
justice.bailtrueNo additional description.
justice.staff-bypassfalseNo additional description.
justice.staff-bypass.overridefalseAllows authorized staff to act on targets protected by justice.staff-bypass.
justice.warrant.requestfalseRequest a warrant for a managed Property parcel.
justice.warrant.reviewfalseReview and approve or deny warrant requests in the judge GUI.
justice.warrant.executefalseExecute an approved warrant and use a battering ram.
Next pluginVehicles

Command and permission references reflect the current plugin.yml manifests in this workspace.