diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java index 8db61e466..efa88fb06 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/A10Entity.java @@ -12,6 +12,7 @@ import com.atsuishio.superbwarfare.init.*; import com.atsuishio.superbwarfare.network.message.receive.ShakeClientMessage; import com.atsuishio.superbwarfare.tools.*; import com.mojang.math.Axis; +import it.unimi.dsi.fastutil.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -49,6 +50,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Math; import org.joml.Matrix4f; +import org.joml.Quaternionf; import org.joml.Vector4f; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -1099,4 +1101,10 @@ public class A10Entity extends ContainerMobileVehicleEntity implements GeoEntity public boolean useFixedCameraPos(Entity entity) { return true; } + + @OnlyIn(Dist.CLIENT) + @Nullable + public Pair getPassengerRotation(Entity entity, float tickDelta) { + return Pair.of(Axis.XP.rotationDegrees(-this.getViewXRot(tickDelta)), Axis.ZP.rotationDegrees(-this.getRoll(tickDelta))); + } } 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 f81b06dfd..2375c3085 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java @@ -21,6 +21,7 @@ import com.atsuishio.superbwarfare.tools.CustomExplosion; import com.atsuishio.superbwarfare.tools.InventoryTool; import com.atsuishio.superbwarfare.tools.ParticleTool; import com.mojang.math.Axis; +import it.unimi.dsi.fastutil.Pair; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; @@ -40,10 +41,14 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.event.EventHooks; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.joml.Math; import org.joml.Matrix4f; +import org.joml.Quaternionf; import org.joml.Vector4f; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -702,4 +707,15 @@ public class Ah6Entity extends ContainerMobileVehicleEntity implements GeoEntity public double getSensitivity(double original, boolean zoom, int seatIndex, boolean isOnGround) { return seatIndex == 0 && !isOnGround ? 0.33 : original; } + + @OnlyIn(Dist.CLIENT) + @Nullable + public Pair getPassengerRotation(Entity entity, float tickDelta) { + if (this.getSeatIndex(entity) == 2) { + return Pair.of(Axis.XP.rotationDegrees(-this.getRoll(tickDelta)), Axis.ZP.rotationDegrees(this.getViewXRot(tickDelta))); + } else if (this.getSeatIndex(entity) == 3) { + return Pair.of(Axis.XP.rotationDegrees(this.getRoll(tickDelta)), Axis.ZP.rotationDegrees(-this.getViewXRot(tickDelta))); + } + return Pair.of(Axis.XP.rotationDegrees(-this.getViewXRot(tickDelta)), Axis.ZP.rotationDegrees(-this.getRoll(tickDelta))); + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/SpeedboatEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/SpeedboatEntity.java index c6fde6af8..58586a43b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/SpeedboatEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/SpeedboatEntity.java @@ -18,6 +18,7 @@ import com.atsuishio.superbwarfare.tools.CustomExplosion; import com.atsuishio.superbwarfare.tools.InventoryTool; import com.atsuishio.superbwarfare.tools.ParticleTool; import com.mojang.math.Axis; +import it.unimi.dsi.fastutil.Pair; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; @@ -43,6 +44,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Math; import org.joml.Matrix4f; +import org.joml.Quaternionf; import org.joml.Vector4f; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -603,4 +605,10 @@ public class SpeedboatEntity extends ContainerMobileVehicleEntity implements Geo public boolean useFixedCameraPos(Entity entity) { return this.getSeatIndex(entity) == 0; } + + @OnlyIn(Dist.CLIENT) + @Nullable + public Pair getPassengerRotation(Entity entity, float tickDelta) { + return Pair.of(Axis.XP.rotationDegrees(-this.getViewXRot(tickDelta)), Axis.ZP.rotationDegrees(-this.getRoll(tickDelta))); + } } 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 cf04a8dee..3f7f33b03 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java @@ -12,6 +12,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.tools.CustomExplosion; import com.atsuishio.superbwarfare.tools.ParticleTool; import com.mojang.math.Axis; +import it.unimi.dsi.fastutil.Pair; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; @@ -32,10 +33,14 @@ import net.minecraft.world.item.Items; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.event.EventHooks; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.joml.Math; import org.joml.Matrix4f; +import org.joml.Quaternionf; import org.joml.Vector4f; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -372,4 +377,10 @@ public class Tom6Entity extends MobileVehicleEntity implements GeoEntity { public double getSensitivity(double original, boolean zoom, int seatIndex, boolean isOnGround) { return 0.3; } + + @OnlyIn(Dist.CLIENT) + @Nullable + public Pair getPassengerRotation(Entity entity, float tickDelta) { + return Pair.of(Axis.XP.rotationDegrees(-this.getViewXRot(tickDelta)), Axis.ZP.rotationDegrees(-this.getRoll(tickDelta))); + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/WheelChairEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/WheelChairEntity.java index 58dd5ee68..5129f4c03 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/WheelChairEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/WheelChairEntity.java @@ -11,6 +11,7 @@ import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.tools.CustomExplosion; import com.atsuishio.superbwarfare.tools.ParticleTool; import com.mojang.math.Axis; +import it.unimi.dsi.fastutil.Pair; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -30,10 +31,14 @@ import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.event.EventHooks; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.joml.Math; import org.joml.Matrix4f; +import org.joml.Quaternionf; import org.joml.Vector4f; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -317,4 +322,9 @@ public class WheelChairEntity extends MobileVehicleEntity implements GeoEntity { return Mod.loc("textures/vehicle_icon/wheel_chair_icon.png"); } + @OnlyIn(Dist.CLIENT) + @Nullable + public Pair getPassengerRotation(Entity entity, float tickDelta) { + return Pair.of(Axis.XP.rotationDegrees(-this.getViewXRot(tickDelta)), Axis.ZP.rotationDegrees(-this.getRoll(tickDelta))); + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java index c721a7db4..d14541676 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/base/VehicleEntity.java @@ -16,6 +16,7 @@ import com.google.common.collect.Lists; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.math.Axis; +import it.unimi.dsi.fastutil.Pair; import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; @@ -61,6 +62,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Math; import org.joml.Matrix4f; +import org.joml.Quaternionf; import org.joml.Vector4f; import java.util.ArrayList; @@ -1055,4 +1057,15 @@ public abstract class VehicleEntity extends Entity { public boolean useFixedCameraPos(Entity entity) { return false; } + + /** + * 获取载具上玩家的旋转 + * + * @return X轴旋转,Z轴旋转 + */ + @OnlyIn(Dist.CLIENT) + @Nullable + public Pair getPassengerRotation(Entity entity, float tickDelta) { + return null; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/LivingEntityRendererMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/LivingEntityRendererMixin.java index b5bdec6ba..92290bdaa 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/LivingEntityRendererMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/LivingEntityRendererMixin.java @@ -1,6 +1,5 @@ package com.atsuishio.superbwarfare.mixins; -import com.atsuishio.superbwarfare.entity.vehicle.*; import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; @@ -19,27 +18,14 @@ public class LivingEntityRendererMixin { @Inject(method = "setupRotations", at = @At("TAIL")) public void render(T entity, PoseStack poseStack, float bob, float yBodyRot, float partialTick, float scale, CallbackInfo ci) { if (entity.getRootVehicle() != entity && entity.getRootVehicle() instanceof VehicleEntity vehicle) { - if (vehicle instanceof Tom6Entity || vehicle instanceof WheelChairEntity || vehicle instanceof SpeedboatEntity || vehicle instanceof A10Entity) { - poseStack.mulPose(Axis.XP.rotationDegrees(-vehicle.getViewXRot(partialTick))); - poseStack.mulPose(Axis.ZP.rotationDegrees(-vehicle.getRoll(partialTick))); - } else if (vehicle instanceof Ah6Entity ah6Entity) { - if (entity == ah6Entity.getNthEntity(2)) { - poseStack.mulPose(Axis.XP.rotationDegrees(-ah6Entity.getRoll(partialTick))); - poseStack.mulPose(Axis.ZP.rotationDegrees(ah6Entity.getViewXRot(partialTick))); - } else if (entity == ah6Entity.getNthEntity(3)) { - poseStack.mulPose(Axis.XP.rotationDegrees(ah6Entity.getRoll(partialTick))); - poseStack.mulPose(Axis.ZP.rotationDegrees(-ah6Entity.getViewXRot(partialTick))); - } else { - poseStack.mulPose(Axis.XP.rotationDegrees(-ah6Entity.getViewXRot(partialTick))); - poseStack.mulPose(Axis.ZP.rotationDegrees(-ah6Entity.getRoll(partialTick))); - } + var rotation = vehicle.getPassengerRotation(entity, partialTick); + if (rotation != null) { + poseStack.mulPose(rotation.first()); + poseStack.mulPose(rotation.second()); } else { float a = Mth.wrapDegrees(Mth.lerp(partialTick, entity.yBodyRotO, entity.yBodyRot) - Mth.lerp(partialTick, vehicle.yRotO, vehicle.getYRot())); - float r = (Mth.abs(a) - 90f) / 90f; - float r2; - if (Mth.abs(a) <= 90f) { r2 = a / 90f; } else {