添加飞行载具自由视角功能

This commit is contained in:
Atsuihsio 2025-02-08 22:32:00 +08:00
parent e6dd9a56fb
commit e23b04aeba
12 changed files with 49 additions and 58 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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",

View file

@ -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": "电击",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB