Use tall destination preview volume
Build / build (push) Canceled after 0s

This commit is contained in:
dnorberg committed 2026-09-21 08:41:48 -04:00
1 parent bff34b9341
commit 83af20ab6c
6 files changed
+17 -13

No files matched your search

+1 -1
View File
@@ -26,7 +26,7 @@ right-clicking with an empty hand. Sneak-right-click with an empty hand to take
the book back and restore the vanilla lectern. Breaking a Book Stand drops both the book back and restore the vanilla lectern. Breaking a Book Stand drops both
the stored book and a vanilla lectern. the stored book and a vanilla lectern.
Bound Linking Books request a server-validated 17-by-7-by-17 snapshot around Bound Linking Books request a server-validated 9-by-128-by-9 snapshot around
their destination and render its blocks as a rotating Ponder scene on the left their destination and render its blocks as a rotating Ponder scene on the left
page, backed by the destination biome's sky color. The snapshot is visual only; page, backed by the destination biome's sky color. The snapshot is visual only;
the server independently validates every link. the server independently validates every link.
+4
View File
@@ -127,6 +127,10 @@ Version 0.1.16 makes destination previews sample a centered 17-by-7-by-17
volume. The Ponder scene uses a scale that keeps its full horizontal diagonal volume. The Ponder scene uses a scale that keeps its full horizontal diagonal
inside the panel, so the complete snapshot remains available during its orbit. inside the panel, so the complete snapshot remains available during its orbit.
Version 0.1.17 changes destination previews to a 9-by-128-by-9 volume: a
square horizontal footprint with a vertical slice spanning 64 blocks below and
63 blocks above the recorded linking location.
The preview code is separated behind a renderer interface and uses an isolated The preview code is separated behind a renderer interface and uses an isolated
Ponder level populated from server-authoritative destination snapshots. Ponder level populated from server-authoritative destination snapshots.
+1 -1
View File
@@ -33,7 +33,7 @@ mod_name=Rivencraft
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
mod_license=LGPL-3.0-or-later mod_license=LGPL-3.0-or-later
# The mod version. See https://semver.org/ # The mod version. See https://semver.org/
mod_version=0.1.16 mod_version=0.1.17
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
# This should match the base package used for the mod sources. # This should match the base package used for the mod sources.
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html # See https://maven.apache.org/guides/mini/guide-naming-conventions.html
@@ -43,7 +43,7 @@ public final class PonderDestinationPreviewRenderer implements DestinationPrevie
public PonderDestinationPreviewRenderer() { public PonderDestinationPreviewRenderer() {
Minecraft minecraft = Minecraft.getInstance(); Minecraft minecraft = Minecraft.getInstance();
previewLevel = new PonderLevel(BlockPos.ZERO, minecraft.level); previewLevel = new PonderLevel(BlockPos.ZERO, minecraft.level);
selection = SelectionImpl.of(new BoundingBox(0, 0, 0, 16, 6, 16)); selection = SelectionImpl.of(new BoundingBox(0, 0, 0, 8, 127, 8));
section = new WorldSectionElementImpl(selection); section = new WorldSectionElementImpl(selection);
} }
@@ -105,10 +105,10 @@ public final class PonderDestinationPreviewRenderer implements DestinationPrevie
poseStack.mulPose(Axis.XP.rotationDegrees(-28.0F)); poseStack.mulPose(Axis.XP.rotationDegrees(-28.0F));
poseStack.mulPose(Axis.YP.rotationDegrees((ticks + partialTick) * 0.6F)); poseStack.mulPose(Axis.YP.rotationDegrees((ticks + partialTick) * 0.6F));
UIRenderHelper.flipForGuiRender(poseStack); UIRenderHelper.flipForGuiRender(poseStack);
// A 17×17 footprint has a 24-block diagonal. This scale fits that // Fit the complete 128-block vertical slice, while keeping the 9×9
// diagonal in the panel, including at the 45° points of the orbit. // footprint centered during the full horizontal orbit.
poseStack.scale(4.6F, 4.6F, 4.6F); poseStack.scale(0.58F, 0.58F, 0.58F);
poseStack.translate(-8.5F, -1.5F, -8.5F); poseStack.translate(-4.5F, -64.0F, -4.5F);
SuperRenderTypeBuffer buffer = DefaultSuperRenderTypeBuffer.getInstance(); SuperRenderTypeBuffer buffer = DefaultSuperRenderTypeBuffer.getInstance();
section.renderFirst(previewLevel, buffer, graphics, partialTick); section.renderFirst(previewLevel, buffer, graphics, partialTick);
@@ -12,8 +12,8 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
public record LinkPreviewPayload(int skyColor, List<SnapshotBlock> blocks) implements CustomPacketPayload { public record LinkPreviewPayload(int skyColor, List<SnapshotBlock> blocks) implements CustomPacketPayload {
/** A square footprint keeps every side of the scene available during a full orbit. */ /** A square footprint keeps every side visible during an orbit, with a tall vertical slice. */
private static final int MAX_BLOCKS = 17 * 7 * 17; private static final int MAX_BLOCKS = 9 * 128 * 9;
public static final Type<LinkPreviewPayload> TYPE = new Type<>( public static final Type<LinkPreviewPayload> TYPE = new Type<>(
ResourceLocation.fromNamespaceAndPath(Rivencraft.MOD_ID, "link_preview") ResourceLocation.fromNamespaceAndPath(Rivencraft.MOD_ID, "link_preview")
); );
@@ -114,12 +114,12 @@ public final class ModNetworking {
BlockPos origin = target.location().pos(); BlockPos origin = target.location().pos();
List<LinkPreviewPayload.SnapshotBlock> blocks = new ArrayList<>(); List<LinkPreviewPayload.SnapshotBlock> blocks = new ArrayList<>();
// The preview rotates through a complete orbit. Use the same radius on // The square footprint survives every angle of the orbit. The vertical
// both horizontal axes so no side falls outside the snapshot at 90°. // slice captures 64 blocks below through 63 blocks above the link point.
for (BlockPos pos : BlockPos.betweenClosed(origin.offset(-8, -2, -8), origin.offset(8, 4, 8))) { for (BlockPos pos : BlockPos.betweenClosed(origin.offset(-4, -64, -4), origin.offset(4, 63, 4))) {
var state = level.getBlockState(pos); var state = level.getBlockState(pos);
if (!state.isAir()) { if (!state.isAir()) {
blocks.add(new LinkPreviewPayload.SnapshotBlock(pos.subtract(origin).offset(8, 2, 8), state)); blocks.add(new LinkPreviewPayload.SnapshotBlock(pos.subtract(origin).offset(4, 64, 4), state));
} }
} }
int skyColor = level.getBiome(origin).value().getSkyColor(); int skyColor = level.getBiome(origin).value().getSkyColor();