1.0.7p3
Compatibility
Required content
Changes
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] 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())))
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:e9CPu9Ub:nG2qbCJC"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:e9CPu9Ub:nG2qbCJC"
}