重做自由视角

This commit is contained in:
Atsuishio 2025-06-01 22:57:27 +08:00 committed by Light_Quanta
parent 31b7f728ee
commit 9b56d6d3e0
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
3 changed files with 53 additions and 31 deletions

View file

@ -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);

View file

@ -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() {

View file

@ -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,6 +78,7 @@ public class ClientMouseHandler {
i *= (1 - (Mth.abs(vehicle.getRoll()) - 90) / 90);
}
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,
@ -88,27 +87,39 @@ public class ClientMouseHandler {
} else {
PacketDistributor.sendToServer(new MouseMoveMessage(lerpPosX, lerpPosY));
}
} else {
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