86 lines
3.6 KiB
Java
86 lines
3.6 KiB
Java
package com.atsuishio.superbwarfare.mixins;
|
|
|
|
import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity;
|
|
import com.atsuishio.superbwarfare.item.gun.GunItem;
|
|
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.util.Mth;
|
|
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.getItem() instanceof GunItem && Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) {
|
|
ci.cancel();
|
|
}
|
|
}
|
|
}
|
|
|
|
// From Immersive_Aircraft
|
|
@Shadow
|
|
@Final
|
|
private Camera mainCamera;
|
|
|
|
@SuppressWarnings("ConstantValue")
|
|
@Inject(method = "bobHurt(Lcom/mojang/blaze3d/vertex/PoseStack;F)V", at = @At("HEAD"))
|
|
public void superbWarfare$renderWorld(PoseStack poseStack, float partialTicks, CallbackInfo ci) {
|
|
Entity entity = mainCamera.getEntity();
|
|
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 {
|
|
if (a < 0) {
|
|
r2 = -(180f + a) / 90f;
|
|
} else {
|
|
r2 = (180f - a) / 90f;
|
|
}
|
|
}
|
|
|
|
poseStack.mulPose(Axis.ZP.rotationDegrees(-r * vehicle.getRoll(partialTicks) + r2 * vehicle.getViewXRot(partialTicks)));
|
|
|
|
if (!vehicle.useFixedCameraPos(entity)) {
|
|
// 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(partialTicks)));
|
|
quaternion.mul(Axis.XP.rotationDegrees(vehicle.getViewXRot(partialTicks)));
|
|
quaternion.mul(Axis.ZP.rotationDegrees(vehicle.getRoll(partialTicks)));
|
|
offset.rotate(quaternion);
|
|
|
|
// apply camera offset
|
|
poseStack.mulPose(Axis.XP.rotationDegrees(mainCamera.getXRot()));
|
|
poseStack.mulPose(Axis.YP.rotationDegrees(mainCamera.getYRot() + 180.0f));
|
|
poseStack.translate(offset.x(), offset.y() + eye, offset.z());
|
|
poseStack.mulPose(Axis.YP.rotationDegrees(-mainCamera.getYRot() - 180.0f));
|
|
poseStack.mulPose(Axis.XP.rotationDegrees(-mainCamera.getXRot()));
|
|
}
|
|
}
|
|
}
|
|
}
|