▶️ ЗАБЕРИ СВОИ 8 ПОДАРКОВ 🎁 ПРИ СОЗДАНИИ СВОЕГО МАЙНКРАФТ СЕРВЕРА
Моды/Create Aeronautics: Thrusters and Things
Create Aeronautics: Thrusters and Things

Create Aeronautics: Thrusters and Things

A create aeronautics addon that adds new ways to control and interact with physics contraptions

1.7K
6

🚀 Public Release

Take your Create Aeronautics contraptions to the next level.

Join the Discord!

Realtime live Issue Tracker!

Realtime Roadmap for planned features and what I'm currently working on!

Create Thrusters and Things adds propulsion, steering, power, and control systems built for ships, aircraft, and advanced moving machines. Build anything from a simple hover platform to a fully scriptable flight rig.


🔧 What you can build now

🔥Fuel-powered and energy-powered thruster systems
🎯Steerable propulsion setups with specialised bearings
🕹️Manual flight controls with joystick input and controller channels
⚙️Smart mechanical routing with dual-lane gearbox behavior
Full power loops with generation, transfer, and motor output
🤝Utility systems for docking, grabbing, and automation

🧱 New Blocks

BlockBlockBlock
ThrusterThruster BearingAnalogue Joystick
Contraption ControllerIndustrial AlternatorSmart Gearbox
Advanced Data LinkAndesite CableIndustrial Motor
Variable TransmissionClawPhysics Gantry

🎒 New Items

Upgrades

  • Processing Upgrades — Smoking, Smelting, Haunting (Tiers 1–4)
  • Propulsion Upgrades (Tiers 1–4)

Tools & Accessories

  • Thruster Lens
  • Physics Staff
  • Physics Goggles
  • Contraption Network Linker

✨ Feature Highlights

  • 🎨 Color your thruster plume/beam with dyes for custom builds.
  • 🔇 Run thrusters in quieter Peaceful mode for cleaner visuals and reduced noise.
  • 🔆 Switch between classic fuel and Focused FE beam operation with the Thruster Lens.
  • 🔗 Feed fuel and FE through mounted bearing/gimbal assemblies for distributed propulsion setups.
  • 🔀 Use Smart Gearbox in passthrough or servo workflows for advanced control layouts.
  • 🖱️ Flip face output direction on Smart Gearbox with simple right-click interaction.
  • 📉 Slow down rotation with redstone using the Variable Transmission.
  • 📦 Bulk process faster and more efficiently by placing depots or belts along the sides of the thruster plume/beam and in front of it to process everything around it!
  • 🗺️ Add and store up to 15 maps inside the Navigation table at once, and pick one to set the table's navigation to at any time!
  • 🥽 Use the Physics Goggles to see real-time physics information and contraption diagrams for any contraption you look at!
  • 🛜 Use the Contraption Network Linker to wirelessly control redstone capable blocks from the Contraption Controller without needing redstone links!
  • 🧰 Tom's Simple Storage Wireless terminal compatibility with Aeronautics has been added!
  • And so much more!

💻 Automation Ready

CC:Tweaked peripheral support for major systems, including thrusters, bearings, gearbox, joystick, controller, and more. Control single devices or orchestrate attached thruster groups from code.

📖 ComputerCraft peripheral snippets for all you programmers!


Build bigger. Fly farther. Automate everything.

Spoiler

Create Thrusters & Things — ComputerCraft API

This document covers every ComputerCraft peripheral exposed by this addon.

Getting Started

ComputerCraft peripherals let you control mod blocks from Lua scripts running on a Computer or Pocket Computer. To connect to a block, place the computer next to it (or use a Wired Modem) and use peripheral.find() or peripheral.wrap():

local t = peripheral.find("thruster")
if t then
  t.setEnabled(true)
  t.setThrottle(0.5)
end

Blocks default to "auto" mode, which means they'll respond to whatever input is present — redstone, computer, or manual. You can lock a block to a specific control mode through its GUI or via setControlMode() if you want to prevent other inputs from interfering.


