2 releases, newest first.
/customcrafting set no longer freezes the server. Every set parked the main thread for
ten seconds and tripped Paper's watchdog ("The server has not responded for 10 seconds"),
followed by Can't keep up!. /customcrafting remove did the same, and a set onto a block
that already held a workstation paid it twice.
The workstation write handed the file to the async scheduler and then waited for it on the main thread - the same thread that has to dispatch the task. The wait could only expire, never succeed. Both commands now return within a tick, and the workstation is still persisted immediately.
No data was ever at risk: the file was always written, just ten seconds late.
config.yml no longer ships the update-check block. The releases feed is public, so
anonymous polling already works and the token was never needed. Existing servers can leave the
key in place - it is ignored.Timed crafting workstations for Paper servers. Register a block in the world, and players right-click it to pick a recipe, spend the ingredients and wait out a timer before claiming the rewards.
A workstation is any block you point at with /customcrafting set <id> [recipe-set]. The id is how you address it everywhere else - in /customcrafting remove, and in every placeholder.
Each workstation is bound to a recipe set, which is simply the list of recipes its menu offers. One block can be a mining forge, another an alchemy table, and a third can offer both sets' worth of recipes - it is entirely up to how you group them in recipes.yml. A workstation that names no set uses settings.default-recipe-set.
Registered blocks are protected: they cannot be broken, blown up, burnt or pushed by a piston, so /customcrafting remove is the only way to unregister one. Turn that off with settings.protect-workstation-blocks if you would rather manage it yourself.
Right-clicking a workstation opens its menu. Every recipe of the set is placed at its own configured slot and looks exactly like the display block that declares it, so adding a recipe never means editing the menu file.
Clicking a recipe spends the ingredients immediately and starts the timer. Each craft rolls its own duration between the recipe's min and max minutes, so two players crafting the same thing do not finish in lockstep. The clock only runs while the player is online, and crafts survive a restart - a 90-minute craft started before a reboot picks up where it left off.
One workstation runs one craft per player at a time. A player who right-clicks a workstation they already have a craft on is told how long is left rather than being charged again.
When it is done, the same right-click claims it: the recipe's reward commands run from the console, and the craft is consumed first, so a reward line that fails cannot be replayed for a second payout.
Ingredients are items this plugin creates, declared in items.yml. They carry a signature only the plugin can write, so a renamed vanilla lookalike never counts as an ingredient - an anvil cannot forge one, and neither can a shop that sells a similarly-named stack.
The same file defines the results a recipe hands back. customcrafting give <player> <item> [amount] works from the console, which is how crates, quest plugins and the recipes' own reward lines hand out plugin items - a vanilla /give cannot produce one.
| Command | Description |
|---|---|
/customcrafting | Show the command list |
/customcrafting set <id> [recipe-set] | Register the block you are looking at as a workstation |
/customcrafting remove <id> | Remove a workstation |
/customcrafting bypass | Finish your own active crafts instantly |
/customcrafting give <player> <item> [amount] | Give one of this plugin's items |
/customcrafting reload | Reload configuration, items, recipes and language files |
/customcrafting debug | Toggle runtime debug output |
Alias: /cc, editable in config.yml under command.aliases. Write the full command name in reward lines, crate contents and anything else outside the plugin: the alias is yours to rename, and other plugins ship a /cc of their own.
| Permission | Default | Description |
|---|---|---|
customcrafting.* | OP | Everything below |
customcrafting.use | true | Basic usage |
customcrafting.admin | OP | All admin commands |
customcrafting.admin.set | OP | Register a workstation |
customcrafting.admin.remove | OP | Remove a workstation |
customcrafting.admin.bypass | OP | Skip craft time |
customcrafting.admin.give | OP | Give plugin items |
customcrafting.admin.reload | OP | Reload configuration |
customcrafting.admin.debug | OP | Toggle debug output |
customcrafting.admin.update | OP | Receive update notifications |
Crafting itself needs no permission: any player can use a workstation you registered.
reload, debug and the update notice are built by SnLib, which derives their permission from the plugin's own name, so what it actually tests is sncustomcrafting.admin.reload, .debug and .update. The nodes in the table are declared as parents of those, so granting the documented ones - or the customcrafting.* wildcard - is enough on LuckPerms and on any permission plugin that applies Bukkit child permissions. If yours does not, grant those three directly; there is no sncustomcrafting.* wildcard.
Requires PlaceholderAPI. <id> is a workstation id.
| Placeholder | Description |
|---|---|
%customcrafting_status_<id>% | Display name of the recipe being crafted |
%customcrafting_time_<id>_short% | Remaining time, short format |
%customcrafting_time_<id>_long% | Remaining time, full format |
%customcrafting_progress_<id>% | Crafting progress percent |
Short-format aliases: %customcrafting_time_<id>% and %customcrafting_<id>_time%.
What they show when there is nothing to report is under status: in the language file, and both duration formats are templates you control in config.yml.
config.yml - language, database, the default recipe set, workstation protection, the progress template and both duration formats.items.yml - every item the plugin can create, ingredients and results alike.recipes.yml - recipe sets. Each recipe declares its menu icon and slot, a min/max duration in minutes, the items it consumes and the console commands it runs on claim.guis/<recipe-set>.yml - the menu of that set. The file name is the set id.lang/messages_en.yml - all player-facing text.New keys merge into your files automatically on boot, with your values and comments preserved.
Crafts are stored in SQLite by default, which needs no setup. Set database.type: mysql and fill in the connection block to share them across a network.