Tags
Creators
Details
ALPHA-1.6
Compatibility
Changes
Water systems. A climate system now conditions either air or water, so the same simulation that heats a room heats a swimming pool.
Supersedes ALPHA 1.6 Pilot 1 and includes everything that was in it.
Water systems
- Waxed copper grates placed in a body of water are water vents, the way iron trapdoors are air vents.
- Boilers are the water-loop heat source — heating only, dispenser-backed
like every other unit.
/hvac create boiler <group> - Pool thermostats clamp to the water target range, 75–104 °F, against
60–85 °F for rooms.
/hvac create poolthermostat <id> <group>
A water body behaves exactly like a room: same thermostat, same hysteresis and minimum run/off timers, same capacity from multiple units, same distance falloff from each vent, same ETA. More equipment heats faster; more vents cover more of the body. Nothing about water is slower or special-cased.
The two loops stay separate
| Air loop | Water loop | |
|---|---|---|
| Thermostat | thermostat, 60–85 °F | pool thermostat, 75–104 °F |
| Sources | heat pump, air conditioner, furnace | boiler |
| Vents | iron trapdoor | waxed copper grate |
A system is all air or all water, and its thermostat, sources and vents must agree. That's what stops a pool thermostat being pointed at heat pumps to heat a room to 104 °F. Mixing is refused when you register the device, with a message saying why.
Only the unweathered waxed grate counts — waxed copper never oxidises, so a vent can't change material on its own and quietly unregister itself.
Breaking a device now tells you
Removals used to be silent, so a stray pickaxe could unregister a thermostat with nothing to show for it. A break now names the device and the system it left, and removing a system's last equipment warns that its thermostat will stay idle until equipment returns.
Nothing is deleted when a system empties — the thermostat, its target, and every linked vent survive, so replacing the equipment restores the system exactly.
Forward compatibility
Records written by a newer EZvac are preserved rather than dropped or
reinterpreted. Previously a section this build didn't recognise was deleted the
first time it saved, so trying a newer build and rolling back lost those devices
silently. meta.format is read now, and warns instead of being ignored.
⚠️ Upgrading
Upgrading to 1.6 is safe: hvac.yml format is unchanged (version 5),
config.yml gains two optional keys with defaults, and existing air systems
behave identically.
You cannot roll back to ALPHA 1.5 once you build a water system. 1.5 shipped
before the forward-compatibility work and will reinterpret BOILER as a heat
pump — which also cools — and delete every waxed copper grate vent. From 1.6
onward a downgrade degrades gracefully.
Coming from the pilot: your pools keep their room thermostat and its 60–85 °F range. Break and recreate the sign as a pool thermostat to widen it.
This is alpha software — back up your world and plugins/EZvac/hvac.yml first.
Thanks
@colebolebole proposed pool heating in the first place, then put the pilot through extensive testing on his server Soms.
Water systems exist because of that suggestion. Pool thermostats exist because of that testing — the air temperature range had simply been assumed to fit water, and running the pilot in earnest showed it does not.
Requirements
Paper 1.21.1 or a fork such as Purpur, and Java 21.
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:dCv4gYwb:dlhlZ04y"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:dCv4gYwb:dlhlZ04y"
}