Peripherals

Type stringBlock
thrusterThruster
thruster_bearingThruster Bearing
bidirectional_gearboxSmart Gearbox
analogue_contraption_controllerContraption Controller
analogue_joystickAnalogue Joystick
clawClaw
rope_winch_cableRope Winch Cable (when a Claw is attached)

1. Thruster

Type: "thruster"

Methods

MethodReturnsDescription
setThrottle(throttle)Sets throttle. Range 0.0 to 1.0. Throws if out of range.
getThrottle()numberReturns current throttle.
clearThrottleOverride()Removes the computer throttle override, returning control to redstone or auto.
setEnabled(enabled)Enables or disables the thruster.
isEnabled()boolean
isActive()booleanWhether the thruster is actively firing.
getFuel()number (mB)Current fuel level.
getFuelCapacity()number (mB)Maximum fuel capacity.
getFuelType()stringFluid ID of current fuel, or empty string.
getBurnTimeSeconds()numberEstimated burn time remaining.
getThrust()numberTarget thrust value.
getRealThrust()numberActual thrust being applied.
getLiftCapacity()numberMax lift this thruster can provide.
getAirflow()numberCurrent airflow value.
getRedstoneSignal()number (015)Incoming redstone signal strength.
getControlMode()stringCurrent mode: auto, redstone, or computer.
setControlMode(mode)Set control mode.
getName()stringCustom display name.
setName(name)Set a custom display name.
isSoulMode()booleanWhether soul mode (peaceful/quiet operation) is enabled.
setSoulMode(enabled)Toggle soul mode.
getStatus()tableFull status snapshot (see below).

getStatus() return shape

{
  enabled = boolean,
  throttle = number,
  computerThrottle = number,
  controlMode = string,
  fuel = number,
  fuelCapacity = number,
  fuelType = string,
  burnTimeSeconds = number,
  thrust = number,
  realThrust = number,
  liftCapacity = number,
  airflow = number,
  active = boolean,
  soulMode = boolean,
  redstoneSignal = number,
}

Example

local t = peripheral.find("thruster")
if t then
  t.setControlMode("computer")
  t.setEnabled(true)
  t.setThrottle(0.75)
  print("Real thrust:", t.getRealThrust())
end

2. Thruster Bearing

Type: "thruster_bearing"

Controls the bearing's pivot angle and steering mode, and manages any thrusters attached to it as a group. Most thruster methods accept either a specific thruster ID or "all" to target every attached thruster at once.

Bearing control

MethodReturnsDescription
getName() / setName(name)string / —Custom display name.
getFacing() / setFacing(direction)string / —Facing direction.
getPivotAngle()number (degrees)Current pivot angle.
setPivotAngle(angleDeg)Set pivot angle directly (servo/computer mode).
clearPivotOverride()Remove computer pivot override.
getServoInputAngle()number (degrees)Target angle from servo input.
getBearingControlMode()stringCurrent mode: auto, redstone, computer, or servo.
setBearingControlMode(mode)Set bearing control mode.
getMinAngle() / setMinAngle(angleDeg)number / —Minimum allowed pivot angle.
getMaxAngle() / setMaxAngle(angleDeg)number / —Maximum allowed pivot angle.
getForwardSignal()numberRedstone signal on forward face.
getBackwardSignal()numberRedstone signal on backward face.

Thruster discovery

MethodReturnsDescription
listThrusters()tableAll attached thrusters keyed by ID (see below).
getThrusterCount()numberHow many thrusters are attached.
getOwnedThrusters()string[]List of thruster IDs.
ids()string[]List of thruster aliases.
thrusterAlias(idOrAlias, alias)Assign an alias to a thruster for easier targeting.
getNetworkInfo()tableFull network summary.

listThrusters() return shape:

{
  ["id"] = {
    alias = string,
    pos = {x, y, z},
    fuelType = string,
    controlMode = string,
    enabled = boolean,
    throttle = number,
  }
}

