diff --git a/src/main/java/com/atsuishio/superbwarfare/ModUtils.java b/src/main/java/com/atsuishio/superbwarfare/ModUtils.java index 27561a87a..aeeea4191 100644 --- a/src/main/java/com/atsuishio/superbwarfare/ModUtils.java +++ b/src/main/java/com/atsuishio/superbwarfare/ModUtils.java @@ -1,5 +1,6 @@ package com.atsuishio.superbwarfare; +import com.atsuishio.superbwarfare.client.MouseMovementHandler; import com.atsuishio.superbwarfare.config.ClientConfig; import com.atsuishio.superbwarfare.config.CommonConfig; import com.atsuishio.superbwarfare.config.ServerConfig; @@ -21,6 +22,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.network.NetworkDirection; @@ -65,6 +67,7 @@ public class ModUtils { ModVillagers.register(bus); bus.addListener(this::onCommonSetup); + bus.addListener(this::onClientSetup); MinecraftForge.EVENT_BUS.register(this); } @@ -173,6 +176,10 @@ public class ModUtils { Ingredient.of(Items.GLOWSTONE_DUST), PotionUtils.setPotion(new ItemStack(Items.POTION), ModPotion.STRONG_SHOCK.get()))); } + public void onClientSetup(final FMLClientSetupEvent event) { + MouseMovementHandler.init(); + } + public static ResourceLocation loc(String path) { return new ResourceLocation(MODID, path); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/MouseMovementHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/MouseMovementHandler.java new file mode 100644 index 000000000..ac9ade572 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/MouseMovementHandler.java @@ -0,0 +1,105 @@ +package com.atsuishio.superbwarfare.client; + +import com.mojang.blaze3d.Blaze3D; +import net.minecraft.client.Minecraft; +import net.minecraft.client.MouseHandler; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.phys.Vec2; +import org.joml.Vector3f; +import org.lwjgl.glfw.GLFW; + +/** + * Codes from @getItemFromBlock's Create-Tweaked-Controllers + */ +public class MouseMovementHandler { + + public static Vec2 delta = null; + public static Vec2 lastPos = null; + public static Vec2 vel = null; + private static MouseHandler mouseHandler = null; + private static double lastMouseEventTime; + private static boolean mouseLockActive = false; + private static float deltaT = 0; + private static Vector3f savedRot = new Vector3f(); + + public static Vec2 getMousePos() { + if (mouseHandler.isMouseGrabbed()) { + return new Vec2((float) mouseHandler.xpos(), (float) mouseHandler.ypos()); + } else { + double[] x, y; + x = new double[1]; + y = new double[1]; + GLFW.glfwGetCursorPos(Minecraft.getInstance().getWindow().getWindow(), x, y); + return new Vec2((float) x[0], (float) y[0]); + } + } + + public static void resetCenter() { + delta = new Vec2(0, 0); + vel = new Vec2(0, 0); + lastPos = getMousePos(); + } + + public static void init() { + delta = new Vec2(0, 0); + vel = new Vec2(0, 0); + Minecraft mc = Minecraft.getInstance(); + mouseHandler = mc.mouseHandler; + lastPos = getMousePos(); + lastMouseEventTime = Blaze3D.getTime(); + } + + public static void update() { + double d0 = Blaze3D.getTime(); + deltaT = (float) (d0 - lastMouseEventTime); + lastMouseEventTime = d0; + Vec2 tmp = getMousePos(); + vel = new Vec2(tmp.x - lastPos.x, tmp.y - lastPos.y); + delta = delta.add(vel); + vel = vel.scale(1 / deltaT); + lastPos = tmp; + } + + public static float getX(boolean useVelocity) { + if (useVelocity) { + return vel.x; + } else { + return delta.x; + } + } + + public static float getY(boolean useVelocity) { + if (useVelocity) { + return vel.y; + } else { + return delta.y; + } + } + + public static void activateMouseLock() { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return; + + savedRot.x = player.getXRot(); + savedRot.y = player.getYRot(); + savedRot.z = 0; + mouseLockActive = true; + lastPos = getMousePos(); + lastMouseEventTime = Blaze3D.getTime(); + } + + public static void deactivateMouseLock() { + mouseLockActive = false; + } + + public static void cancelPlayerTurn() { + if (!mouseLockActive) return; + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return; + player.turn((savedRot.y - player.getYRot()) / 0.15f, (savedRot.x - player.getXRot()) / 0.15f); + player.xBob = savedRot.x; + player.yBob = savedRot.y; + player.xBobO = savedRot.x; + player.yBobO = savedRot.y; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/MouseMovementInput.java b/src/main/java/com/atsuishio/superbwarfare/client/MouseMovementInput.java new file mode 100644 index 000000000..abea3731d --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/MouseMovementInput.java @@ -0,0 +1,48 @@ +package com.atsuishio.superbwarfare.client; + +/** + * Codes from @getItemFromBlock's Create-Tweaked-Controllers + */ +public class MouseMovementInput { + + public boolean useVelocity = false; + public boolean isYAxis = false; + public float minBound = 0.0f; + public float maxBound = 1000.0f; + + public MouseMovementInput(boolean axis, float min, float max, boolean useVel) { + this.isYAxis = axis; + this.minBound = min; + this.maxBound = max; + this.useVelocity = useVel; + } + + public MouseMovementInput() { + } + + public boolean hasOutput() { + return getAxisValue() >= 0.5f; + } + + public float getAxisValue() { + if (isInputInvalid()) return 0; + float v = isYAxis ? MouseMovementHandler.getY(useVelocity) : MouseMovementHandler.getX(useVelocity); + v = (v - minBound) / (maxBound - minBound); + if (v < 0) v = 0; + if (v > 1) v = 1; + return v; + } + + public boolean isInputInvalid() { + return minBound == maxBound; + } + + public int getValue() { + return isYAxis ? 1 : 0; + } + + public float getRawInput() { + if (isInputInvalid()) return 0; + return isYAxis ? MouseMovementHandler.getY(useVelocity) : MouseMovementHandler.getX(useVelocity); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index af9c1b185..124ddfd7b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -704,7 +704,8 @@ public class ClientEventHandler { if (player == null) return; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return; - if (player.getVehicle() instanceof IArmedVehicleEntity iArmedVehicle && iArmedVehicle.isDriver(player) && iArmedVehicle.hidePassenger()) return; + if (player.getVehicle() instanceof IArmedVehicleEntity iArmedVehicle && iArmedVehicle.isDriver(player) && iArmedVehicle.hidePassenger()) + return; float pose; float times = 2 * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 0.8); @@ -782,7 +783,8 @@ public class ClientEventHandler { } } - if (player != null && player.getVehicle() instanceof IArmedVehicleEntity iArmedVehicle && iArmedVehicle.isDriver(player) && iArmedVehicle.banHand()) return; + if (player != null && player.getVehicle() instanceof IArmedVehicleEntity iArmedVehicle && iArmedVehicle.isDriver(player) && iArmedVehicle.banHand()) + return; if (level != null && stack.is(ModTags.Items.GUN)) { handleWeaponSway(living);