From 9b56d6d3e0ceb4b9cb2dfa66f49f2adbd481c8a3 Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Sun, 1 Jun 2025 22:57:27 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=81=9A=E8=87=AA=E7=94=B1=E8=A7=86?= =?UTF-8?q?=E8=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/vehicle/Ah6Entity.java | 15 ++++- .../event/ClientEventHandler.java | 2 +- .../event/ClientMouseHandler.java | 67 +++++++++++-------- 3 files changed, 53 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java index c196d56fa..7dfe67e0c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java @@ -54,6 +54,8 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; import software.bernie.geckolib.util.GeckoLibUtil; +import static com.atsuishio.superbwarfare.event.ClientMouseHandler.freeCameraPitch; +import static com.atsuishio.superbwarfare.event.ClientMouseHandler.freeCameraYaw; import static com.atsuishio.superbwarfare.tools.ParticleTool.sendParticle; public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity, HelicopterEntity, WeaponVehicleEntity { @@ -686,11 +688,20 @@ public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity return Pair.of(Axis.XP.rotationDegrees(-this.getViewXRot(tickDelta)), Axis.ZP.rotationDegrees(-this.getRoll(tickDelta))); } + public Matrix4f getClientVehicleTransform(float ticks) { + Matrix4f transform = new Matrix4f(); + transform.translate((float) Mth.lerp(ticks, xo, getX()), (float) Mth.lerp(ticks, yo + 1.45f, getY() + 1.45f), (float) Mth.lerp(ticks, zo, getZ())); + transform.rotate(Axis.YP.rotationDegrees((float) (-Mth.lerp(ticks, yRotO, getYRot()) + freeCameraYaw))); + transform.rotate(Axis.XP.rotationDegrees((float) (Mth.lerp(ticks, xRotO, getXRot()) + freeCameraPitch))); + transform.rotate(Axis.ZP.rotationDegrees(Mth.lerp(ticks, prevRoll, getRoll()))); + return transform; + } + @OnlyIn(Dist.CLIENT) @Override public @Nullable Vec2 getCameraRotation(float partialTicks, Player player, boolean zoom, boolean isFirstPerson) { if (this.getSeatIndex(player) == 0) { - return new Vec2(getRotY(partialTicks) + 0.4f * Mth.lerp(partialTicks, delta_yo, delta_y), getRotX(partialTicks) + 0.4f * Mth.lerp(partialTicks, delta_xo, delta_x)); + return new Vec2((float) (getRotY(partialTicks) - 0.5f * Mth.lerp(partialTicks, delta_yo, delta_y) - freeCameraYaw), (float) (getRotX(partialTicks) - 0.5f * Mth.lerp(partialTicks, delta_xo, delta_x) + freeCameraPitch)); } return super.getCameraRotation(partialTicks, player, false, false); @@ -700,7 +711,7 @@ public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity @Override public Vec3 getCameraPosition(float partialTicks, Player player, boolean zoom, boolean isFirstPerson) { if (this.getSeatIndex(player) == 0) { - Matrix4f transform = getVehicleTransform(partialTicks); + Matrix4f transform = getClientVehicleTransform(partialTicks); Vector4f worldPosition = transformPosition(transform, -2.1f, 1, -10); diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 26a8dafdd..5d70f8344 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -191,7 +191,7 @@ public class ClientEventHandler { } public static boolean isFreeCam(Player player) { - return player.getVehicle() instanceof VehicleEntity vehicle && vehicle.allowFreeCam() && Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON && ModKeyMappings.FREE_CAMERA.isDown(); + return player.getVehicle() instanceof VehicleEntity vehicle && vehicle.allowFreeCam() && ModKeyMappings.FREE_CAMERA.isDown(); } private static boolean isMoving() { diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientMouseHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientMouseHandler.java index 3c57efe12..d935367dd 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientMouseHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientMouseHandler.java @@ -22,6 +22,7 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.CalculatePlayerTurnEvent; import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.client.event.ViewportEvent; import net.neoforged.neoforge.network.PacketDistributor; import static com.atsuishio.superbwarfare.event.ClientEventHandler.droneFovLerp; @@ -31,10 +32,7 @@ import static com.atsuishio.superbwarfare.event.ClientEventHandler.isFreeCam; public class ClientMouseHandler { public static Vec2 posO = new Vec2(0, 0); public static Vec2 posN = new Vec2(0, 0); - public static Vec2 mousePos = new Vec2(0, 0); - public static double PosX = 0; public static double lerpPosX = 0; - public static double PosY = 0; public static double lerpPosY = 0; @@ -80,35 +78,48 @@ public class ClientMouseHandler { i *= (1 - (Mth.abs(vehicle.getRoll()) - 90) / 90); } - if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) { - PacketDistributor.sendToServer(new MouseMoveMessage( - (1 - (Mth.abs(vehicle.getRoll()) / 90)) * lerpPosX + ((Mth.abs(vehicle.getRoll()) / 90)) * lerpPosY * i, - (1 - (Mth.abs(vehicle.getRoll()) / 90)) * lerpPosY + ((Mth.abs(vehicle.getRoll()) / 90)) * lerpPosX * (vehicle.getRoll() < 0 ? -1 : 1)) - ); + if (!isFreeCam(player)) { + if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) { + PacketDistributor.sendToServer(new MouseMoveMessage( + (1 - (Mth.abs(vehicle.getRoll()) / 90)) * lerpPosX + ((Mth.abs(vehicle.getRoll()) / 90)) * lerpPosY * i, + (1 - (Mth.abs(vehicle.getRoll()) / 90)) * lerpPosY + ((Mth.abs(vehicle.getRoll()) / 90)) * lerpPosX * (vehicle.getRoll() < 0 ? -1 : 1)) + ); + } else { + PacketDistributor.sendToServer(new MouseMoveMessage(lerpPosX, lerpPosY)); + } } else { - PacketDistributor.sendToServer(new MouseMoveMessage(lerpPosX, lerpPosY)); + PacketDistributor.sendToServer(new MouseMoveMessage(0, 0)); } } + } -// lerpPosX = Mth.clamp(Mth.lerp(event.getPartialTick(), lerpPosX, 0), -1, 1); -// lerpPosY = Mth.clamp(Mth.lerp(event.getPartialTick(), lerpPosY, 0), -1, 1); -// -// -// if (isFreeCam(player)) { -// freeCameraYaw = Mth.clamp(freeCameraYaw + 4 * lerpPosX, -100, 100); -// freeCameraPitch = Mth.clamp(freeCameraPitch + 4 * lerpPosY, -90, 90); -// } -// -// float yaw = event.getYaw(); -// float pitch = event.getPitch(); -// -// event.setYaw((float) (yaw + freeCameraYaw)); -// event.setPitch((float) (pitch + freeCameraPitch)); -// -// if (!isFreeCam(player)) { -// freeCameraYaw *= 0.8; -// freeCameraPitch *= 0.8; -// } + @SubscribeEvent + public static void handleClientTick(ViewportEvent.ComputeCameraAngles event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(), 0.8); + + if (isFreeCam(player)) { + freeCameraYaw -= 0.4f * times * lerpPosX; + freeCameraPitch += 0.2f * times * lerpPosY; + } else { + freeCameraYaw = Mth.lerp(0.075 * event.getPartialTick(), freeCameraYaw, 0); + freeCameraPitch = Mth.lerp(0.075 * event.getPartialTick(), freeCameraPitch, 0); + } + + while (freeCameraYaw > 180F) { + freeCameraYaw -= 360; + } + while (freeCameraYaw <= -180F) { + freeCameraYaw += 360; + } + while (freeCameraPitch > 180F) { + freeCameraPitch -= 360; + } + while (freeCameraPitch <= -180F) { + freeCameraPitch += 360; + } } @SubscribeEvent