create_balloon-1.0.7p3.jar
Curse Maven Snippet
What's new
### What's New in 1.0.7p3
- **CC:Tweaked native API** — call `balloon.ascend()` directly from any computer on a Sable structure. No `peripheral.wrap()` or `peripheral.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.5` per 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).
- **Example scripts updated** — all use new native API syntax. `balloon_test_all.lua` added 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:
```lua
-- 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()
```
```lua
-- 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
```
```Example scripts
-- 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] balloons=%d 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())))
```
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include

