superb-warfare/src/main/java/com/atsuishio/superbwarfare/event/ClientMouseHandler.java

178 lines
6.3 KiB
Java

package com.atsuishio.superbwarfare.event;
import com.atsuishio.superbwarfare.client.MouseMovementHandler;
import com.atsuishio.superbwarfare.config.client.VehicleControlConfig;
import com.atsuishio.superbwarfare.entity.vehicle.*;
import com.atsuishio.superbwarfare.entity.vehicle.base.CannonEntity;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModMobEffects;
import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.tools.NBTTool;
import net.minecraft.client.CameraType;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec2;
import net.neoforged.api.distmarker.Dist;
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.ViewportEvent;
import static com.atsuishio.superbwarfare.event.ClientEventHandler.droneFovLerp;
import static com.atsuishio.superbwarfare.event.ClientEventHandler.isFreeCam;
@EventBusSubscriber(bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT)
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;
public static double freeCameraPitch = 0;
public static double freeCameraYaw = 0;
private static boolean notInGame() {
Minecraft mc = Minecraft.getInstance();
if (mc.player == null) return true;
if (mc.getOverlay() != null) return true;
if (mc.screen != null) return true;
if (!mc.mouseHandler.isMouseGrabbed()) return true;
return !mc.isWindowActive();
}
@SubscribeEvent
public static void handleClientTick(ViewportEvent.ComputeCameraAngles event) {
LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return;
posO = posN;
posN = MouseMovementHandler.getMousePos();
if (!notInGame()) {
mousePos = posN.add(posO.scale(-1));
if (mousePos.x != 0) {
lerpPosX = Mth.lerp(0.1, PosX, mousePos.x);
}
if (mousePos.y != 0) {
lerpPosY = Mth.lerp(0.1, PosY, mousePos.y);
}
}
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 calculatePlayerTurn(CalculatePlayerTurnEvent event) {
var newSensitivity = changeSensitivity(event.getMouseSensitivity()) * invertY();
event.setMouseSensitivity(newSensitivity);
}
public static float invertY() {
Minecraft mc = Minecraft.getInstance();
Player player = mc.player;
if (player == null) return 1;
if (player.getVehicle() instanceof Ah6Entity ah6Entity && ah6Entity.getFirstPassenger() == player) {
return VehicleControlConfig.INVERT_AIRCRAFT_CONTROL.get() ? -1 : 1;
}
if (player.getVehicle() instanceof Tom6Entity tom6 && tom6.getFirstPassenger() == player) {
return VehicleControlConfig.INVERT_AIRCRAFT_CONTROL.get() ? -1 : 1;
}
return 1;
}
private static double changeSensitivity(double original) {
Minecraft mc = Minecraft.getInstance();
Player player = mc.player;
if (player == null) return original;
if (player.hasEffect(ModMobEffects.SHOCK) && !player.isSpectator()) {
return 0;
}
ItemStack stack = mc.player.getMainHandItem();
if (isFreeCam(player)) {
return 0;
}
if (player.getVehicle() instanceof CannonEntity) {
return ClientEventHandler.zoomVehicle ? 0.15 : 0.3;
}
if (player.getVehicle() instanceof Lav150Entity) {
return ClientEventHandler.zoomVehicle ? 0.23 : 0.3;
}
if (player.getVehicle() instanceof Bmp2Entity) {
return ClientEventHandler.zoomVehicle ? 0.22 : 0.27;
}
if (player.getVehicle() instanceof Yx100Entity yx100) {
if (player == yx100.getFirstPassenger()) {
return ClientEventHandler.zoomVehicle ? 0.17 : 0.22;
} else if (player == yx100.getNthEntity(1)) {
return ClientEventHandler.zoomVehicle ? 0.25 : 0.35;
}
}
if (player.getVehicle() instanceof PrismTankEntity) {
return ClientEventHandler.zoomVehicle ? 0.26 : 0.33;
}
if (player.getVehicle() instanceof Ah6Entity ah6Entity && !ah6Entity.onGround() && ah6Entity.getFirstPassenger() == player) {
return 0.33;
}
if (player.getVehicle() instanceof Tom6Entity) {
return 0.3;
}
var tag = NBTTool.getTag(stack);
if (stack.is(ModItems.MONITOR.get()) && tag.getBoolean("Using") && tag.getBoolean("Linked")) {
return 0.33 / (1 + 0.08 * (droneFovLerp - 1));
}
if (!(stack.getItem() instanceof GunItem)) {
return original;
}
var data = GunData.from(stack);
float customSens = (float) data.tag().getInt("sensitivity");
if (!player.getMainHandItem().isEmpty() && mc.options.getCameraType() == CameraType.FIRST_PERSON) {
return original / Math.max((1 + (0.2 * (data.zoom() - (0.3 * customSens)) * ClientEventHandler.zoomTime)), 0.1);
}
return original;
}
}