diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java index fbde7572b..b61037c28 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java @@ -793,4 +793,8 @@ public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHeli public ResourceLocation getVehicleIcon() { return ModUtils.loc("textures/vehicle_icon/ah_6_icon.png"); } + @Override + public boolean allowFreeCam() { + return true; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/MobileVehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/MobileVehicleEntity.java index 24a71782a..ed00df35e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/MobileVehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/MobileVehicleEntity.java @@ -50,10 +50,6 @@ public class MobileVehicleEntity extends EnergyVehicleEntity { public boolean upInputDown; public boolean downInputDown; public boolean decoyInputDown; - public boolean leftInputDownMouse; - public boolean rightInputDownMouse; - public boolean upInputDownMouse; - public boolean downInputDownMouse; public double lastTickSpeed; public double lastTickVerticalSpeed; public int collisionCoolDown; diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java index 44f2463c5..d2b817801 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java @@ -372,4 +372,9 @@ public class Tom6Entity extends MobileVehicleEntity implements GeoEntity { public ResourceLocation getVehicleIcon() { return ModUtils.loc("textures/vehicle_icon/tom_6_icon.png"); } + + @Override + public boolean allowFreeCam() { + return true; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/VehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/VehicleEntity.java index fee815a66..461db706f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/VehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/VehicleEntity.java @@ -457,4 +457,8 @@ public class VehicleEntity extends Entity { public ResourceLocation getVehicleIcon() { return ModUtils.loc("textures/gun_icon/default_icon.png"); } + + public boolean allowFreeCam() { + return false; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 7a2dd1cbb..241339266 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -154,6 +154,7 @@ public class ClientEventHandler { public static CameraType lastCameraType; + @SubscribeEvent public static void handleWeaponTurn(RenderHandEvent event) { LocalPlayer player = Minecraft.getInstance().player; @@ -178,6 +179,10 @@ public class ClientEventHandler { return !mc.isWindowActive(); } + 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(); + } + private static boolean revolverPre() { Player player = Minecraft.getInstance().player; if (player == null) return false; @@ -846,8 +851,9 @@ public class ClientEventHandler { } } - if (player != null && player.getVehicle() instanceof IArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player)) + if (player != null && player.getVehicle() instanceof IArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player)) { return; + } if (level != null && stack.is(ModTags.Items.GUN)) { handleWeaponSway(living); diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientMouseHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientMouseHandler.java index f0579fb38..eae67c425 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientMouseHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientMouseHandler.java @@ -1,17 +1,17 @@ package com.atsuishio.superbwarfare.event; -import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.client.MouseMovementHandler; -import com.atsuishio.superbwarfare.network.message.VehicleMovementMessage; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.util.Mth; import net.minecraft.world.phys.Vec2; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.event.TickEvent; +import net.minecraftforge.client.event.ViewportEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isFreeCam; + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) public class ClientMouseHandler { public static Vec2 posO = new Vec2(0 , 0); @@ -22,6 +22,9 @@ public class ClientMouseHandler { 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; @@ -32,7 +35,7 @@ public class ClientMouseHandler { } @SubscribeEvent - public static void handleClientTick(TickEvent.ClientTickEvent event) { + public static void handleClientTick(ViewportEvent.ComputeCameraAngles event) { LocalPlayer player = Minecraft.getInstance().player; if (player == null) { @@ -53,48 +56,24 @@ public class ClientMouseHandler { } } - lerpPosX = Mth.clamp(Mth.lerp(0.1,lerpPosX,0), -0.11, 0.11); - lerpPosY = Mth.clamp(Mth.lerp(0.1,lerpPosY,0), -0.11, 0.11); + lerpPosX = Mth.clamp(Mth.lerp(event.getPartialTick(),lerpPosX,0), -1, 1); + lerpPosY = Mth.clamp(Mth.lerp(event.getPartialTick(),lerpPosY,0), -1, 1); - int typeX = 0; - if (lerpPosX < -0.05) { - typeX = -1; - } else if (lerpPosX > 0.05) { - typeX = 1; + if (isFreeCam(player)) { + freeCameraYaw = Mth.clamp(freeCameraYaw + 4 * lerpPosX, -100 , 100); + freeCameraPitch = Mth.clamp(freeCameraPitch + 4 * lerpPosY, -90 , 90); } - int typeY = 0; + float yaw = event.getYaw(); + float pitch = event.getPitch(); - if (lerpPosY < -0.05) { - typeY = 1; - } else if (lerpPosY > 0.05) { - typeY = -1; + event.setYaw((float) (yaw + freeCameraYaw)); + event.setPitch((float) (pitch + freeCameraPitch)); + + if (!isFreeCam(player)) { + freeCameraYaw *= 0.8; + freeCameraPitch *= 0.8; } - - if (typeX == -1) { - ModUtils.PACKET_HANDLER.sendToServer(new VehicleMovementMessage(7, true)); - ModUtils.PACKET_HANDLER.sendToServer(new VehicleMovementMessage(8, false)); - } else if (typeX == 1) { - ModUtils.PACKET_HANDLER.sendToServer(new VehicleMovementMessage(7, false)); - ModUtils.PACKET_HANDLER.sendToServer(new VehicleMovementMessage(8, true)); - } else { - ModUtils.PACKET_HANDLER.sendToServer(new VehicleMovementMessage(7, false)); - ModUtils.PACKET_HANDLER.sendToServer(new VehicleMovementMessage(8, false)); - } - - - if (typeY == 1) { - ModUtils.PACKET_HANDLER.sendToServer(new VehicleMovementMessage(9, true)); - ModUtils.PACKET_HANDLER.sendToServer(new VehicleMovementMessage(10, false)); - } else if (typeY == -1) { - ModUtils.PACKET_HANDLER.sendToServer(new VehicleMovementMessage(9, false)); - ModUtils.PACKET_HANDLER.sendToServer(new VehicleMovementMessage(10, true)); - } else { - ModUtils.PACKET_HANDLER.sendToServer(new VehicleMovementMessage(9, false)); - ModUtils.PACKET_HANDLER.sendToServer(new VehicleMovementMessage(10, false)); - } - -// player.displayClientMessage(Component.literal(typeX + " " + typeY), true); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModKeyMappings.java b/src/main/java/com/atsuishio/superbwarfare/init/ModKeyMappings.java index 9bc7ebc70..860eadbef 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModKeyMappings.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModKeyMappings.java @@ -54,6 +54,7 @@ public class ModKeyMappings { public static final KeyMapping HOLD_ZOOM = new KeyMapping("key.superbwarfare.hold_zoom", InputConstants.Type.MOUSE, GLFW.GLFW_MOUSE_BUTTON_RIGHT, "key.categories.superbwarfare"); public static final KeyMapping SWITCH_ZOOM = new KeyMapping("key.superbwarfare.switch_zoom", GLFW.GLFW_KEY_UNKNOWN, "key.categories.superbwarfare"); public static final KeyMapping RELEASE_DECOY = new KeyMapping("key.superbwarfare.release_decoy", GLFW.GLFW_KEY_X, "key.categories.superbwarfare"); + public static final KeyMapping FREE_CAMERA = new KeyMapping("key.superbwarfare.free_camera", GLFW.GLFW_KEY_C, "key.categories.superbwarfare"); public static final KeyMapping MELEE = new KeyMapping("key.superbwarfare.melee", GLFW.GLFW_KEY_V, "key.categories.superbwarfare"); @SubscribeEvent @@ -77,6 +78,7 @@ public class ModKeyMappings { event.register(SWITCH_ZOOM); event.register(RELEASE_DECOY); event.register(MELEE); + event.register(FREE_CAMERA); } @Mod.EventBusSubscriber(value = Dist.CLIENT) diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java index ac11248b8..71554b959 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/MouseHandlerMixin.java @@ -19,6 +19,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; import static com.atsuishio.superbwarfare.event.ClientEventHandler.droneFovLerp; +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isFreeCam; /** * Author: MrCrayfish @@ -42,6 +43,10 @@ public class MouseHandlerMixin { ItemStack stack = mc.player.getMainHandItem(); + if (isFreeCam(player)) { + return 0; + } + if (player.getVehicle() instanceof ICannonEntity) { return ClientEventHandler.zoomVehicle ? 0.15 : 0.3; } diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/VehicleMovementMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/VehicleMovementMessage.java index c63701756..e350ba5a7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/VehicleMovementMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/VehicleMovementMessage.java @@ -60,18 +60,6 @@ public class VehicleMovementMessage { case 6: mobileVehicleEntity.decoyInputDown = message.clicked; break; - case 7: - mobileVehicleEntity.leftInputDownMouse = message.clicked; - break; - case 8: - mobileVehicleEntity.rightInputDownMouse = message.clicked; - break; - case 9: - mobileVehicleEntity.downInputDownMouse = message.clicked; - break; - case 10: - mobileVehicleEntity.upInputDownMouse = message.clicked; - break; } } else if (stack.is(ModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) { var drone = EntityFindUtil.findDrone(player.level(), stack.getOrCreateTag().getString("LinkedDrone")); diff --git a/src/main/resources/assets/superbwarfare/lang/en_us.json b/src/main/resources/assets/superbwarfare/lang/en_us.json index bd37040b0..82c8194fb 100644 --- a/src/main/resources/assets/superbwarfare/lang/en_us.json +++ b/src/main/resources/assets/superbwarfare/lang/en_us.json @@ -427,6 +427,7 @@ "key.superbwarfare.edit_grip": "Switch Grip", "key.superbwarfare.release_decoy": "Release Decoy", "key.superbwarfare.melee": "Melee", + "key.superbwarfare.free_camera": "Vehicle Free Camera", "key.superbwarfare.launch": "Launch", "effect.superbwarfare.shock": "Shock", diff --git a/src/main/resources/assets/superbwarfare/lang/zh_cn.json b/src/main/resources/assets/superbwarfare/lang/zh_cn.json index 94ac649f8..4a3e0db0e 100644 --- a/src/main/resources/assets/superbwarfare/lang/zh_cn.json +++ b/src/main/resources/assets/superbwarfare/lang/zh_cn.json @@ -425,6 +425,7 @@ "key.superbwarfare.edit_grip": "切换握把", "key.superbwarfare.release_decoy": "释放诱饵", "key.superbwarfare.melee": "枪械近战", + "key.superbwarfare.free_camera": "载具自由视角", "key.superbwarfare.launch": "发射", "effect.superbwarfare.shock": "电击", diff --git a/src/main/resources/assets/superbwarfare/textures/entity/bmp2.png b/src/main/resources/assets/superbwarfare/textures/entity/bmp2.png index 3a1c8b48d..fbcc20649 100644 Binary files a/src/main/resources/assets/superbwarfare/textures/entity/bmp2.png and b/src/main/resources/assets/superbwarfare/textures/entity/bmp2.png differ