重做自由视角

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.animation.AnimatableManager;
import software.bernie.geckolib.util.GeckoLibUtil; 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; import static com.atsuishio.superbwarfare.tools.ParticleTool.sendParticle;
public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity, HelicopterEntity, WeaponVehicleEntity { 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))); 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) @OnlyIn(Dist.CLIENT)
@Override @Override
public @Nullable Vec2 getCameraRotation(float partialTicks, Player player, boolean zoom, boolean isFirstPerson) { public @Nullable Vec2 getCameraRotation(float partialTicks, Player player, boolean zoom, boolean isFirstPerson) {
if (this.getSeatIndex(player) == 0) { 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); return super.getCameraRotation(partialTicks, player, false, false);
@ -700,7 +711,7 @@ public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity
@Override @Override
public Vec3 getCameraPosition(float partialTicks, Player player, boolean zoom, boolean isFirstPerson) { public Vec3 getCameraPosition(float partialTicks, Player player, boolean zoom, boolean isFirstPerson) {
if (this.getSeatIndex(player) == 0) { if (this.getSeatIndex(player) == 0) {
Matrix4f transform = getVehicleTransform(partialTicks); Matrix4f transform = getClientVehicleTransform(partialTicks);
Vector4f worldPosition = transformPosition(transform, -2.1f, 1, -10); Vector4f worldPosition = transformPosition(transform, -2.1f, 1, -10);

View file

@ -191,7 +191,7 @@ public class ClientEventHandler {
} }
public static boolean isFreeCam(Player player) { 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() { 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.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.CalculatePlayerTurnEvent; import net.neoforged.neoforge.client.event.CalculatePlayerTurnEvent;
import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.client.event.ClientTickEvent;
import net.neoforged.neoforge.client.event.ViewportEvent;
import net.neoforged.neoforge.network.PacketDistributor; import net.neoforged.neoforge.network.PacketDistributor;
import static com.atsuishio.superbwarfare.event.ClientEventHandler.droneFovLerp; import static com.atsuishio.superbwarfare.event.ClientEventHandler.droneFovLerp;
@ -31,10 +32,7 @@ import static com.atsuishio.superbwarfare.event.ClientEventHandler.isFreeCam;
public class ClientMouseHandler { public class ClientMouseHandler {
public static Vec2 posO = new Vec2(0, 0); public static Vec2 posO = new Vec2(0, 0);
public static Vec2 posN = 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 lerpPosX = 0;
public static double PosY = 0;
public static double lerpPosY = 0; public static double lerpPosY = 0;
@ -80,35 +78,48 @@ public class ClientMouseHandler {
i *= (1 - (Mth.abs(vehicle.getRoll()) - 90) / 90); i *= (1 - (Mth.abs(vehicle.getRoll()) - 90) / 90);
} }
if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) { if (!isFreeCam(player)) {
PacketDistributor.sendToServer(new MouseMoveMessage( if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) {
(1 - (Mth.abs(vehicle.getRoll()) / 90)) * lerpPosX + ((Mth.abs(vehicle.getRoll()) / 90)) * lerpPosY * i, PacketDistributor.sendToServer(new MouseMoveMessage(
(1 - (Mth.abs(vehicle.getRoll()) / 90)) * lerpPosY + ((Mth.abs(vehicle.getRoll()) / 90)) * lerpPosX * (vehicle.getRoll() < 0 ? -1 : 1)) (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 { } else {
PacketDistributor.sendToServer(new MouseMoveMessage(lerpPosX, lerpPosY)); PacketDistributor.sendToServer(new MouseMoveMessage(0, 0));
} }
} }
}
// lerpPosX = Mth.clamp(Mth.lerp(event.getPartialTick(), lerpPosX, 0), -1, 1); @SubscribeEvent
// lerpPosY = Mth.clamp(Mth.lerp(event.getPartialTick(), lerpPosY, 0), -1, 1); public static void handleClientTick(ViewportEvent.ComputeCameraAngles event) {
// LocalPlayer player = Minecraft.getInstance().player;
// if (player == null) return;
// if (isFreeCam(player)) {
// freeCameraYaw = Mth.clamp(freeCameraYaw + 4 * lerpPosX, -100, 100); float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(), 0.8);
// freeCameraPitch = Mth.clamp(freeCameraPitch + 4 * lerpPosY, -90, 90);
// } if (isFreeCam(player)) {
// freeCameraYaw -= 0.4f * times * lerpPosX;
// float yaw = event.getYaw(); freeCameraPitch += 0.2f * times * lerpPosY;
// float pitch = event.getPitch(); } else {
// freeCameraYaw = Mth.lerp(0.075 * event.getPartialTick(), freeCameraYaw, 0);
// event.setYaw((float) (yaw + freeCameraYaw)); freeCameraPitch = Mth.lerp(0.075 * event.getPartialTick(), freeCameraPitch, 0);
// event.setPitch((float) (pitch + freeCameraPitch)); }
//
// if (!isFreeCam(player)) { while (freeCameraYaw > 180F) {
// freeCameraYaw *= 0.8; freeCameraYaw -= 360;
// freeCameraPitch *= 0.8; }
// } while (freeCameraYaw <= -180F) {
freeCameraYaw += 360;
}
while (freeCameraPitch > 180F) {
freeCameraPitch -= 360;
}
while (freeCameraPitch <= -180F) {
freeCameraPitch += 360;
}
} }
@SubscribeEvent @SubscribeEvent