Per-thruster control

All of these accept a thruster ID, an alias, or "all". When "all" is used, read methods return a table keyed by thruster ID.

MethodReturns
setThrottle(id, throttle)— (accepts 0.01.0 or 0100)
getThrottle(id)number or map
getThrottleMap(id)always a map
setEnabled(id, enabled)
isEnabled(id)boolean or map
getFuel(id)number or map
getFuelCapacity(id)number or map
getFuelType(id)string or map
getBurnTimeSeconds(id)number or map
getControlMode(id)string or map
setControlMode(id, mode)— (auto, redstone, or computer)
getThrust(id)number or map
getRealThrust(id)number or map
getLiftCapacity(id)number or map
getAirflow(id)number or map
isActive(id)boolean or map
isSoulMode(id)boolean or map
setSoulMode(id, enabled)
clearThrottleOverride(id)
getRedstoneSignal(id)number or map
getThrusterStatus(id)telemetry table, or map of tables for "all"

Assembly totals

MethodReturns
getTotalRealThrust()number
getTotalLiftCapacity()number
getStatus()Full bearing + thruster snapshot (see below)

getStatus() return shape:

{
  facing = string,
  forwardSignal = number,
  backwardSignal = number,
  controlMode = string,
  servoInputAngle = number,
  pivotAngle = number,
  targetAngle = number,
  minAngle = number,
  maxAngle = number,
  totalRealThrust = number,
  totalLiftCapacity = number,
  thrusterCount = number,
  thrusters = table, -- same shape as listThrusters()
}

Example

local b = peripheral.find("thruster_bearing")
if b then
  b.setBearingControlMode("servo")
  b.setPivotAngle(22.5)
  b.setThrottle("all", 80)
  local net = b.getNetworkInfo()
  print("Thrusters:", net.thrusterCount)
end

3. Smart Gearbox

Type: "bidirectional_gearbox"

The Smart Gearbox has two operating modes. In passthrough mode it routes two independent rotation speeds through its lanes. In servo mode it drives each output face to a precise angle.

Methods

MethodReturnsDescription
getMode() / setMode(mode)string / —Current operating mode.
isServoMode()boolean
hasGyroSource()booleanWhether a Gyroscope Link is providing input.
getLaneMode(axis) / setLaneMode(axis, mode)string / —Get or set mode for a lane. Axis accepts x, east_west, east-west, ew, z, north_south, north-south, or ns.
isReverseMode()boolean
getSpeed()number
getLaneSpeed(axis)numberSpeed of a specific lane.
getSignal(face)numberRedstone signal on a face. Accepts north, south, east, west.
getFaceAngle(face) / setFaceAngle(face, angle)number / —Get or set the target angle for a face.
getFaceMaxAngle(face) / setFaceMaxAngle(face, angle)number / —Get or set the maximum angle limit for a face.
clearFaceAngle(face?)Clear the angle override for a face, or all faces if omitted.
clearFaceMaxAngle(face?)Clear the max angle limit for a face, or all faces if omitted.
getStatus()tableFull status snapshot (see below).

getStatus() return shape:

{
  servoMode = boolean,
  gyroSource = boolean,
  mode = string,
  reverseMode = boolean,
  speed = { north_south = number, east_west = number },
  laneModes = { north_south = string, east_west = string },
  signals = { north = number, south = number, east = number, west = number },
  angles = { north = number, south = number, east = number, west = number },
  maxAngles = { north = number, south = number, east = number, west = number },
}

Example

local gb = peripheral.find("bidirectional_gearbox")
if gb then
  gb.setMode("servo")
  gb.setFaceAngle("north", 30)
  gb.setFaceMaxAngle("north", 60)
end

4. Contraption Controller

Type: "analogue_contraption_controller"

The Contraption Controller manages named channels, each of which can be configured with different input behaviors like latching, stepping, or momentary press. Channels output a value from 0.0 to 1.0 that maps to a redstone signal strength.

