Перейти к содержимому
Mineforgian

Create: Avionics — ComputerCraft for Aeronautics

CC: Tweaked peripherals for Create: Simulated and Create: Aeronautics.

Загрузки
58K
Подписчики
76
Обновлён
25 июля 2026 г.
Лицензия
MIT

Опубликован 4 мая 2026 г.

Create: Avionics

Make your airship fly itself.

CC: Tweaked peripherals for every instrumentable block in Create: Aeronautics. Read attitude, altitude, velocity, bearing. Drive throttle, propellers, balloon gas. Write your autopilot in Lua (that's a bad pitch, but still!)

Build

  • Altitude-hold for hot-air balloons
  • Heading-and-pitch autopilots for propeller aircraft
  • Cruise control bound to a steering wheel
  • Tracked turrets for mounted potato cannons
  • Whatever else you can write a control loop for

Start

Heading hold on a twin-engine ship:

local nav        = peripheral.find("navigation_table")
local port, stbd = peripheral.find("analog_transmission")
local target     = nav.getHeadingRad()

while true do
    local err = (target - nav.getHeadingRad() + math.pi) % (2*math.pi) - math.pi
    local diff = math.max(-5, math.min(5, err * 4))
    port.setSignal(7 - diff); stbd.setSignal(7 + diff)
    sleep(0.05)
end

Three peripherals, one P-controller, the ship locks heading. Every Aeronautics (and nearly every Create) block is a peripheral — read sensors, set actuators, write the loop you want.

Not just aircraft

The same peripheral.find() surface drives lifts, vehicles, and your whole rotational network — not only things that fly.

Create Elevators — enumerate floors, call the cabin, read where it is:

local lift = peripheral.find("Create_ElevatorPulley")
lift.setTargetFloor(lift.getFloors()[3].y)   -- send the cabin to the 3rd floor
repeat sleep(0.1) until lift.isArrived()
print("Arrived: " .. lift.getCurrentFloor().short_name)

Kinetic SCADA — walk the rotation network, alarm on overstress:

local draw, capacity = 0, 0
for _, name in ipairs(peripheral.getNames()) do
    local p = peripheral.wrap(name)
    if p.getNetworkId then                       -- any kinetic block
        draw     = draw     + p.getStressImpact()
        capacity = capacity + p.getStressContribution()
        if p.isOverstressed() then
            print("OVERSTRESSED " .. p.getSelfId() .. " (" .. p.getKind() .. ")")
        end
    end
end
print(("Network load: %.0f / %.0f SU"):format(draw, capacity))

Vehicles — steering and brake override on wheel mounts:

for _, w in ipairs({ peripheral.find("wheel_mount") }) do
    w.setSteering(0.5)                                       -- -1..1  ->  +/-30 deg
    if w.getTouchingFriction() < 0.5 then w.setBrake(0) end  -- ease off on slippery stuff
end

getKind, getSubnetworkAnchorId, getColumnContacts, getTouchingFriction — the read side is as rich as the write side.

Full API docs — units, body-frame conventions, every method.

Read the parallel guide. 5 Hz and 20 Hz feel different.

Install

Needs: MC 1.21.1 · NeoForge 21.1.219+ · Create 6.0.10+ · Simulated/Aeronautics/Offroad 1.2.1+ · Sable 1.1.0+ · CC: Tweaked 1.115+

Pairs with

ccc · create-computercraft

Source · Issues

github.com/SolAstrius/CreateAvionics

MIT. Built on RyanHCode's CC peripheral foundation in Simulated — NOTICE.

Created by yours truly, Sol Astrius Phoenix.

Ченджлог

0.5.2Альфа1.21.1 · 25 июля 2026 г.

Added

  • Releases now publish to CurseForge. The CurseForge listing had been stuck on 0.4.0 since 2026-05-11 while Modrinth carried through 0.5.1, so anyone browsing from a launcher's CurseForge index saw a build three releases old. Note that Create Aeronautics — which supplies the required simulated dependency — is published only on Modrinth, and still has to be installed from there.

Fixed

  • Runs on Create: Simulated 1.3.0. mods.toml has always declared simulated [1.2.1,), but 1.3.0 renamed getLaserRange to getRaycastLength and retyped the recovery-compass placer component from String to UUID, so the jar would not in fact have run against it. Both are bridged: one jar now covers Simulated 1.2.1 through 1.3.0, and Sable 1.1.x through 2.0.x, with no change to any Lua-visible value.
  • mounted_potato_cannon: getAimingVector and getBarrelPos returned body/local-frame values instead of the world-frame values their docs promise — the aim came back as a fixed body axis (e.g. {1, 0, 0}) and the muzzle position carried raw sub-level local coordinates. Both now project out of the host sub-level (aim rotated into world frame, muzzle position projected to world frame), and pass through unchanged when the cannon isn't on a sub-level ([#18], [#22]).
  • linked_typewriter: the key event fired before the keypress had been applied and carried an "alive" flag read from the pre-update state. It now fires once the key has registered, with true as the third argument.

Changed

  • Startup logs when Create: Simulated's own ComputerCraft registration is suppressed, alongside Avionics' own registration lines. Avionics replaces that registration wholesale, and previously nothing in the log said so — which made reports about missing or misbehaving Simulated peripherals hard to read.
  • Internal: the Create-side peripheral table moved out of ComputerBehaviourMixin into CreatePeripheralRegistry; the kinetic SCADA pack now routes entirely through KineticReadback so its two declarations cannot drift; the three CC integration classes share one add() helper. No behavioural change.
  • CI compiles and tests against the ends of the declared upstream ranges (Simulated 1.2.1/1.3.0 × Sable 1.1.1/2.0.3), so an upstream rename fails a build instead of a user's launch. Adds the first tests in the repo.
0.5.1Альфа1.21.1 · 9 июня 2026 г.

⚠️ 0.5.0 was withdrawn — it crashed on launch with every mod configuration and has been removed from Modrinth and GitHub releases. Upgrade from 0.4.0 directly to 0.5.1. Since nobody should have 0.5.0, its full changelog is included below.

🛑 Breaking change for Lua scripts (introduced in 0.5.0): the per-block getStressCapacity of the kinetic SCADA pack is renamed to getStressContribution (on KineticPeripheral, SimKineticPeripheral, and KineticSource). The old name collided with Create_Stressometer.getStressCapacity, which reports the network-wide total and keeps its name.

0.5.1

Fixed

  • 0.5.0 crashed on launch for everyone: PeripheralComposition resolved Simulated's portable-engine block-entity holder during mod construction, before block-entity registries are bound, throwing "Trying to access unbound value". Suppliers are now parked and resolved on first lookup. 0.5.0 has been withdrawn from Modrinth and GitHub releases — upgrade directly from 0.4.0 to 0.5.1.
  • Composed peripherals now report their generic type names: portable engines answer peripheral.hasType(name, "inventory") and are returned by peripheral.find("inventory"). 0.5.0 composed only the methods, not the types, so scripts that locate inventories by type still missed them (follow-up to [#15]).

0.5.0 (yanked) — included because the release was withdrawn

Added

  • swivel_bearing: locking-mode control and assembly diagnostics — isLocked, getLockingMode, setLockingMode (one of locked_always, locked_default, unlocked_default, unlocked_always), and getLastAssemblyException (the message from the most recent failed assembly attempt, or nil). Public API ink.astrius.create_avionics.api.simulated.SwivelBearingExt — mixin-supplied interface for downstream addons.
  • Kinetic SCADA pack on bare kinetic blocks: a new KineticSource generic source applies the full pack to every KineticBlockEntity that has no explicit peripheral (encased shafts, gearboxes, mixers, …). Thanks @TechTastic ([#6]).
  • Generic-source methods now compose onto capability-supplied peripherals: blocks whose peripheral Avionics supplies via the NeoForge capability (e.g. portable_engine) also expose matching generic packs instead of shadowing them.

Changed

  • Breaking: the per-block getStressCapacity of the kinetic SCADA pack is renamed to getStressContribution (on KineticPeripheral, SimKineticPeripheral, and KineticSource). The old name collided with Create_Stressometer.getStressCapacity, which reports the network-wide total and keeps its name.
  • gas_provider.getGasType(): third-party LiftingGasType implementations now return their class's simple name instead of "unknown". Stock types still return "steam" / "default".
  • Simulated-side peripherals deduplicated against the originals Simulated ships: altitude_sensor, gimbal_sensor, and linked_typewriter now extend their upstream counterparts; standalone duplicates of the nameplate, modulating-link, directional-link, docking-connector, nav-table, optical-sensor, and velocity-sensor peripherals were removed in favor of upstream's, with method parity preserved. Thanks @TechTastic ([#6]).

Fixed

  • Portable engines are inventory peripherals again: the capability-supplied peripheral no longer drops CC: Tweaked's generic inventory methods ([#15]).

Docs

  • The kinetic SCADA pack is declared once on the KineticScadaSurface interface; the cct-javadoc fork gained interface scanning (1.10.0-mainthread.4) so @LuaFunction default methods on interfaces document correctly.
  • StressGauge: use @code instead of @link for non-peripheral types so references render instead of breaking.

Full Changelog: https://github.com/SolAstrius/CreateAvionics/compare/v0.5.0...v0.5.1

0.4.0Альфа1.21.1 · 11 мая 2026 г.

Added

  • Create: Offroad support. New wheel_mount peripheral.
  • Script overrides for steering and braking. setSteering(-1..1) and setBrake(0..1) bypass the redstone reads. Both independent.
  • Wheel state reads. hasTire, getTireRadius, getExtension, getAngularVelocity, getTouchingFriction, isLiftedUp, plus the usual kinetic SCADA surface.

Full changelog · Docs

0.3.1Альфа1.21.1 · 10 мая 2026 г.

Highlights

  • gyroscopic_propeller_bearing actually controllable from Lua. New persistent manual-target override replaces the bearing's automatic gravity-tracking with a script-supplied direction. State is synced to the client and survives save/load. The bearing's 12° cone clamp, redstone power gate, and stabilization-strength gate still apply on top.
    • setManualTarget({x,y,z}), clearManualTarget(), getManualTarget()

Removed

  • gyroscopic_propeller_bearing.setTilt and setStrictTilt. These were never callable in 0.3.0 — CC silently dropped them because List<Double> is not a supported @LuaFunction parameter type. Even with the marshalling fixed, they were single-tick step primitives that the bearing's own physics tick overwrites on the next tick. Use setManualTarget instead.

Full changelog · Docs

0.3.0Альфа1.21.1 · 10 мая 2026 г.

Highlights

  • Proper Create SCADA. Drop-in replacements for every Create peripheral (Create_CreativeMotor, Create_RotationSpeedController, Create_Speedometer, Create_Stressometer, Create_MechanicalBearing, Create_MechanicalPiston, Create_RopePulley, Create_ElevatorPulley, Create_ElevatorContact, Create_GantryShaft, Create_SequencedGearshift) - Create's verbatim methods plus a uniform topology surface (getSelfId, getSourceId, getSubnetworkAnchorId, getNetworkId, getKind, getSpeed, hasSource, isOverstressed, getStressImpact, getStressCapacity).
  • nav_table per-target metadata. Compass, recovery compass, and map targets now expose lodestone position, recovery death-pos, and map id/bounds.
  • Public Java API (ink.astrius.create_avionics.api.create.*) for downstream addons.

Breaking - behavior

  • gimbal_sensor.getLinearAcceleration now subtracts gravity. A stationary sensor previously reported ~9.8 m/s² on its vertical axis; it now reports zero. Scripts that compensated manually must drop that compensation.

Breaking - Lua API renames

Old New
propeller.getKineticSpeed() getSpeed()
propeller_bearing.getKineticSpeed() getSpeed()
propeller_bearing.getStressApplied() getStressImpact()
mounted_potato_cannon.getKineticSpeed() getSpeed()
analog_transmission.getInputSpeed() getSpeed()
analog_transmission.getStressApplied() getStressImpact()
analog_transmission.getOutputStressApplied() getOutputStressImpact()

Full changelog · Docs

Комментарии

Загружаем…