package com.atsuishio.superbwarfare.mixins; import com.atsuishio.superbwarfare.entity.vehicle.Ah6Entity; import com.atsuishio.superbwarfare.init.ModTags; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import net.minecraft.client.Camera; import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import org.joml.Quaternionf; import org.joml.Vector3f; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(GameRenderer.class) public class GameRendererMixin { @Inject(method = "bobView(Lcom/mojang/blaze3d/vertex/PoseStack;F)V", at = @At("HEAD"), cancellable = true) public void bobView(PoseStack p_109139_, float p_109140_, CallbackInfo ci) { Minecraft mc = Minecraft.getInstance(); Player player = mc.player; if (player != null) { ItemStack stack = player.getMainHandItem(); if (stack.is(ModTags.Items.GUN) && Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) { ci.cancel(); } } } // From Immersive_Aircraft @Shadow @Final private Camera mainCamera; @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;setup(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/world/entity/Entity;ZZF)V")) public void immersiveAircraft$renderWorld(float tickDelta, long limitTime, PoseStack matrices, CallbackInfo ci) { Entity entity = mainCamera.getEntity(); //noinspection ConstantValue if (entity != null && !mainCamera.isDetached() && entity.getRootVehicle() instanceof Ah6Entity vehicle) { // rotate camera matrices.mulPose(Axis.ZP.rotationDegrees(vehicle.getRoll(tickDelta))); // matrices.mulPose(Axis.XP.rotationDegrees(vehicle.getViewXRot(tickDelta))); // fetch eye offset float eye = entity.getEyeHeight(); // transform eye offset to match aircraft rotation Vector3f offset = new Vector3f(0, -eye, 0); Quaternionf quaternion = Axis.XP.rotationDegrees(0.0f); quaternion.mul(Axis.YP.rotationDegrees(-vehicle.getViewYRot(tickDelta))); quaternion.mul(Axis.XP.rotationDegrees(vehicle.getViewXRot(tickDelta))); quaternion.mul(Axis.ZP.rotationDegrees(vehicle.getRoll(tickDelta))); offset.rotate(quaternion); // apply camera offset matrices.mulPose(Axis.XP.rotationDegrees(mainCamera.getXRot())); matrices.mulPose(Axis.YP.rotationDegrees(mainCamera.getYRot() + 180.0f)); matrices.translate(offset.x(), offset.y() + eye, offset.z()); matrices.mulPose(Axis.YP.rotationDegrees(-mainCamera.getYRot() - 180.0f)); matrices.mulPose(Axis.XP.rotationDegrees(-mainCamera.getXRot())); } } }