提取载具固定视角方法

This commit is contained in:
17146 2025-05-14 13:32:53 +08:00 committed by Light_Quanta
parent e3b3dcf87d
commit 9ea44d7b8d
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
11 changed files with 53 additions and 14 deletions

View file

@ -11,7 +11,7 @@ import org.jetbrains.annotations.ApiStatus;
* 玩家击杀生物后用于判断是否发送击杀播报/显示击杀指示
*/
@ApiStatus.Internal
@ApiStatus.AvailableSince("0.7.7")
@ApiStatus.AvailableSince("0.8.0")
public class PreKillEvent extends Event implements ICancellableEvent {
private final Player player;

View file

@ -15,7 +15,7 @@ import java.util.List;
/**
* Register Entities as a container
*/
@ApiStatus.AvailableSince("0.7.7")
@ApiStatus.AvailableSince("0.8.0")
public class RegisterContainersEvent extends Event implements IModBusEvent {
public static final List<ItemStack> containers = new ArrayList<>();

View file

@ -7,7 +7,7 @@ import net.neoforged.bus.api.Event;
import org.jetbrains.annotations.ApiStatus;
@ApiStatus.Internal
@ApiStatus.AvailableSince("0.7.7")
@ApiStatus.AvailableSince("0.8.0")
public class ReloadEvent extends Event {
public final Player player;

View file

@ -1094,4 +1094,9 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity
}
return super.getCameraPosition(partialTicks, player, false, false);
}
@OnlyIn(Dist.CLIENT)
public boolean useFixedCameraPos(Entity entity) {
return true;
}
}

View file

@ -631,4 +631,9 @@ public class AnnihilatorEntity extends EnergyVehicleEntity implements GeoEntity,
}
return super.getCameraPosition(partialTicks, player, false, false);
}
@OnlyIn(Dist.CLIENT)
public boolean useFixedCameraPos(Entity entity) {
return true;
}
}

View file

@ -483,4 +483,9 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
}
return super.getCameraPosition(partialTicks, player, false, false);
}
@OnlyIn(Dist.CLIENT)
public boolean useFixedCameraPos(Entity entity) {
return true;
}
}

View file

@ -552,4 +552,9 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
}
return super.getCameraPosition(partialTicks, player, false, false);
}
@OnlyIn(Dist.CLIENT)
public boolean useFixedCameraPos(Entity entity) {
return true;
}
}

View file

@ -844,4 +844,9 @@ public class PrismTankEntity extends ContainerMobileVehicleEntity implements Geo
}
return super.getCameraPosition(partialTicks, player, false, false);
}
@OnlyIn(Dist.CLIENT)
public boolean useFixedCameraPos(Entity entity) {
return this.getSeatIndex(entity) == 0;
}
}

View file

@ -598,4 +598,9 @@ public class SpeedboatEntity extends ContainerMobileVehicleEntity implements Geo
}
return super.getCameraPosition(partialTicks, player, zoom, isFirstPerson);
}
@OnlyIn(Dist.CLIENT)
public boolean useFixedCameraPos(Entity entity) {
return this.getSeatIndex(entity) == 0;
}
}

View file

@ -1026,14 +1026,33 @@ public abstract class VehicleEntity extends Entity {
public void renderThirdPersonOverlay(GuiGraphics guiGraphics, Font font, Player player, int screenWidth, int screenHeight, float scale) {
}
/**
* 获取视角旋转
*
* @param zoom 是否在载具上瞄准
* @param isFirstPerson 是否是第一人称视角
*/
@OnlyIn(Dist.CLIENT)
@Nullable
public Vec2 getCameraRotation(float partialTicks, Player player, boolean zoom, boolean isFirstPerson) {
return null;
}
/**
* 获取视角位置
* @param zoom 是否在载具上瞄准
* @param isFirstPerson 是否是第一人称视角
*/
@OnlyIn(Dist.CLIENT)
public Vec3 getCameraPosition(float partialTicks, Player player, boolean zoom, boolean isFirstPerson) {
return null;
}
/**
* 是否使用载具固定视角
*/
@OnlyIn(Dist.CLIENT)
public boolean useFixedCameraPos(Entity entity) {
return false;
}
}

View file

@ -1,9 +1,5 @@
package com.atsuishio.superbwarfare.mixins;
import com.atsuishio.superbwarfare.entity.vehicle.A10Entity;
import com.atsuishio.superbwarfare.entity.vehicle.PrismTankEntity;
import com.atsuishio.superbwarfare.entity.vehicle.SpeedboatEntity;
import com.atsuishio.superbwarfare.entity.vehicle.base.CannonEntity;
import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity;
import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.mojang.blaze3d.vertex.PoseStack;
@ -52,11 +48,8 @@ public class GameRendererMixin {
if (entity != null && !mainCamera.isDetached() && entity.getRootVehicle() instanceof VehicleEntity vehicle) {
// rotate camera
float a = vehicle.getTurretYaw(partialTicks);
float r = (Mth.abs(a) - 90f) / 90f;
float r2;
if (Mth.abs(a) <= 90f) {
r2 = a / 90f;
} else {
@ -69,10 +62,7 @@ public class GameRendererMixin {
poseStack.mulPose(Axis.ZP.rotationDegrees(-r * vehicle.getRoll(partialTicks) + r2 * vehicle.getViewXRot(partialTicks)));
if (!(vehicle instanceof SpeedboatEntity speedboat && entity == speedboat.getFirstPassenger()) &&
!(vehicle instanceof PrismTankEntity prismTank && entity == prismTank.getFirstPassenger()) &&
!(vehicle instanceof CannonEntity) && !(vehicle instanceof A10Entity)
) {
if (!vehicle.useFixedCameraPos(entity)) {
// fetch eye offset
float eye = entity.getEyeHeight();