Methods

MethodReturnsDescription
getName() / setName(name)string / —Custom display name.
listChannels()string[]Names of all configured channels.
getChannel(name)tableCurrent state of a channel.
setChannel(name, value)Set a channel value directly. Range 0.01.0.
getChannelMode(name) / setChannelMode(name, mode)string / —Get or set the channel's behavior mode.
getChannelConfig(name)tableFull channel configuration.
setChannelConfig(name, configTable)Update channel configuration (see keys below).
press(name)Simulate pressing a channel.
release(name)Simulate releasing a channel.
tap(name)Simulate a quick press and release.
reset(name)Reset a channel to its default state.
resetAll()Reset all channels.
getAxis(name)tableState of a named axis.
getAllSignals()tableCurrent output values for all channels.

setChannelConfig keys

KeyTypeDescription
modestringChannel behavior mode.
min, maxnumberOutput range.
riseRate, fallRatenumberHow fast the value ramps up or down.
stepAmountnumberStep size for step mode.
deadzone, smoothingnumberInput filtering.
debounceTicks, repeatIntervalTicksnumberTiming values (integer).
resetToZerobooleanWhether to return to zero on release.
repeatWhileHeldbooleanWhether to keep firing while held.
valuenumberSets the channel value directly.
frequencyA, frequencyBstringItem IDs for wireless link frequencies (e.g. "minecraft:iron_nugget"). Blank string to clear.

Example

local c = peripheral.find("analogue_contraption_controller")
if c then
  c.setChannelMode("throttle_up", "latch")
  c.setChannel("throttle_up", 1.0)
  print(textutils.serialize(c.getAllSignals()))
end

5. Analogue Joystick

Type: "analogue_joystick"

The joystick outputs tilt values to redstone links and can be wrapped as a peripheral for naming. For reading live tilt values in code, wrap the bound redstone links as peripherals or read their outputs via the Contraption Controller.

Methods

MethodReturns
getName()string
setName(name)

Example

local j = peripheral.find("analogue_joystick")
if j then j.setName("Pilot Stick") end

6. Claw

Type: "claw"

The Claw grips and releases physics sub-levels. Signal strength controls grip — 15 means the claw will never drop its load, 0 means fully open. The drop chance scales with how low the signal is.

The Claw can also detect and target nearby connector blocks for precise docking.

Methods

MethodReturnsDescription
setSignal(signal)Set grip strength. Range 015.
clearSignalOverride()Remove computer signal override.
open()Fully open the claw (signal 0).
close()Fully close the claw (signal 15).
release()Release the held sub-level.
getSignal()numberCurrent effective signal.
getComputerSignal()numberComputer override value. -1 means no override.
isHolding()booleanWhether the claw is holding a sub-level.
getHeldConnectorPos(){x,y,z} or nilPosition of the connector being held.
getSelectedConnectorPos(){x,y,z} or nilPosition of the targeted connector.
getNearestConnector(){x,y,z} or nilNearest connector within default range.
getNearestConnectorInRange(range){x,y,z} or nilNearest connector within a given range.
getConnectorsInRange(range)[{x,y,z}, ...]All connectors within range.
getConnectorsInRangeLimited(range, limit)[{x,y,z}, ...]All connectors within range, up to a limit.
isConnectorInRange(x,y,z)booleanWhether a connector is within default range (3).
isConnectorInRangeWithRadius(x,y,z,range)booleanWhether a connector is within a given range.
selectConnector(x,y,z)booleanTarget a specific connector for gripping.
clearSelectedConnector()Clear the targeted connector.
getStatus()tableFull status snapshot (see below).

getStatus() return shape:

{
  signal = number,
  computerSignal = number,
  holding = boolean,
  heldPos = {x=number, y=number, z=number} | nil,
  selectedPos = {x=number, y=number, z=number} | nil,
}

Example

local claw = peripheral.find("claw")
if claw then
  local p = claw.getNearestConnectorInRange(5)
  if p then claw.selectConnector(p.x, p.y, p.z) end
  claw.close()
