-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Put your copper golems to work. Work Orders turns vanilla Copper Golems into assignable little workers — couriers, stokers, restockers, janitors, sorters, and farmhands — with no commands or menus to memorize. You craft a Work Order, hand it to a golem, and tap the containers it should use. It feels like part of the game.
Copper golems already tidy items into copper chests in vanilla. Work Orders gives them real jobs and lets them move items anywhere you point them — while keeping the cozy, hands-on feel of the base game.
- Features
- Installation
- How it works
- The jobs
- Recipes
- Caring for your golems
- Commands
- Permissions
- Configuration
- Under the hood
- Compatibility
- Building from source
- Issues & contributing
- License
- Six jobs, each assigned by a craftable Work Order item — no commands required.
- Tap-to-route: tap a container to set the pickup, tap another for the drop-off. That's the whole setup.
- Vanilla at heart: golems walk, carry one stack at a time, and visibly wear the tool of their trade.
- Safe with your items: every transfer is a real move — items are never duplicated and never voided. If a destination fills up, the golem just holds the cargo.
- Performance-friendly: golems only work when a player is nearby; otherwise they hibernate. No offline item flow, no wasted CPU.
- Ownership & trust: only the golem's owner (or a trusted friend) can re-task it.
-
Fully configurable: every recipe (shape + ingredients), gating, and feedback level is editable. All player-facing text lives in
messages.yml. - Optional integrations: PlaceholderAPI and Vault (both soft — not required).
Requirements
- A Purpur / Paper server on Minecraft 26.1.x (Spigot/Bukkit also work).
- Java 21+.
- Copper Golems must exist on your version (Minecraft's Copper Age update or later).
Steps
- Download
WorkOrders-x.y.z.jar(from Releases or Modrinth). - Drop it into your server's
plugins/folder. - Restart the server.
- (Optional) Install PlaceholderAPI and/or Vault for the optional integrations.
That's it — config.yml and messages.yml are generated on first start.
The whole plugin runs on three inputs: right-click, sneak + right-click, and what's in your hand. Every action gives multi-channel feedback — the golem's held item, an action-bar line, particles, and a sound — so it's discoverable without docs.
- Assign a job — craft a Work Order and right-click a copper golem with it. The golem takes the job and picks up its tool.
- Set its route — tap a container to set the pickup, then tap another for the drop-off.
- Done — it starts hauling.
| Action | How | Who |
|---|---|---|
| Assign a job | Right-click the golem holding a Work Order | Owner / trusted |
| Set pickup → drop-off | Tap a container, then tap another (within 30s) | Owner / trusted |
| Open the filter | Sneak + right-click the golem holding the Work Order (Courier / Restocker) | Owner / trusted |
| Whistle (recall) | Sneak + right-click the air holding a copper ingot — nearby owned golems light up and walk to you; whistle again to dismiss | Owner |
| Wax | Right-click with a honeycomb (vanilla waxing) | Anyone* |
| Follow / heel | Sneak + right-click empty-handed — the golem follows you (teleporting to catch up if it falls behind), pausing its job | Owner / trusted |
| Inspect | Right-click empty-handed — shows job, route, oxidation, owner | Anyone |
*Configurable — see ownership.wax-anyone.
Vanilla interactions (name tags, leashing, shearing, axe-scraping, honeycombing) are never intercepted.
| Job | Tool | What it does |
|---|---|---|
| Courier | Hauls items from one container to another (with an optional filter). | |
| Stoker | Feeds furnaces, smokers & blast furnaces — fuel to the fuel slot, smeltables to the input, never the result slot. | |
| Restocker | Keeps a destination topped up to a set amount, then stops. | |
| Janitor | Vacuums up dropped items in a radius and banks them in a chest. | |
| Sorter | Splits items from one source across several destinations, routed by what each chest already holds. | |
| Farmhand | Harvests and replants crops in a small radius. Pair with a Janitor to gather the drops. |
Every Work Order uses the same frame — copper ingots around a sheet of paper — with the job's tool in the bottom-center slot. Swap the tool to change the job. Recipes are fully configurable in config.yml.
Example — Courier:
→ Work Order: Courier (5× Copper Ingot · 1× Paper · 1× the job tool)
Keep the copper-and-paper frame and swap the bottom-center tool for the other jobs:
| Job | Bottom-center tool |
|---|---|
| Courier | Hopper |
| Stoker | Furnace |
| Restocker | Barrel |
| Janitor | Brush |
| Sorter | Comparator |
| Farmhand | Iron Hoe |
- Wax — right-click with a honeycomb to stop oxidation (vanilla).
- Whistle (recall) — sneak + right-click the air holding a copper ingot to call your nearby golems to your side; whistle again to send them back to work.
- Inspect — right-click empty-handed to see a golem's job, route, and oxidation at a glance.
- Follow / heel — sneak + right-click empty-handed to toggle a golem following you. It walks to you and teleports to catch up (like a pet wolf) if it falls too far behind or can't path; hauling pauses while it follows.
-
Oxidation — golems oxidise slowly over time. It's a soft cost: a fully-oxidised (frozen) golem stops working and glows so you can find it; scrape it with an axe to bring it back. Never lethal. Optionally, efficiency can scale with oxidation (
oxidation.efficiency-scales-with-oxidation).
There are no player commands — the whole plugin is interaction-driven. The single command is for admins:
| Command | Description | Permission |
|---|---|---|
/workorders reload |
Reload config.yml + messages.yml and re-register recipes (cost edits apply live) |
workorders.admin |
/workorders status |
Show tracked golems, tick settings, and active config | workorders.admin |
/workorders spike |
Probe the nearest copper golem's native AI goals (diagnostic) | workorders.admin |
Alias: /wo.
| Node | Default | Description |
|---|---|---|
workorders.admin |
op |
Run /workorders, bypass ownership, and bypass job gating. |
workorders.job.courier |
true |
Allowed to assign the Courier job. |
workorders.job.stoker |
true |
Allowed to assign the Stoker job. |
workorders.job.restocker |
true |
Allowed to assign the Restocker job. |
workorders.job.janitor |
true |
Allowed to assign the Janitor job. |
workorders.job.sorter |
true |
Allowed to assign the Sorter job. |
workorders.job.farmhand |
true |
Allowed to assign the Farmhand job. |
Job permissions default to everyone. To gate jobs (e.g. by rank), set gating.require-permission: true and assign the workorders.job.* nodes in your permissions plugin. Example with LuckPerms:
/lp group member permission set workorders.job.janitor true
/lp group member permission set workorders.job.restocker true
/lp group veteran permission set workorders.job.courier true
Full config.yml reference. Every value below has a sensible default; edit and run /wo reload.
| Key | Default | Meaning |
|---|---|---|
service-interval-ticks |
10 |
How often the work scheduler fires (10 = twice per second). |
slices |
4 |
Golems are processed in this many rotating groups (1/N per fire) to spread load. |
active-radius |
64.0 |
A golem only works when a player is within this many blocks of it or its targets; otherwise it hibernates. |
range-cap |
48.0 |
Max distance between a golem and a container it can be bound to (hard-capped at 64). |
move-speed |
1.0 |
Pathfinding speed multiplier when walking to a target. |
pull-batch |
16 |
Items carried per trip (vanilla copper-golem cadence is 16). |
path-fail-grace |
3 |
Work cycles with no reachable path before a route is marked "stuck". |
bind-session-ttl-ticks |
600 |
How long the two-tap "set source then destination" flow stays open (600 = 30s). |
| Key | Default | Meaning |
|---|---|---|
trusted-only-retask |
true |
Only the golem's owner (or workorders.admin) may re-task it. |
wax-anyone |
true |
Anyone may wax a golem with honeycomb. If false, owner/admin only. |
whistle-enabled |
true |
Enable the whistle (call your nearby golems to your side; whistle again to dismiss). |
whistle-item |
COPPER_INGOT |
Item held (sneak + right-click air) to whistle your nearby golems to you. |
whistle-radius |
48.0 |
Whistle range in blocks. |
whistle-glow-seconds |
4 |
How long golems glow when whistled. |
follow-max-distance |
18.0 |
A following golem teleports to catch up if it falls more than this far from its owner (or can't path, or is in another world). |
follow-stop-distance |
3.0 |
A following golem stops and heels once within this many blocks of its owner. |
consume-role-item |
false |
If true, assigning a job consumes the held item; if false, it's only copied onto the golem as a label. |
| Key | Default | Meaning |
|---|---|---|
suppress-native-sort |
auto |
auto = disable native item pickup on managed golems, so the vanilla sorting brain can't ferry their items off to chests. off = leave vanilla pickup/sorting alone. |
| Key | Default | Meaning |
|---|---|---|
require-permission |
true |
Require workorders.job.<role> to assign that job. Set false to let anyone use every job. |
Each job's Work Order is a shaped recipe — this is the cost. Edit the shape + ingredients freely.
work-orders:
courier:
shape: [" C ", "CPC", "CTC"] # a space = empty cell
ingredients: { C: COPPER_INGOT, P: PAPER, T: HOPPER }
model: 0 # optional custom_model_data (0 = none)
stoker:
ingredients: { C: COPPER_INGOT, P: PAPER, T: FURNACE }
restocker:
ingredients: { C: COPPER_INGOT, P: PAPER, T: BARREL }
janitor:
ingredients: { C: COPPER_INGOT, P: PAPER, T: BRUSH }
sorter:
ingredients: { C: COPPER_INGOT, P: PAPER, T: COMPARATOR }
farmhand:
ingredients: { C: COPPER_INGOT, P: PAPER, T: IRON_HOE }| Key | Default | Meaning |
|---|---|---|
restocker.default-threshold |
64 |
"Keep topped up to N" when a Restocker has no explicit threshold. |
janitor.radius |
8 |
How far (blocks) a Janitor vacuums dropped items (capped at 48). |
farmhand.radius |
8 |
How far (blocks) a Farmhand tends crops (capped at 48). |
oxidation.efficiency-scales-with-oxidation |
false |
If true, golems work slower as they oxidise (before freezing). |
feedback.intensity |
normal |
off / subtle / normal / lively — scales particles & sounds. |
feedback.sounds |
true |
Play feedback sounds. |
feedback.actionbar |
true |
Show action-bar narration. |
feedback.frozen-glow |
true |
Glow a fully-oxidised (frozen) golem so you can find it. |
feedback.sluggish-fx |
true |
Particles/sounds as a golem oxidises and slows. |
feedback.bring-flower |
true |
A golem occasionally brings its owner a flower after a big batch. |
debug |
false |
Verbose logging. |
All player-facing strings live in messages.yml (MiniMessage formatting) — fully re-brandable and translatable.
The technical details, for server admins and the curious.
-
Built on the first-class Copper Golem API. Work Orders uses only the stable Bukkit/Paper API (
CopperGolem,Pathfinder, inventory APIs) — no NMS, no reflection into server internals — so it stays portable across server forks. -
Tames native sorting. A copper golem's vanilla item-sorting behaviour is brain-internal and not removable through the public Goal API (only
minecraft:has_rideris exposed). Because that brain only acts on items the golem can pick up,suppress-native-sort: auto(the default) disables native item pickup on managed golems — starving the behaviour so it can't drag a golem off-task (e.g. carrying a Farmhand's dropped produce off to a chest). Setoffto leave vanilla pickup/sorting untouched. Use/wo spiketo inspect a golem's exposed goals. - Never dupes, never voids. The only place an in-transit item lives is the golem's main hand. Pulls are atomic (remove-from-source + place-in-hand in one synchronous step); deposits use leftover-returning inventory merges with correct furnace/brewing slot semantics. If a destination is full the golem carries the cargo back or idles holding it — items are never dropped on the ground or deleted. On death, cargo and the job item drop and are recoverable.
-
Cheap and player-gated. A slice-and-stagger scheduler processes a fraction of tracked golems each tick, and a distance gate skips any golem with no player within
active-radius. Golems with no nearby player hibernate — which doubles as the economy guard (no offline/AFK item flow). - Survives restarts. Each managed golem's state (job, route, filter, owner) is stored in its persistent data container, so it survives chunk unloads, server restarts, and even spawn-egg capture.
- Integrations are optional. PlaceholderAPI and Vault are soft-depends; the plugin runs fully without them. Vault, if present, enables optional money-cost gating.
- No public developer API in v1. The plugin exposes no events or hooks for other plugins yet.
- Minecraft: 26.1.x
- Server: Purpur, Paper (Spigot / Bukkit also supported)
- Side: server-only — no client mod required (works for Java and Bedrock-via-Geyser players)
- Java: 21+
- Requires: Copper Golems (Minecraft's Copper Age update or later)
git clone https://github.com/FranciscoContreras/work-orders.git
cd work-orders
./gradlew build
# → build/libs/WorkOrders-1.0.3.jarRequires a JDK 21+. The build pulls the Paper API from Maven Central + the PaperMC repo; no other setup needed.
Found a bug or have an idea? Open an issue. Please include your server version, the plugin version, and steps to reproduce.
This project is source-available but not open-source — see the license below before reusing any code.
All Rights Reserved. © Machina. See LICENSE.
You may run the official, unmodified binary on your own server. All other rights — copying, modifying, redistributing, or selling — are reserved.
Built by Machina.