
Create Balloon
Adds inflatable hot air balloons to Create: Aeronautics.
Список изменений
What's New in 1.0.7p3
-
CC:Tweaked native API — call
balloon.ascend()directly from any computer on a Sable structure. Noperipheral.wrap()orperipheral.find()required. Old peripheral approach still works for backward compatibility. -
getHeight()added — returns the Y coordinate of the first balloon on the structure. -
Gyroscope angular impulse cap — prevents PD controller runaway on tiny structures (< 20 mass). Restoring and damping torque combined magnitude clamped to
mass × 0.5per tick. Large structures unaffected. -
Debug logging overhaul —
- Session archive naming uses readable timestamps (
debug-2026-07-03_15-30-00.log). latest-debug.log— tail view of current session (last 5000 lines), crash-safe, always the file you check first.latest-debug-throttled.log— same tail view but PHY entries throttled to 1 Hz for quick browsing.- Full per-session log written to timestamped archive (never deleted, never truncated).
- Session archive naming uses readable timestamps (
-
Example scripts updated — all use new native API syntax.
balloon_test_all.luaadded for full API testing. -
HotAirBalloonBlock entity state cleanup — movement flags now reset on controller stop/remove.
-
CC:Tweaked Usage
Both approaches work. Choose whichever you prefer:
-- New: native global API (works from any computer on the structure)
balloon.ascend()
balloon.descend()
balloon.hover()
balloon.forward()
balloon.back()
balloon.turnLeft()
balloon.turnRight()
balloon.stop()
balloon.count()
balloon.isActive()
balloon.getHeight()
-- Old: peripheral wrapping (backward compatible, computer next to balloon/controller)
local b = peripheral.find("balloon")
b.ascend()
b.descend()
b.hover()
b.forward()
b.back()
b.turnLeft()
b.turnRight()
b.stop()
b.count()
b.isActive()
-- Note: getHeight() is native API only
-- Create Balloon CC API Test
-- Put on Sable
print("==== Create Balloon API Test ====")
print()
-- 1. count / getHeight / isActive
local n = balloon.count()
local h = balloon.getHeight()
local a = balloon.isActive()
print(string.format("[STATUS] ballo height=%d active=%s", n, h, tostring(a)))
if n == 0 then
error("No balloons found on this structure. Place balloon blocks first.")
end
-- 2. ascend
print("[TEST] ascend()")
balloon.ascend()
sleep(3)
print(" height after 3s: " .. balloon.getHeight())
-- 3. hover
print("[TEST] hover()")
balloon.hover()
sleep(3)
print(" height after 3s: " .. balloon.getHeight())
-- 4. descend
print("[TEST] descend()")
balloon.descend()
sleep(3)
print(" height after 3s: " .. balloon.getHeight())
-- 5. forward
print("[TEST] forward()")
balloon.forward()
sleep(2)
balloon.hover()
print(" moved forward 2s")
-- 6. back
print("[TEST] back()")
balloon.back()
sleep(2)
balloon.hover()
print(" moved back 2s")
-- 7. turnLeft
print("[TEST] turnLeft()")
balloon.turnLeft()
sleep(2)
balloon.hover()
print(" turned left 2s")
-- 8. turnRight
print("[TEST] turnRight()")
balloon.turnRight()
sleep(2)
balloon.hover()
print(" turned right 2s")
-- 9. stop
print("[TEST] stop()")
balloon.stop()
sleep(1)
print(" active: " .. tostring(balloon.isActive()))
-- 10. hover -> ascend -> stop cycle
print("[TEST] ascend→hover→stop cycle")
balloon.ascend()
sleep(2)
balloon.hover()
sleep(1)
balloon.stop()
sleep(1)
print(" all stopped")
print()
print("==== All tests passed ====")
print(string.format(" final: balloons=%d height=%d active=%s",
balloon.count(), balloon.getHeight(), tostring(balloon.isActive())))
