Skip to content

feat: show the void taking a harvested block over a second - #122

Merged
adamico merged 5 commits into
mainfrom
claude/triage-98-d9150a
Oct 16, 2026
Merged

adamico merged 5 commits into
mainfrom
claude/triage-98-d9150a

Conversation

@adamico

@adamico adamico commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

Closes #98. The design is the Harvesting paragraph in docs/spec/void-energy.md ("Every harvest also shows the void taking the block…"), grilled on the issue; the agent brief is the issue's last comment.

What changed

  • Server: a Void Displacer's harvest, a Void Siphon's by hand, and a spent Displacer becoming Voidstone each call VoidTaking.show, which posts a public VoidTakesBlockEvent (position, what it held) on the NeoForge bus, then sends a VoidTaking payload to the players tracking the chunk. The mechanic is unchanged: the position is Voidstone in the harvest's tick, with the same yield, network and Frontier. The 30-particle crumble bursts are gone; the chorus sound stays.
  • Client (VoidTakings): what was harvested is drawn over the Voidstone, 1% larger, and eaten away through 12 cumulative stage masks over 20 ticks (TakingStages, TakingMask), each face's masks turned one of 8 ways by its position. A solid is its own model, shedding crumbs from its open faces; a fluid is a cube of its still texture, full bright when it glows (lava); air is the End's starfield. A taking is dropped when its chunk unloads or the player leaves its level.
  • Placeholder masks: assets/voidworks/textures/void_taking/stage_1..12.png, generated by taking_masks() in scripts/build-textures.py. A mask paints, at ≥50% alpha, every pixel the void has reached by its stage. The final art is Draw the final displacement stage masks #107.

For the reviewer

  • The masks are drawn as geometry, not by depth stamping as the brief and Just Dire Things do: each face is drawn only over the runs of pixels the void has not reached. 26.1's render pipelines would need a custom pipeline to stamp depth; this keeps the vanilla moving-block and end-portal render types, and looks the same.
  • VoidTakesBlockEvent is new public API, the Module's first event, and the seam the game tests watch, as a FakePlayer drops the payload. It has a changelog line.
  • A multi-element model, such as the Displacer's own casing, gets the whole mask over each quad, so its blotches don't line up across elements. Left as is.
  • Merged main (feat: a void displacer buys zone upgrades with motes #105): the only conflict was DisplacerBlockEntity's imports.

Testing

  • sh ./gradlew build: passes, with 22 new JUnit tests (TakingStagesTest, TakingMaskTest, and ShippedMasksTest, which checks the shipped PNGs are 16×16, cumulative, and full by stage 12).
  • runGameTestServer: all 257 pass, among them 6 new void_takes_* tests (a Displacer's terrain, a spent Displacer, a Siphon's terrain, lava and air, and nothing for a refused harvest), each seen failing before the wiring.
  • /code-review (standards and spec) found no hard violation and no missing requirement; its fixes are in e10e676.
  • Not yet checked in the dev client: how it looks. Watch a Displacer's wave, a Siphon harvest of terrain, lava in the Nether and air in the End, and a spent Displacer, and look for z-fighting from about 30 blocks.

🤖 Generated with Claude Code

adamico and others added 5 commits October 16, 2026 19:10
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each harvest, by a Void Displacer or a Void Siphon, and a spent
Displacer becoming Voidstone, posts a VoidTakesBlockEvent and sends a
VoidTaking to the players tracking the position. The client draws what
was there over the Voidstone, a hair larger, and eats it away through 12
stage masks over 20 ticks: a solid block's own model shedding crumbs, a
fluid as a cube of its still texture, air as the End's starfield. The
masks are drawn as geometry, each face only over the pixels the void has
not reached, so the vanilla render types serve. The server mechanic is
unchanged: the position is Voidstone from the harvest's tick.

The 12 masks are placeholders scripts/build-textures.py generates, until
#107 draws them.

Closes #98

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From the review: a taking is dropped when the player leaves its level,
a glowing solid keeps its glow while taken, crumbs are shed from its
open faces rather than inside the Voidstone, a fluid's or air's cube
shows every face no opaque block covers so none of a lake's Voidstone
shows early, and it is drawn half a percent larger a side so depth
tells it from the Voidstone a chunk away.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	src/main/java/io/github/_5thlayer/voidworks/displacer/DisplacerBlockEntity.java
# Conflicts:
#	src/main/java/io/github/_5thlayer/voidworks/Voidworks.java
@adamico
adamico merged commit 9107df8 into main Oct 16, 2026
4 checks passed
@adamico
adamico deleted the claude/triage-98-d9150a branch October 16, 2026 17:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Show a displacement gradually, not as an instant swap to Voidstone

1 participant