arcadia-patch-create-1.4.4.jar
Curse Maven Snippet
What's new
Arcadia Patch Create 1.4.4
Performance release targeting the hotspots measured on live production servers, plus a new diagnostic tool for moderation staff.
Requires Create 6.0.10. Every patch is validated against an exact bytecode fingerprint and disables itself on any other build, so the mod still starts safely on a different version.
Performance
Behaviour dispatch — the largest remaining cost inside Create
Every SmartBlockEntity ended its tick with forEachBehaviour(BlockEntityBehaviour::tick), which
resolved the behaviour collection, handed it a lambda, and dispatched each behaviour through
Consumer.accept before reaching tick. Roughly 1.6 ms/tick went into that scaffolding alone,
across thousands of block entities, for no gameplay work at all — about 40% of Create's exclusive
time.
Behaviours are now ticked directly. Same behaviours, same order, same number of calls; only the plumbing is gone.
| Before | After | |
|---|---|---|
SmartBlockEntity#forEachBehaviour |
0.743 ms/t | 0.002 ms/t |
SmartBlockEntity$$Lambda#accept |
0.593 ms/t | 0.003 ms/t |
| fastutil values iterator | 0.302 ms/t | 0.012 ms/t |
Redstone Links — notifications that never stopped
RedstoneLinkBlock.tick() called blockUpdated twice unconditionally, while neighborChanged
scheduled a tick on every neighbour update. Together, a group of links kept waking each other up
over a signal that never moved. On one server, 104 links cost as much as 1,263 belts.
Both notifications are now skipped only when the transmitted signal and the block state are unchanged over the tick. Any real transition restores them immediately.
RedstoneLinkBlock#tick: 1.060 → 0.043 ms/tick (−96%)
Mechanical Crafters — redstone read cached between neighbour updates
Each crafter scanned its six neighbours every tick. Create uses the value to detect a rising edge,
so a throttle would be wrong: a one tick pulse would not be delayed, it would be lost. The value is
cached instead and dropped on neighborChanged — the next tick reads the world again and the pulse
is still seen. A forced refresh every 20 ticks covers modded sources that change without notifying.
| Before | After | |
|---|---|---|
hasNeighborSignal under crafters |
0.472 ms/t | 0.088 ms/t (−81%) |
MechanicalCrafterBlockEntity#tick |
0.760 ms/t | 0.377 ms/t (−50%) |
Fluid pipes — hash-table iteration removed
Create stores at most six pipe connections in an IdentityHashMap whose backing table is far
larger, and tick() iterates it four times per pipe. It is now an EnumMap: six slots instead of a
hash lookup. Direction is an enum, so identity and equality coincide and every lookup behaves
identically.
| Before | After | |
|---|---|---|
FluidTransportBehaviour#tick |
1.252 ms/t | 0.938 ms/t (−25%) |
PumpBlockEntity#tick |
0.350 ms/t | 0.225 ms/t (−36%) |
Measured on the same production server, at a higher player count than the reference capture. Average MSPT over five minutes went from 36.70 to 32.73 ms.
Removed
Mechanical Arm output simulation reuse, shipped in 1.4.3, has been removed.
It worked exactly as designed — 87% reuse rate, zero fallbacks — but an A/B measurement on the same server, toggling it off and on within one session and correcting against unpatched block types as a baseline, showed a net regression of 10.8%. Every one of the eight most expensive arms improved with it disabled.
Snapshotting the lookup key allocated an ItemStack copy on every miss, while the simulation it
avoided is only a handful of virtual calls on an arm with few output points. The cache cost more
than the work it replaced.
arm.enabled stays pinned to false in the config so a rollback cannot silently re-enable it.
Fixes
Adaptive throttling never engaged.
The MSPT accessor was looked up under a single hardcoded name taken from the compile classpath, but a deployed server is remapped to official names. The lookup failed silently and the reading was always zero, so the 35 / 45 / 55 ms steps were never crossed — a server averaging 33.7 ms with a 42 ms 95th percentile stayed on interval 1. Every known accessor is now probed, with the correct unit conversion.
New: diagnostic tool for moderators
/arcadiadiag gives a marked vanilla item. Left click any machine to analyse it — the block is
never broken, including in creative.
The tool times the targeted block and every loaded block of the same type over five seconds, then reports a verdict:
── Analysis — create:mechanical_crafter ──
Position : -6568 94 3328 (chunk -411, 208)
Cost : 118.42 us/tick = 0.24 % of the server
Its type : 47 others measured, median 0.95 us
Kinetics : 32 RPM
Deviation: 124.65x its type's normal
► REPORT THIS
This chunk : 1605 machines
► REPORT THIS CHUNK
The verdict is based on deviation from the norm for that block type, not an arbitrary threshold: a crafter at 118 µs when its 542 peers sit at 1 µs has a cause worth finding. A block outside Create is reported as such, and chunk density — the real driver of server load — is always shown.
Cost when no analysis is running: one static boolean read per block entity per tick.
Permissions. The tool is meant for moderators without operator rights. With LuckPerms:
lp group moderator permission set command.arcadiadiag true
lp group moderator permission set arcadia.patchcreate.diagnose true
LuckPerms gates command execution on command.<name>, so that node is required in addition to the
mod's own. Without any permission mod, the tool falls back to operator level. The admin panel and
all module toggles remain operator-only.
Administration
Each patch has its own switch, usable live without a restart:
/arcadiapatchcreate dispatch enabled <true|false>
/arcadiapatchcreate crafter enabled <true|false>
/arcadiapatchcreate redstoneLink enabled <true|false>
/arcadiapatchcreate status
Every module reports configured, available and effective as three distinct states, with counters, in the panel, the commands and the debug dump. The admin panel moved to a six-row layout with a health banner: current MSPT against the 50 ms budget, throttle mode and interval, and how many modules are effective versus how many had their target rejected.
Notes
Measurements come from 120-second Spark profiles taken on production servers under real load. Observable was running during the captures, which inflates absolute values equally on both sides; comparisons hold, raw values do not. Captures taken less than two hours after a restart were discarded — the server is not warm and the numbers are misleading.
Every gain in this release was verified by toggling the module off and on within the same session and correcting against unpatched block types, which is how the Mechanical Arm regression was caught.
Build verification: clean build, plus dedicated server startups with and without every optional
addon installed.
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include