end

7. Rope Winch Cable (Claw passthrough)

Type: "rope_winch_cable"

Only registered when the Rope Winch has a Claw attached. Exposes the same control surface as the Claw peripheral directly, so you can control the claw through the winch cable without needing a direct connection to the claw itself. All claw methods throw "no claw connected to this rope winch" if the attachment is missing.

Methods

MethodReturns
isConnected()boolean
getRemoteType()"claw" or "none"

Plus all Claw methods listed in section 6. Note that position methods return {} instead of nil when there is no result, unlike the direct Claw peripheral which returns nil.

Example

local rw = peripheral.find("rope_winch_cable")
if rw and rw.isConnected() then
  rw.open()
  local s = rw.getStatus()
  print("Holding:", s.holding)
end

Create Thrusters & Things — External Compat ComputerCraft API

This document covers native ComputerCraft peripherals that this addon exposes for external Simulated and Aeronautics block entities.

Getting Started

Wrap or find a peripheral by its type string:

local burner = peripheral.find("hot_air_burner")
if burner then
  print("Signal:", burner.getSignal())
  print("Gas output:", burner.getGasOutput())
end

Most peripherals below use a shared reflection-backed helper surface. directional_gearshift is the exception: it now has its own purpose-built API with gearshift-specific methods instead of the generic signal/range/color set.

Peripherals

Type stringExternal block entity id(s)Block
laser_pointersimulated:laser_pointerSimulated Laser Pointer
laser_sensorsimulated:laser_sensor, simulated:ir_sensorSimulated Laser Sensor
analogue_transmissionsimulated:analogue_transmission, simulated:simpleSimulated Analogue Transmission
redstone_accumulatorsimulated:redstone_accumulatorSimulated Redstone Accumulator
redstone_inductorsimulated:redstone_inductorSimulated Redstone Inductor
redstone_magnetsimulated:redstone_magnetSimulated Redstone Magnet
optical_sensorsimulated:optical_sensorSimulated Optical Sensor
docking_connectorsimulated:docking_connectorSimulated Docking Connector
altitude_sensorsimulated:altitude_sensorSimulated Altitude Sensor
hot_air_burneraeronautics:adjustable_burnerAeronautics Hot Air Burner
steam_ventaeronautics:steam_ventAeronautics Steam Vent
mounted_potato_cannonaeronautics:mounted_potato_cannonAeronautics Mounted Potato Cannon

directional_gearshift

local gearshift = peripheral.find("directional_gearshift")
if gearshift then
  gearshift.setOutputs(true, false)
  print("Left:", gearshift.isLeftPowered(), "Right:", gearshift.isRightPowered())
end
MethodReturnsDescription
setLeft(powered)Set the left-side gearshift input/output state.
setRight(powered)Set the right-side gearshift input/output state.
setOutputs(left, right)Set both left and right states together.
clear()Clears both gearshift states back to off.
isLeftPowered()booleanCurrent left state.
isRightPowered()booleanCurrent right state.
getRotationModifier(face)numberReturns the rotation modifier for a face name like north, south, east, or west.
getStatus()tableReturns leftPowered, rightPowered, sourceFacing, blockPos, and className.

directional_gearshift is now the recommended pattern for blocks that have distinct left/right behavior; the controller and CC layers both map to those explicit sides rather than a generic setSignal() call.


Common Method Surface

Every non-gearshift type above exposes the methods below.

