重做自由视角
This commit is contained in:
parent
31b7f728ee
commit
9b56d6d3e0
3 changed files with 53 additions and 31 deletions
|
@ -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);
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue