🌊

AquaticPlayers

An underwater-mobility experiment that retunes vanilla water gameplay, faster drowning, fast underwater mining, and bubble columns flipped into traps that drain oxygen even underwater.

Private ProtocolLib WorldGuard
About

AquaticPlayers was a one-off experiment for an event where the world's gameplay loop centred on water, players spent significant time submerged, mining and moving underwater, and the vanilla penalties for doing any of that made the experience miserable.

The plugin replaces three vanilla systems: the air supply, the underwater/floating mining slowdown, and the rules for what counts as "breathable space". There are no commands and no config, drop it in and the new rules apply server-wide to every survival and adventure player.

Custom oxygen system

Each player gets a private oxygen value stored in their persistent data container, ranging from -100 up to 300. It runs on a custom server-tick event the plugin fires every tick, so all logic is deterministic and tied to the same clock.

Drain: when the player isn't submerged (or is in a bubble-column trap, see below), oxygen drops by 10 per tick. With 20 ticks per second, that's 200 per second: from a full pool of 300, it takes 30 ticks (1.5 seconds) to reach zero, then 10 more ticks to fall to -100 and trigger the first 2 damage. About 2 seconds in total, against vanilla's roughly 20. Built for a faster, more punishing tempo than vanilla allows.

Refill: when properly submerged, oxygen ticks back up by 30 every 4 ticks, capped at the 300 maximum. The Water Breathing potion effect halts drain entirely.

Damage: when oxygen falls to -100, the player takes 2 damage with the vanilla drown sound, and oxygen resets to 0, so the next damage tick is another 10 ticks of drain away.

Respiration: a Respiration helmet rolls a chance per drain tick to skip the drain entirely.

Resets: oxygen is restored to a full 300 on respawn, so death always wipes the slate clean.

Creative and spectator players are skipped entirely.

Air-bar handling: the plugin writes the vanilla air value every tick. At full oxygen (300) and at empty (≤ 0) it deliberately writes -10, which renders as zero bubbles, visually no bar, matching vanilla's behaviour of hiding the bar when there's nothing useful to show. -10 also keeps vanilla drowning damage from firing on its own, leaving the plugin's logic in sole control of when damage ticks. The 1–299 range renders as a normal partial bar while drain or refill is in progress.
Bubble-column traps

A column of water sitting on top of soul sand or a magma block: i.e. a vanilla bubble column, is treated as a hazard. Standing inside one drains oxygen at the same rate as being out of water entirely, even though the player is technically submerged. The breathable medium is plain water; bubble columns flip that.

Mechanically the plugin walks straight down from the player's eye block. If every block on the way down is a full-height water source and the column bottoms out at soul sand or magma, the column is flagged and oxygen drains. The interaction with vanilla's existing bubble-column physics (soul sand pushing you up, magma pulling you down) does the rest, the trap moves you while it suffocates you.

Custom mining

Vanilla applies a 5× break-time penalty for mining underwater without Aqua Affinity, and another 5× for mining while floating (not standing on a solid block). Stacked, that's 25× slower, fatal for a water-themed event where everyone is constantly off the ground in the ocean.

The plugin intercepts BLOCK_DIG packets through ProtocolLib and runs its own break loop:

- The floating penalty is unconditionally stripped (×5 multiplier).
- The underwater penalty is stripped only if the player doesn't have Aqua Affinity, so the enchantment is preserved as the way to mine fast underwater while standing on a block. With the enchant, you mine at vanilla underwater-with-Aqua-Affinity speed; without it but floating in water, you also mine at that speed, the experience converges on "fast enough that it's fine".
- Block-break animations are sent as fake packets per tick of progress.
- Tool durability and Unbreaking are honoured (Unbreaking gives a per-hit roll to skip damage; tools with no durability left get cleared from the hand).
- The custom break aborts if the player goes offline, dies, swaps worlds, or moves more than 8 blocks from the block.

WorldGuard integration: the packet handler runs the same BUILD flag check WorldGuard would, including bypass-permission handling, before doing any of its own work, so protected regions still block mining the way they would in vanilla.
Notes

Treat this one as experimental, it was written for one specific event and never hardened beyond that. The custom break loop in particular bypasses the vanilla BlockBreakEvent, so other plugins that listen to that event (anti-cheat, logging, custom-drops plugins) won't see anything when AquaticPlayers blocks are mined. Worth keeping in mind before mixing it with anything serious.