MethodReturnsDescription
getName()stringCustom name if exposed by target block entity, otherwise empty string.
setName(name)Sets custom name when supported.
getSignal()number (0-15)Reads signal-like value from the block entity.
setSignal(signal)Writes signal-like value when writable (0-15). Throws if unsupported.
isPowered()booleanWhether block is currently powered/active.
getRange()numberLaser/sensor range for compatible blocks.
setRange(range)Set range for compatible blocks. Throws if unsupported.
hasHit()booleanSensor hit status for compatible sensor blocks.
getDistance()numberHit distance / blocked distance when available; -1 if unavailable.
getColor()numberLaser color as RGB integer when available.
setColor(color)Set RGB laser color (0x000000 to 0xFFFFFF). Throws if unsupported.
is✨()boolean✨ laser mode for compatible blocks.
set✨(enabled)Toggle ✨ mode. Throws if unsupported.
getAirPressure()numberAtmospheric pressure for altitude-capable devices; -1 if unavailable.
getWorldHeight()numberWorld height from block sensor API when exposed.
getGasOutput()numberGas output for burner/vent blocks; 0 if unavailable.
getState()stringMachine state enum/string if present, else "unknown".
isBlocked()booleanBlocked-state indicator for cannon-style devices.
getBlockedLength()numberBlocked penetration distance where exposed.
getFacing()stringFacing direction if available from API or block state.
getPosition()table{ x, y, z } block position.
getClassName()stringRuntime Java class name backing this peripheral.
getStatus()tableFull merged status snapshot (see below).
methods()string[]Human-readable list of method signatures.
help(method?)table or stringDocumentation map, or single method help string.

getStatus() return shape

{
  type = string,
  name = string,
  signal = number,
  powered = boolean,
  range = number,
  hasHit = boolean,
  distance = number,
  worldHeight = number,
  airPressure = number,
  gasOutput = number,
  state = string,
  facing = string,
  blocked = boolean,
  blockedLength = number,
  color = number,
  ✨ = boolean,
  position = { x = number, y = number, z = number },
  className = string,
}

Block-Specific Notes

Laser devices

laser_pointer, laser_sensor, and optical_sensor are the best fit for:

  • getRange() / setRange(range)
  • hasHit() / getDistance()
  • getColor() / setColor(color)
  • is✨() / set✨(enabled)

Altitude and atmospheric devices

altitude_sensor, hot_air_burner, and steam_vent provide the most useful results for:

  • getWorldHeight()
  • getAirPressure()
  • getGasOutput()

Mounted Potato Cannon

mounted_potato_cannon is the primary user of:

  • isBlocked()
  • getBlockedLength()
  • getState()

Redstone machines

analogue_transmission, redstone_accumulator, redstone_inductor, and redstone_magnet primarily expose:

  • getSignal()
  • isPowered()
  • getState()
  • getStatus()

Example Scripts

1) Laser Pointer Control

local p = peripheral.find("laser_pointer")
if p then
  p.setSignal(15)
  p.setColor(0x00FF66)
  p.set✨(false)
  print(textutils.serialize(p.getStatus()))
end

2) Altitude Monitoring

local a = peripheral.find("altitude_sensor")
if a then
  while true do
    print("Height:", a.getWorldHeight(), "Pressure:", a.getAirPressure())
    sleep(0.5)
  end
end

3) Burner + Vent Snapshot

local burner = peripheral.find("hot_air_burner")
local vent = peripheral.find("steam_vent")

if burner then print("Burner gas:", burner.getGasOutput()) end
if vent then print("Vent gas:", vent.getGasOutput()) end

4) Cannon Safety Polling

local c = peripheral.find("mounted_potato_cannon")
if c then
  print("Blocked:", c.isBlocked(), "Length:", c.getBlockedLength(), "State:", c.getState())
end

Error Behavior

Write operations that are unsupported by a specific block throw a Lua error rather than silently failing.

Examples:

  • setSignal() on a block without writable signal fields/methods
  • setRange() on a non-range block
  • setColor() on a non-laser block
  • set✨() on a non-✨ block

Use getClassName() and help() in scripts to dynamically adapt behavior for mixed block fleets.

Совместимость

Minecraft: Java Edition

1.21.x

Платформы

Поддерживаемые окружения

Клиент и сервер

Создатели

Детали

Лицензия:LicenseRef-All-Rights-Reserved
Опубликован:1 неделю назад
Обновлён:8 часов назад
Главная