Create kinetics
Compukters can expose adjacent or cable-connected Create kinetic devices directly to Guest Kotlin. This optional
integration is available on Minecraft 1.21.1 with Create 6.0.10 through 6.0.x. Compukters still starts normally
when Create is absent; the create addon is then unavailable to projects.
The same addon also exposes Stock Ticker logistics for stock snapshots and package requests.
Enable the addon
Choose a Kinetics completion in the attached IDE to add its import and enable the addon automatically, or add Create
to the project’s compukter.toml manually:
format = 3
name = "kinetic-monitor"
addons = ["create"]
The IDE, analysis worker, and compiler all use the attached server’s target profile. A project that requests this addon
therefore resolves only when the target actually has the compatible Create integration loaded. Exact addon versions
and content hashes are recorded by the IDE in compukter.lock; they are not written by hand in this manifest.
Peripheral cables and names
Place a Peripheral Cable next to any face of the computer, route cables orthogonally, and let the cable touch a supported Create device. Cables may branch and loop. Every computer on the same loaded cable component can reach the same devices; no controller or adapter block owns the network.
To give a device a name:
- Use a Peripheral Configurator directly on a speedometer, stressometer, or rotation speed controller. This opens its name editor and inspects the cable network attached to that device.
- Enter a name containing 1–32 lowercase letters, digits, underscores, or hyphens and beginning with a letter. The editor immediately highlights a name already used by a reachable device.
- Save to assign the name, or Shift-use a configurator on the device to clear it.
The name belongs to the device rather than a computer or cable. It survives rewiring, computer replacement, chunk unload, and server restart. Names only need to be unique within the component where a computer performs lookup. If two reachable Create devices have the same name, acquisition fails as ambiguous instead of choosing one.
import create.kinetics.Kinetics
fun main() {
val input = Kinetics.speedometer("input")
val load = Kinetics.stressometer("main_load")
val controller = Kinetics.rotationController("governor")
println(input.speed())
println(load.capacity())
println(controller.setTargetSpeed(128))
}
Discovery uses loaded chunks only and never forces a chunk to load. Breaking the cable path makes subsequent acquisitions unavailable. An already acquired handle remains tied to its exact block entity and never follows another device that later receives the same name.
Direct sides and devices
Sides are relative to the front of the computer, just like the redstone API:
import create.kinetics.Kinetics
fun main() {
val input = Kinetics.left.speedometer()
val load = Kinetics.bottom.stressometer()
val controller = Kinetics.top.rotationController()
println(input.speed())
println(load.stress())
println(load.capacity())
println(controller.setTargetSpeed(128))
}
front, back, left, right, top, and bottom inspect exactly one adjacent loaded block. They never scan the
world or force a chunk to load. The requested block must be the matching Create block entity:
| Accessor | Adjacent Create device | Operations |
|---|---|---|
speedometer() |
Speedometer | speed(): Float, awaitSpeedChange(): Float |
stressometer() |
Stressometer | stress(): Float, capacity(): Float, awaitChange(): Unit |
rotationController() |
Rotation Speed Controller | targetSpeed(): Int, setTargetSpeed(Int): Int |
Speed, stress, and capacity retain Create’s Float values without integer rounding. Speeds are signed. A rotation
controller applies Create’s own configured bounds, and setTargetSpeed returns the value that was actually accepted.
If Create exposes NaN, positive or negative infinity, or signed zero, the same binary32 value reaches Guest Kotlin;
the integration does not sanitize, widen, or convert it to fixed point. Change waits compare the observed binary32
value, including the distinction between positive and negative zero.
awaitSpeedChange() suspends until the observed speed changes and returns the new value. awaitChange() suspends until
either stress or capacity changes. These waits do not busy-poll in Guest code.
Lifetime and limits
A device accessor creates a handle for that exact acquired block entity. Replacing the block invalidates the old handle; it never silently reconnects to the replacement. Missing, mismatched, unloaded, removed, or stale devices fail the Guest operation deterministically, and the terminal process diagnostic identifies which condition prevented the operation.
Each running computer may retain at most 64 Create device handles and 64 pending Create waits. Host requests and completions cross the same bounded asynchronous actor path as other world-facing computer operations and execute on the server thread where Minecraft and Create state may safely be accessed.