Lock player during book exploration
Build / build (push) Canceled after 0s

This commit is contained in:
dnorberg committed 2026-09-22 06:03:59 -04:00
1 parent 1586597161
commit ee388f2b55
6 files changed
+55 -17

No files matched your search

+1 -1
View File
@@ -35,7 +35,7 @@ mod_name=Rivencraft
# 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
# The mod version. Rivencraft uses the x.y.z.b policy documented in README.md.
mod_version=0.2.16.9
mod_version=0.2.16.10
immersive_portals_version=6.0.7
# 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.
@@ -28,6 +28,12 @@ public final class LinkingService {
return travel(player, target, false);
}
public static Optional<Vec3> resolveDestination(ServerLevel level, BlockPos origin, boolean ageArrival) {
return ageArrival
? findFootedAgeDestination(level, origin)
: findSafeDestination(level, origin, false);
}
/** Travels to an Age-style destination, which must have solid footing. */
public static LinkResult travelWithFooting(ServerPlayer player, LinkTarget target) {
ServerLevel destinationLevel = player.getServer().getLevel(target.location().dimension());
@@ -35,7 +41,7 @@ public final class LinkingService {
return LinkResult.MISSING_DIMENSION;
}
Optional<Vec3> destination = findFootedAgeDestination(destinationLevel, target.location().pos());
Optional<Vec3> destination = resolveDestination(destinationLevel, target.location().pos(), true);
if (destination.isEmpty()) {
return LinkResult.NO_SAFE_DESTINATION;
}
@@ -52,7 +58,7 @@ public final class LinkingService {
return LinkResult.MISSING_DIMENSION;
}
Optional<Vec3> destination = findSafeDestination(destinationLevel, target.location().pos(), requiresFooting);
Optional<Vec3> destination = resolveDestination(destinationLevel, target.location().pos(), requiresFooting);
if (destination.isEmpty()) {
return LinkResult.NO_SAFE_DESTINATION;
}
@@ -4,6 +4,8 @@ import com.mojang.blaze3d.platform.InputConstants;
import net.dnorberg.rivencraft.client.screen.ExplorableBookScreen;
import net.dnorberg.rivencraft.network.LinkPreviewPayload;
import net.minecraft.client.Minecraft;
import net.minecraft.client.KeyMapping;
import net.minecraft.world.phys.Vec3;
import net.neoforged.neoforge.client.event.ClientTickEvent;
import net.neoforged.neoforge.client.event.InputEvent;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
@@ -11,12 +13,15 @@ import org.lwjgl.glfw.GLFW;
public final class ClientBookExploreOverlay {
private static ExplorableBookScreen bookScreen;
private static Vec3 playerPosition;
private ClientBookExploreOverlay() {
}
public static void open(ExplorableBookScreen screen) {
bookScreen = screen;
Minecraft minecraft = Minecraft.getInstance();
playerPosition = minecraft.player == null ? null : minecraft.player.position();
}
public static boolean acceptPreview(LinkPreviewPayload payload) {
@@ -27,7 +32,27 @@ public final class ClientBookExploreOverlay {
return true;
}
public static void onClientTick(ClientTickEvent.Post event) {
public static void onClientTickPre(ClientTickEvent.Pre event) {
if (bookScreen == null) {
return;
}
Minecraft minecraft = Minecraft.getInstance();
if (minecraft.player != null) {
minecraft.options.keyUp.setDown(false);
minecraft.options.keyDown.setDown(false);
minecraft.options.keyLeft.setDown(false);
minecraft.options.keyRight.setDown(false);
minecraft.options.keyJump.setDown(false);
minecraft.options.keyShift.setDown(false);
minecraft.options.keySprint.setDown(false);
minecraft.player.input.forwardImpulse = 0.0F;
minecraft.player.input.leftImpulse = 0.0F;
minecraft.player.input.jumping = false;
minecraft.player.input.shiftKeyDown = false;
}
}
public static void onClientTickPost(ClientTickEvent.Post event) {
if (bookScreen == null) {
return;
}
@@ -35,8 +60,13 @@ public final class ClientBookExploreOverlay {
if (minecraft.player == null || minecraft.level == null) {
bookScreen.abandonExploreOverlay();
bookScreen = null;
playerPosition = null;
return;
}
if (playerPosition != null) {
minecraft.player.setPos(playerPosition);
minecraft.player.setDeltaMovement(Vec3.ZERO);
}
bookScreen.tickExploreOverlay();
}
@@ -57,6 +87,8 @@ public final class ClientBookExploreOverlay {
event.setCanceled(true);
ExplorableBookScreen screen = bookScreen;
bookScreen = null;
playerPosition = null;
KeyMapping.setAll();
screen.returnFromExploreOverlay();
}
}
@@ -23,7 +23,8 @@ public final class ClientEvents {
public static void clientSetup(FMLClientSetupEvent event) {
NeoForge.EVENT_BUS.addListener(ClientBookInteractionHandler::onRightClickItem);
NeoForge.EVENT_BUS.addListener(ClientBookInteractionHandler::onRightClickBlock);
NeoForge.EVENT_BUS.addListener(ClientBookExploreOverlay::onClientTick);
NeoForge.EVENT_BUS.addListener(ClientBookExploreOverlay::onClientTickPre);
NeoForge.EVENT_BUS.addListener(ClientBookExploreOverlay::onClientTickPost);
NeoForge.EVENT_BUS.addListener(ClientBookExploreOverlay::onRenderGui);
NeoForge.EVENT_BUS.addListener(ClientBookExploreOverlay::onMouseButton);
}
@@ -24,8 +24,6 @@ public final class ImmersivePortalsDestinationPreviewRenderer implements Destina
private final Minecraft minecraft = Minecraft.getInstance();
private LinkPreviewPayload destination;
private Vec3 cameraPosition;
private Vec3 explorationPlayerOrigin;
private Vec3 explorationCameraOrigin;
private float explorationPlayerYaw;
private float explorationPlayerPitch;
private float explorationCameraYaw;
@@ -54,8 +52,7 @@ public final class ImmersivePortalsDestinationPreviewRenderer implements Destina
if (!exploring || cameraPosition == null) {
return;
}
if (minecraft.player != null && explorationPlayerOrigin != null && explorationCameraOrigin != null) {
cameraPosition = explorationCameraOrigin.add(minecraft.player.position().subtract(explorationPlayerOrigin));
if (minecraft.player != null) {
yaw = explorationCameraYaw + Mth.wrapDegrees(minecraft.player.getYRot() - explorationPlayerYaw);
pitch = Mth.clamp(explorationCameraPitch
+ minecraft.player.getXRot() - explorationPlayerPitch, -89.0F, 89.0F);
@@ -131,17 +128,17 @@ public final class ImmersivePortalsDestinationPreviewRenderer implements Destina
@Override
public void setExploring(boolean exploring) {
this.exploring = exploring;
if (exploring && minecraft.player != null) {
explorationPlayerOrigin = minecraft.player.position();
explorationCameraOrigin = cameraPosition;
if (exploring && minecraft.player != null && destination != null) {
cameraPosition = Vec3.atBottomCenterOf(destination.origin())
.add(0.0D, minecraft.player.getEyeHeight(), 0.0D);
yaw = destination.yaw();
pitch = destination.pitch();
explorationPlayerYaw = minecraft.player.getYRot();
explorationPlayerPitch = minecraft.player.getXRot();
explorationCameraYaw = yaw;
explorationCameraPitch = pitch;
} else {
clearMovement();
explorationPlayerOrigin = null;
explorationCameraOrigin = null;
}
}
@@ -226,8 +223,6 @@ public final class ImmersivePortalsDestinationPreviewRenderer implements Destina
public void resetView() {
exploring = false;
clearMovement();
explorationPlayerOrigin = null;
explorationCameraOrigin = null;
if (destination != null) {
cameraPosition = Vec3.atCenterOf(destination.origin()).add(0.0D, 2.0D, ORBIT_RADIUS);
yaw = destination.yaw();
@@ -1,6 +1,7 @@
package net.dnorberg.rivencraft.network;
import net.dnorberg.rivencraft.book.LinkTarget;
import net.dnorberg.rivencraft.book.LinkingService;
import net.dnorberg.rivencraft.book.AgeReference;
import net.dnorberg.rivencraft.book.AgeRegistrySavedData;
import net.dnorberg.rivencraft.book.AgeDimensionService;
@@ -224,7 +225,10 @@ public final class ModNetworking {
return;
}
BlockPos origin = target.location().pos();
BlockPos origin = LinkingService.resolveDestination(
level, target.location().pos(), payload.descriptiveBook())
.map(BlockPos::containing)
.orElse(target.location().pos());
List<LinkPreviewPayload.SnapshotBlock> blocks = new ArrayList<>();
// The cubic footprint survives every angle of the orbit. The target is
// kept at the preview camera's current center point.