尝试添加鼠标移动输入类

This commit is contained in:
17146 2025-01-15 21:13:06 +08:00
parent 16f42f799e
commit 2195ed52e5
4 changed files with 164 additions and 2 deletions

View file

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

View file

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

View file

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

View file

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