From 6dec95861fe7a993c7404fddf086c9c19a0a9853 Mon Sep 17 00:00:00 2001 From: Atsuihsio <842960157@qq.com> Date: Tue, 14 Jan 2025 02:53:48 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4LAVshader=E6=BB=A4=E9=95=9C?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=9B=BE=E5=83=8F=E6=BB=A4=E9=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/overlay/LandArmorHudOverlay.java | 98 ++++++++++++++++++ .../client/overlay/VehicleHudOverlay.java | 2 +- .../event/ClientEventHandler.java | 17 +-- .../textures/screens/land/tv_frame.png | Bin 0 -> 26683 bytes 4 files changed, 100 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/overlay/LandArmorHudOverlay.java create mode 100644 src/main/resources/assets/superbwarfare/textures/screens/land/tv_frame.png diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/LandArmorHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/LandArmorHudOverlay.java new file mode 100644 index 000000000..d6888920c --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/LandArmorHudOverlay.java @@ -0,0 +1,98 @@ +package com.atsuishio.superbwarfare.client.overlay; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.entity.vehicle.Lav150Entity; +import com.atsuishio.superbwarfare.entity.vehicle.MobileVehicleEntity; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Camera; +import net.minecraft.client.CameraType; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderGuiEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import org.joml.Math; + +import java.text.DecimalFormat; + +import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; + +@Mod.EventBusSubscriber(value = Dist.CLIENT) +public class LandArmorHudOverlay { + private static float scopeScale = 1; + private static final ResourceLocation FRAME = ModUtils.loc("textures/screens/land/tv_frame.png"); + + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void eventHandler(RenderGuiEvent.Pre event) { + int w = event.getWindow().getGuiScaledWidth(); + int h = event.getWindow().getGuiScaledHeight(); + + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + Camera camera = mc.gameRenderer.getMainCamera(); + Vec3 cameraPos = camera.getPosition(); + GuiGraphics guiGraphics = event.getGuiGraphics(); + PoseStack poseStack = guiGraphics.pose(); + + if (player == null) return; + if (player.getVehicle() instanceof Lav150Entity lav150 && player.getVehicle() instanceof MobileVehicleEntity mobileVehicle && lav150.isDriver(player)) { + poseStack.pushPose(); + + poseStack.translate(-6 * ClientEventHandler.turnRot[1],-6 * ClientEventHandler.turnRot[0],0); + RenderSystem.disableDepthTest(); + RenderSystem.depthMask(false); + RenderSystem.enableBlend(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + RenderSystem.setShaderColor(1, 1, 1, 1); + + scopeScale = Mth.lerp(event.getPartialTick(), scopeScale, 1F); + float f = (float) Math.min(w, h); + float f1 = Math.min((float) w / f, (float) h / f) * scopeScale; + float i = Mth.floor(f * f1); + float j = Mth.floor(f * f1); + float k = ((w - i) / 2); + float l = ((h - j) / 2); + + if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) { + int addW = (w / h) * 48; + int addH = (w / h) * 27; + preciseBlit(guiGraphics, FRAME, (float) -addW / 2, (float) -addH / 2, 0, 0.0F, w + addW, h + addH, w + addW, h + addH); + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/helicopter/heli_base.png"), k, l, 0, 0.0F, i, j, i, j); + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/compass.png"), (float) w / 2 - 128, (float) 6, 128 + ((float) 64 / 45 * player.getYRot()), 0, 256, 16, 512, 16); + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/helicopter/speed_frame.png"), (float) w / 2 - 144, (float) h / 2 - 6, 0, 0, 50, 18, 50, 18); + guiGraphics.drawString(Minecraft.getInstance().font, Component.literal(new DecimalFormat("##").format(length(mobileVehicle.getDeltaMovement().x, mobileVehicle.getDeltaMovement().y, mobileVehicle.getDeltaMovement().z) * 72) + "KM/H"), + w / 2 - 140, h / 2, 0x66FF00, false); + if (mobileVehicle.getEnergy() < 0.02 * mobileVehicle.getMaxEnergy()) { + guiGraphics.drawString(Minecraft.getInstance().font, Component.literal( "NO POWER!"), + w / 2 - 144, h / 2 + 14, -65536, false); + } else if (mobileVehicle.getEnergy() < 0.2 * mobileVehicle.getMaxEnergy()) { + guiGraphics.drawString(Minecraft.getInstance().font, Component.literal( "LOW POWER"), + w / 2 - 144, h / 2 + 14, 0xFF6B00, false); + } + + } + + poseStack.popPose(); + } else { + scopeScale = 0.7f; + } + } + + + + public static double length(double x, double y, double z) { + return Math.sqrt(x * x + y * y + z * z); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java index f8a5f13ba..e8f2f3725 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java @@ -32,7 +32,7 @@ public class VehicleHudOverlay { private static final ResourceLocation HEALTH = ModUtils.loc("textures/screens/armor_value.png"); private static final ResourceLocation HEALTH_FRAME = ModUtils.loc("textures/screens/armor_value_frame.png"); - @SubscribeEvent(priority = EventPriority.NORMAL) + @SubscribeEvent(priority = EventPriority.HIGH) public static void eventHandler(RenderGuiEvent.Pre event) { int w = event.getWindow().getGuiScaledWidth(); int h = event.getWindow().getGuiScaledHeight(); diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 8e00af0a1..8cba30dd7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -749,16 +749,7 @@ public class ClientEventHandler { Minecraft.getInstance().gameRenderer.shutdownEffect(); } } - - if (level != null && living.getVehicle() instanceof Lav150Entity vehicle) { - handleLandArmorCamera(event, vehicle); - } else { - var effect = Minecraft.getInstance().gameRenderer.currentEffect(); - if (effect != null && effect.getName().equals(ModUtils.MODID + ":shaders/post/scan_pincushion.json")) { - Minecraft.getInstance().gameRenderer.shutdownEffect(); - } - } - + if (level != null && stack.is(ModTags.Items.GUN)) { handleWeaponSway(living); handleWeaponMove(living); @@ -814,12 +805,6 @@ public class ClientEventHandler { } } - private static void handleLandArmorCamera(ViewportEvent.ComputeCameraAngles event, Lav150Entity entity) { - if (Minecraft.getInstance().gameRenderer.currentEffect() == null) { - Minecraft.getInstance().gameRenderer.loadEffect(ModUtils.loc("shaders/post/scan_pincushion.json")); - } - } - @SubscribeEvent public static void onRenderHand(RenderHandEvent event) { Player player = Minecraft.getInstance().player; diff --git a/src/main/resources/assets/superbwarfare/textures/screens/land/tv_frame.png b/src/main/resources/assets/superbwarfare/textures/screens/land/tv_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..dd21874470bb248db1efb2b89c8635a822d0cd30 GIT binary patch literal 26683 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 literal 0 HcmV?d00001