From f69012702dc7e5d9e5ac19e52291285685832f10 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Wed, 9 Apr 2025 04:19:43 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=89=80=E6=9C=89overlay?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/ClientRenderHandler.java | 23 +- .../client/overlay/AmmoBarOverlay.java | 4 +- .../client/overlay/AmmoCountOverlay.java | 3 + .../client/overlay/AmmoOverlay.java | 199 ------------------ .../client/overlay/ArmRendererFixOverlay.java | 28 ++- .../client/overlay/ArmorPlateOverlay.java | 4 +- .../client/overlay/CannonHudOverlay.java | 63 +++--- .../client/overlay/CrossHairOverlay.java | 26 ++- ...oneUIOverlay.java => DroneHudOverlay.java} | 29 +-- .../overlay/GrenadeLauncherOverlay.java | 25 ++- .../client/overlay/HandsomeFrameOverlay.java | 28 +-- .../client/overlay/HelicopterHudOverlay.java | 48 +++-- .../client/overlay/JavelinHudOverlay.java | 46 ++-- .../client/overlay/KillMessageOverlay.java | 54 ++--- .../client/overlay/MortarInfoOverlay.java | 32 +-- .../client/overlay/RedTriangleOverlay.java | 28 ++- .../client/overlay/SpyglassRangeOverlay.java | 32 +-- .../client/overlay/VehicleHudOverlay.java | 35 +-- .../client/overlay/VehicleMgHudOverlay.java | 29 +-- .../client/overlay/VehicleTeamOverlay.java | 34 +-- .../overlay/Yx100SwarmDroneHudOverlay.java | 28 +-- .../receive/SimulationDistanceMessage.java | 4 +- 22 files changed, 354 insertions(+), 448 deletions(-) delete mode 100644 src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoOverlay.java rename src/main/java/com/atsuishio/superbwarfare/client/overlay/{DroneUIOverlay.java => DroneHudOverlay.java} (86%) diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClientRenderHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClientRenderHandler.java index 609ea9781..155228d01 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClientRenderHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClientRenderHandler.java @@ -1,8 +1,6 @@ package com.atsuishio.superbwarfare.client; -import com.atsuishio.superbwarfare.client.overlay.AmmoBarOverlay; -import com.atsuishio.superbwarfare.client.overlay.AmmoCountOverlay; -import com.atsuishio.superbwarfare.client.overlay.ArmorPlateOverlay; +import com.atsuishio.superbwarfare.client.overlay.*; import com.atsuishio.superbwarfare.client.renderer.block.*; import com.atsuishio.superbwarfare.client.tooltip.*; import com.atsuishio.superbwarfare.client.tooltip.component.*; @@ -41,8 +39,25 @@ public class ClientRenderHandler { @SubscribeEvent public static void registerOverlays(RegisterGuiLayersEvent event) { - event.registerBelowAll(ArmorPlateOverlay.ID, new ArmorPlateOverlay()); + event.registerBelowAll(JavelinHudOverlay.ID, new JavelinHudOverlay()); + event.registerBelow(JavelinHudOverlay.ID, VehicleHudOverlay.ID, new VehicleHudOverlay()); + event.registerBelowAll(KillMessageOverlay.ID, new KillMessageOverlay()); + event.registerBelowAll(VehicleTeamOverlay.ID, new VehicleTeamOverlay()); + event.registerBelowAll(VehicleMgHudOverlay.ID, new VehicleMgHudOverlay()); + event.registerBelowAll(Yx100SwarmDroneHudOverlay.ID, new Yx100SwarmDroneHudOverlay()); event.registerBelowAll(AmmoBarOverlay.ID, new AmmoBarOverlay()); event.registerBelowAll(AmmoCountOverlay.ID, new AmmoCountOverlay()); + event.registerBelowAll(ArmorPlateOverlay.ID, new ArmorPlateOverlay()); + event.registerBelowAll(ArmRendererFixOverlay.ID, new ArmRendererFixOverlay()); + event.registerBelowAll(CannonHudOverlay.ID, new CannonHudOverlay()); + event.registerBelowAll(CrossHairOverlay.ID, new CrossHairOverlay()); + event.registerBelowAll(DroneHudOverlay.ID, new DroneHudOverlay()); + event.registerBelowAll(GrenadeLauncherOverlay.ID, new GrenadeLauncherOverlay()); + event.registerBelowAll(RedTriangleOverlay.ID, new RedTriangleOverlay()); + event.registerBelowAll(HandsomeFrameOverlay.ID, new HandsomeFrameOverlay()); + event.registerBelowAll(SpyglassRangeOverlay.ID, new SpyglassRangeOverlay()); + event.registerBelowAll(HelicopterHudOverlay.ID, new HelicopterHudOverlay()); + + event.registerBelowAll(MortarInfoOverlay.ID, new MortarInfoOverlay()); } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoBarOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoBarOverlay.java index 4f1b0cc43..1f7aaf684 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoBarOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoBarOverlay.java @@ -21,10 +21,12 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import javax.annotation.ParametersAreNonnullByDefault; - +@OnlyIn(Dist.CLIENT) public class AmmoBarOverlay implements LayeredDraw.Layer { public static final ResourceLocation ID = Mod.loc("ammo_bar"); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoCountOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoCountOverlay.java index d0b89555a..87e95cc95 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoCountOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoCountOverlay.java @@ -20,9 +20,12 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.FastColor; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import javax.annotation.ParametersAreNonnullByDefault; +@OnlyIn(Dist.CLIENT) public class AmmoCountOverlay implements LayeredDraw.Layer { public static final ResourceLocation ID = Mod.loc("ammo_count"); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoOverlay.java deleted file mode 100644 index 96c6535f5..000000000 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoOverlay.java +++ /dev/null @@ -1,199 +0,0 @@ -package com.atsuishio.superbwarfare.client.overlay; - -import com.atsuishio.superbwarfare.Mod; -import com.atsuishio.superbwarfare.component.ModDataComponents; -import com.atsuishio.superbwarfare.entity.vehicle.base.ArmedVehicleEntity; -import com.atsuishio.superbwarfare.init.ModAttachments; -import com.atsuishio.superbwarfare.init.ModItems; -import com.atsuishio.superbwarfare.item.common.ammo.AmmoSupplierItem; -import com.atsuishio.superbwarfare.item.common.ammo.box.AmmoBoxInfo; -import com.atsuishio.superbwarfare.tools.AmmoType; -import com.atsuishio.superbwarfare.tools.animation.AnimationCurves; -import com.atsuishio.superbwarfare.tools.animation.AnimationTimer; -import com.atsuishio.superbwarfare.tools.animation.ValueAnimator; -import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.Minecraft; -import net.minecraft.network.chat.Component; -import net.minecraft.util.FastColor; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; - -@EventBusSubscriber(modid = Mod.MODID, value = Dist.CLIENT) -public class AmmoOverlay { - - private static final AnimationTimer ammoInfoTimer = new AnimationTimer(500, 2000) - .forwardAnimation(AnimationCurves.EASE_OUT_EXPO) - .backwardAnimation(AnimationCurves.EASE_IN_EXPO); - private static final AnimationTimer ammoBoxTimer = new AnimationTimer(500) - .forwardAnimation(AnimationCurves.EASE_OUT_EXPO) - .backwardAnimation(AnimationCurves.EASE_IN_EXPO); - - private static final ValueAnimator[] ammoCountAnimators = ValueAnimator.create( - AmmoType.values().length, 800, 0 - ); - private static final ValueAnimator[] ammoBoxAnimators = ValueAnimator.create( - AmmoType.values().length, 800, 0 - ); - - - /** - * 在手持弹药或弹药盒时,渲染玩家弹药总量信息 - */ - @SubscribeEvent - public static void renderAmmoInfo(RenderGuiEvent.Pre event) { - boolean startRenderingAmmoInfo = false; - Player player = Minecraft.getInstance().player; - if (player == null || player.isSpectator()) return; - - boolean isAmmoBox = false; - - // 动画计算 - var currentTime = System.currentTimeMillis(); - ItemStack stack = player.getMainHandItem(); - if ((stack.getItem() instanceof AmmoSupplierItem || stack.getItem() == ModItems.AMMO_BOX.get()) && !(player.getVehicle() instanceof ArmedVehicleEntity vehicle && vehicle.banHand(player))) { - // 刚拿出弹药物品时,视为开始弹药信息渲染 - startRenderingAmmoInfo = ammoInfoTimer.getProgress(currentTime) == 0; - ammoInfoTimer.forward(currentTime); - - if (stack.getItem() == ModItems.AMMO_BOX.get()) { - isAmmoBox = true; - ammoBoxTimer.forward(currentTime); - } else { - ammoBoxTimer.backward(currentTime); - } - } else { - ammoInfoTimer.backward(currentTime); - ammoBoxTimer.backward(currentTime); - } - if (!ammoInfoTimer.isForward() && ammoInfoTimer.finished(currentTime)) return; - - var poseStack = event.getGuiGraphics().pose(); - poseStack.pushPose(); - - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); - - var ammoX = ammoInfoTimer.lerp(w + 120, (float) w / 2 + 40, currentTime); - final int fontHeight = 15; - var yOffset = (-h - AmmoType.values().length * fontHeight) / 2f; - - // 渲染总弹药数量 - var cap = player.getData(ModAttachments.PLAYER_VARIABLE); - var font = Minecraft.getInstance().font; - - for (var type : AmmoType.values()) { - var index = type.ordinal(); - var ammoCount = type.get(cap); - var animator = ammoCountAnimators[index]; - - var boxAnimator = ammoBoxAnimators[index]; - var boxAmmoCount = boxAnimator.newValue(); - boolean boxAmmoSelected = false; - - if (isAmmoBox) { - var info = stack.get(ModDataComponents.AMMO_BOX_INFO); - if (info == null) info = new AmmoBoxInfo("All", false); - - var ammoBoxType = info.type(); - boxAmmoCount = type.get(stack); - if (ammoBoxType.equals("All") || ammoBoxType.equals(type.name)) { - boxAnimator.forward(currentTime); - boxAmmoSelected = true; - } else { - boxAnimator.reset(boxAmmoCount); - } - } - - // 首次开始渲染弹药信息时,记录弹药数量,便于后续播放动画 - if (startRenderingAmmoInfo) { - animator.reset(ammoCount); - animator.endForward(currentTime); - if (isAmmoBox) { - boxAnimator.reset(type.get(stack)); - boxAnimator.endForward(currentTime); - } - } - - int ammoAdd = Integer.compare(ammoCount, animator.oldValue()); - // 弹药数量变化时,更新并开始播放弹药数量更改动画 - animator.compareAndUpdate(ammoCount, () -> { - // 弹药数量变化时,开始播放弹药数量更改动画 - animator.beginForward(currentTime); - }); - - var progress = animator.getProgress(currentTime); - var ammoCountStr = Integer.toString( - Math.round(animator.lerp(animator.oldValue(), ammoCount, currentTime)) - ); - - // 弹药增加时,颜色由绿变白,否则由红变白 - var fontColor = FastColor.ARGB32.lerp(progress, switch (ammoAdd) { - case 1 -> 0xFF00FF00; - case -1 -> 0xFFFF0000; - default -> 0xFFFFFFFF; - }, 0xFFFFFFFF); - - RenderSystem.setShaderColor(1, 1, 1, ammoInfoTimer.lerp(0, 1, currentTime)); - - // 弹药数量 - event.getGuiGraphics().drawString( - font, - ammoCountStr, - ammoX + (30 - font.width(ammoCountStr)), - h + yOffset, - fontColor, - true - ); - - // 弹药类型 - event.getGuiGraphics().drawString( - font, - Component.translatable(type.translatableKey).getString(), - ammoX + 35, - h + yOffset, - fontColor, - true - ); - - // 弹药盒信息渲染 - RenderSystem.setShaderColor(1, 1, 1, ammoBoxTimer.lerp(0, 1, currentTime)); - var ammoBoxX = ammoBoxTimer.lerp(-30, (float) w / 2, currentTime); - - int ammoBoxAdd = Integer.compare(boxAmmoCount, boxAnimator.oldValue()); - boxAnimator.compareAndUpdate(boxAmmoCount, () -> boxAnimator.beginForward(currentTime)); - - // 选中时显示为黄色,否则为白色 - var targetColor = boxAmmoSelected ? 0xFFFFFF00 : 0xFFFFFFFF; - - var boxFontColor = FastColor.ARGB32.lerp(boxAnimator.getProgress(currentTime), - switch (ammoBoxAdd) { - case 1 -> 0xFF00FF00; - case -1 -> 0xFFFF0000; - default -> targetColor; - }, - targetColor - ); - - // 弹药盒内弹药数量 - event.getGuiGraphics().drawString( - Minecraft.getInstance().font, - Integer.toString( - Math.round(boxAnimator.lerp(boxAnimator.oldValue(), boxAmmoCount, currentTime)) - ), - ammoBoxX - 70, - h + yOffset, - boxFontColor, - true - ); - - yOffset += fontHeight; - } - - RenderSystem.setShaderColor(1, 1, 1, 1); - poseStack.popPose(); - } -} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/ArmRendererFixOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/ArmRendererFixOverlay.java index 1107e29c1..f32d57d67 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/ArmRendererFixOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/ArmRendererFixOverlay.java @@ -1,24 +1,32 @@ package com.atsuishio.superbwarfare.client.overlay; +import com.atsuishio.superbwarfare.Mod; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; -@EventBusSubscriber(value = Dist.CLIENT) -public class ArmRendererFixOverlay { +import javax.annotation.ParametersAreNonnullByDefault; - @SubscribeEvent - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); +@OnlyIn(Dist.CLIENT) +public class ArmRendererFixOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("arm_renderer_fix"); + + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); Player entity = Minecraft.getInstance().player; if (entity != null) { // TODO what is this? // InventoryScreen.renderEntityInInventoryFollowsAngle( -// event.getGuiGraphics(), +// guiGraphics, // w / 2 - 114514, // h / 2 + 22, // 1, diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/ArmorPlateOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/ArmorPlateOverlay.java index f45c6ad4d..ee46cbc04 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/ArmorPlateOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/ArmorPlateOverlay.java @@ -12,10 +12,12 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import javax.annotation.ParametersAreNonnullByDefault; - +@OnlyIn(Dist.CLIENT) public class ArmorPlateOverlay implements LayeredDraw.Layer { public static final ResourceLocation ID = Mod.loc("armor_plate"); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CannonHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CannonHudOverlay.java index 79c518bcf..5280db1a9 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CannonHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CannonHudOverlay.java @@ -16,10 +16,13 @@ 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.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; 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.Entity; import net.minecraft.world.entity.LivingEntity; @@ -28,25 +31,27 @@ import net.minecraft.world.level.ClipContext; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; import org.joml.Math; +import javax.annotation.ParametersAreNonnullByDefault; + import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; import static com.atsuishio.superbwarfare.client.overlay.VehicleHudOverlay.renderKillIndicator; import static com.atsuishio.superbwarfare.client.overlay.VehicleHudOverlay.renderKillIndicator3P; -@EventBusSubscriber(value = Dist.CLIENT) -public class CannonHudOverlay { +@OnlyIn(Dist.CLIENT) +public class CannonHudOverlay implements LayeredDraw.Layer { - @SubscribeEvent - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); + public static final ResourceLocation ID = Mod.loc("cannon_hud"); + + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); Minecraft mc = Minecraft.getInstance(); Player player = mc.player; - GuiGraphics guiGraphics = event.getGuiGraphics(); PoseStack poseStack = guiGraphics.pose(); Camera camera = mc.gameRenderer.getMainCamera(); Vec3 cameraPos = camera.getPosition(); @@ -63,23 +68,23 @@ public class CannonHudOverlay { RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); RenderSystem.setShaderColor(1, 1, 1, 1); - preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/compass_white.png"), (float) w / 2 - 128, (float) 10, 128 + ((float) 64 / 45 * (Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot()))), 0, 256, 16, 512, 16); - preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/roll_ind_white.png"), w / 2F - 4, 27, 0, 0.0F, 8, 8, 8, 8); + preciseBlit(guiGraphics, Mod.loc("textures/screens/compass_white.png"), (float) w / 2 - 128, (float) 10, 128 + ((float) 64 / 45 * (Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot()))), 0, 256, 16, 512, 16); + preciseBlit(guiGraphics, Mod.loc("textures/screens/roll_ind_white.png"), w / 2F - 4, 27, 0, 0.0F, 8, 8, 8, 8); - String angle = FormatTool.DECIMAL_FORMAT_1ZZ.format(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot())); + String angle = FormatTool.DECIMAL_FORMAT_1ZZ.format(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot())); int width = Minecraft.getInstance().font.width(angle); - event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.literal(angle), w / 2 - width / 2, 40, -1, false); + guiGraphics.drawString(Minecraft.getInstance().font, Component.literal(angle), w / 2 - width / 2, 40, -1, false); - preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/cannon/cannon_pitch.png"), w / 2F + 166, h / 2F - 64, 0, 0.0F, 8, 128, 8, 128); + preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_pitch.png"), w / 2F + 166, h / 2F - 64, 0, 0.0F, 8, 128, 8, 128); - String pitch = FormatTool.DECIMAL_FORMAT_1ZZ.format(-Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), cannon.xRotO, cannon.getXRot())); + String pitch = FormatTool.DECIMAL_FORMAT_1ZZ.format(-Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), cannon.xRotO, cannon.getXRot())); int widthP = Minecraft.getInstance().font.width(pitch); poseStack.pushPose(); - event.getGuiGraphics().pose().translate(0, Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), cannon.xRotO, cannon.getXRot()) * 0.7, 0); - preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/cannon/cannon_pitch_ind.png"), w / 2F + 158, h / 2F - 4, 0, 0.0F, 8, 8, 8, 8); - event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.literal(pitch), w / 2 + 157 - widthP, h / 2 - 4, -1, false); + guiGraphics.pose().translate(0, Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), cannon.xRotO, cannon.getXRot()) * 0.7, 0); + preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_pitch_ind.png"), w / 2F + 158, h / 2F - 4, 0, 0.0F, 8, 8, 8, 8); + guiGraphics.drawString(Minecraft.getInstance().font, Component.literal(pitch), w / 2 + 157 - widthP, h / 2 - 4, -1, false); poseStack.popPose(); if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON || ClientEventHandler.zoomVehicle) { @@ -111,32 +116,32 @@ public class CannonHudOverlay { if (lookingEntity.getDisplayName() != null) { component.append(lookingEntity.getDisplayName()); } - event.getGuiGraphics().drawString(Minecraft.getInstance().font, component, w / 2 + 14, h / 2 - 20, -1, false); + guiGraphics.drawString(Minecraft.getInstance().font, component, w / 2 + 14, h / 2 - 20, -1, false); } else { if (blockRange > 511) { - event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range") + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range") .append(Component.literal("---m")), w / 2 + 14, h / 2 - 20, -1, false); } else { - event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range") + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range") .append(Component.literal(FormatTool.format1D(blockRange, "m"))), w / 2 + 14, h / 2 - 20, -1, false); } } if (cannon instanceof AnnihilatorEntity) { - preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/cannon/laser_cannon_crosshair.png"), k, l, 0, 0.0F, i, j, i, j); + preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/laser_cannon_crosshair.png"), k, l, 0, 0.0F, i, j, i, j); } else { - preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/cannon/cannon_crosshair.png"), k, l, 0, 0.0F, i, j, i, j); + preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_crosshair.png"), k, l, 0, 0.0F, i, j, i, j); } - float diffY = -Mth.wrapDegrees(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yHeadRotO, player.getYHeadRot()) - Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot())); + float diffY = -Mth.wrapDegrees(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yHeadRotO, player.getYHeadRot()) - Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot())); - preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/cannon/indicator.png"), w / 2F - 4.3f + 0.45f * diffY, h / 2F - 10, 0, 0.0F, 8, 8, 8, 8); + preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/indicator.png"), w / 2F - 4.3f + 0.45f * diffY, h / 2F - 10, 0, 0.0F, 8, 8, 8, 8); } else { - preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/cannon/cannon_crosshair_notzoom.png"), k, l, 0, 0.0F, i, j, i, j); + preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_crosshair_notzoom.png"), k, l, 0, 0.0F, i, j, i, j); } renderKillIndicator(guiGraphics, w, h); } else if (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK && !ClientEventHandler.zoomVehicle) { - Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yo, player.getY()), - Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.zo, player.getZ())).add(cannon.getViewVector(event.getPartialTick().getGameTimeDeltaPartialTick(true)).scale(128)), cameraPos); + Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo, player.getY()), + Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.zo, player.getZ())).add(cannon.getViewVector(deltaTracker.getGameTimeDeltaPartialTick(true)).scale(128)), cameraPos); // 第三人称准星 if (p != null) { diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java index 8f3480206..c2e0a71d0 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java @@ -16,23 +16,30 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import net.minecraft.client.CameraType; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.ClientTickEvent; -import net.neoforged.neoforge.client.event.RenderGuiEvent; + +import javax.annotation.ParametersAreNonnullByDefault; import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; -@EventBusSubscriber(value = Dist.CLIENT) -public class CrossHairOverlay { +@OnlyIn(Dist.CLIENT) +@EventBusSubscriber(modid = Mod.MODID, value = Dist.CLIENT) +public class CrossHairOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("cross_hair"); private static final ResourceLocation REX_HORIZONTAL = Mod.loc("textures/screens/rex_horizontal.png"); private static final ResourceLocation REX_VERTICAL = Mod.loc("textures/screens/rex_vertical.png"); @@ -44,10 +51,11 @@ public class CrossHairOverlay { private static float scopeScale = 1f; public static float gunRot; - @SubscribeEvent - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); Player player = Minecraft.getInstance().player; if (player == null) { @@ -59,11 +67,9 @@ public class CrossHairOverlay { if (!player.getMainHandItem().is(ModTags.Items.GUN) || (player.getVehicle() instanceof ArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player))) return; - GuiGraphics guiGraphics = event.getGuiGraphics(); - ItemStack stack = player.getMainHandItem(); double spread = ClientEventHandler.gunSpread + 1 * ClientEventHandler.firePos; - float deltaFrame = event.getPartialTick().getGameTimeDeltaPartialTick(true); + float deltaFrame = deltaTracker.getGameTimeDeltaPartialTick(true); float moveX = 0; float moveY = 0; diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/DroneUIOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/DroneHudOverlay.java similarity index 86% rename from src/main/java/com/atsuishio/superbwarfare/client/overlay/DroneUIOverlay.java rename to src/main/java/com/atsuishio/superbwarfare/client/overlay/DroneHudOverlay.java index 79fc21105..a891473c3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/DroneUIOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/DroneHudOverlay.java @@ -12,8 +12,10 @@ import com.atsuishio.superbwarfare.tools.SeekTool; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -25,33 +27,34 @@ import net.minecraft.world.level.ClipContext; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; +import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; import static com.atsuishio.superbwarfare.entity.vehicle.DroneEntity.AMMO; import static com.atsuishio.superbwarfare.entity.vehicle.DroneEntity.KAMIKAZE_MODE; -@EventBusSubscriber(value = Dist.CLIENT) -public class DroneUIOverlay { +@OnlyIn(Dist.CLIENT) +public class DroneHudOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("drone_hud"); public static int MAX_DISTANCE = 256; private static final ResourceLocation FRAME = Mod.loc("textures/screens/frame/frame.png"); - @SubscribeEvent - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); Minecraft mc = Minecraft.getInstance(); Player player = mc.player; if (player == null) return; - GuiGraphics guiGraphics = event.getGuiGraphics(); PoseStack poseStack = guiGraphics.pose(); ItemStack stack = player.getMainHandItem(); @@ -149,8 +152,8 @@ public class DroneUIOverlay { double zoom = 0.975 * ClientEventHandler.droneFovLerp + 0.06 * fovAdjust2; for (var e : entities) { - Vec3 droneVec = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), entity.xo, entity.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), entity.yo + entity.getEyeHeight(), entity.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), entity.zo, entity.getZ())); - Vec3 pos = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.xo, e.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.zo, e.getZ())); + Vec3 droneVec = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), entity.xo, entity.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), entity.yo + entity.getEyeHeight(), entity.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), entity.zo, entity.getZ())); + Vec3 pos = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.xo, e.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.zo, e.getZ())); Vec3 lookAngle = entity.getLookAngle().normalize().scale(pos.distanceTo(droneVec) * (1 - 1.0 / zoom)); @@ -161,7 +164,7 @@ public class DroneUIOverlay { float x = (float) point.x; float y = (float) point.y; - RenderHelper.preciseBlit(event.getGuiGraphics(), FRAME, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); + RenderHelper.preciseBlit(guiGraphics, FRAME, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); poseStack.popPose(); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/GrenadeLauncherOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/GrenadeLauncherOverlay.java index 9a097d17c..57dbafbc9 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/GrenadeLauncherOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/GrenadeLauncherOverlay.java @@ -9,22 +9,28 @@ import com.atsuishio.superbwarfare.init.ModItems; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.CameraType; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; -@EventBusSubscriber(value = Dist.CLIENT) -public class GrenadeLauncherOverlay { +import javax.annotation.ParametersAreNonnullByDefault; - @SubscribeEvent - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); +@OnlyIn(Dist.CLIENT) +public class GrenadeLauncherOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("grenade_launcher"); + + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); Player player = Minecraft.getInstance().player; if (player == null) return; @@ -35,7 +41,6 @@ public class GrenadeLauncherOverlay { return; if (!shouldRenderCrossHair(player)) return; - GuiGraphics guiGraphics = event.getGuiGraphics(); guiGraphics.pose().pushPose(); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/HandsomeFrameOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/HandsomeFrameOverlay.java index d663c9ba3..553f9b633 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/HandsomeFrameOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/HandsomeFrameOverlay.java @@ -12,7 +12,10 @@ import com.atsuishio.superbwarfare.tools.SeekTool; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; @@ -21,25 +24,26 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.EventPriority; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; +import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; -@EventBusSubscriber(value = Dist.CLIENT) -public class HandsomeFrameOverlay { +@OnlyIn(Dist.CLIENT) +public class HandsomeFrameOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("handsome_frame"); private static final ResourceLocation FRAME = Mod.loc("textures/screens/frame/frame.png"); private static final ResourceLocation FRAME_WEAK = Mod.loc("textures/screens/frame/frame_weak.png"); private static final ResourceLocation FRAME_TARGET = Mod.loc("textures/screens/frame/frame_target.png"); private static final ResourceLocation FRAME_LOCK = Mod.loc("textures/screens/frame/frame_lock.png"); - @SubscribeEvent(priority = EventPriority.LOWEST) - public static void eventHandler(RenderGuiEvent.Pre event) { + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { Player player = Minecraft.getInstance().player; - PoseStack poseStack = event.getGuiGraphics().pose(); + PoseStack poseStack = guiGraphics.pose(); if (player != null) { ItemStack stack = player.getMainHandItem(); @@ -75,8 +79,8 @@ public class HandsomeFrameOverlay { } for (var e : allEntities) { - Vec3 playerVec = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.zo, player.getZ())); - Vec3 pos = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.xo, e.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.zo, e.getZ())); + Vec3 playerVec = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.zo, player.getZ())); + Vec3 pos = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.xo, e.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.zo, e.getZ())); Vec3 lookAngle = player.getLookAngle().normalize().scale(pos.distanceTo(playerVec) * (1 - 1.0 / zoom)); var cPos = playerVec.add(lookAngle); @@ -105,7 +109,7 @@ public class HandsomeFrameOverlay { icon = FRAME_WEAK; } - RenderHelper.preciseBlit(event.getGuiGraphics(), icon, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); + RenderHelper.preciseBlit(guiGraphics, icon, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); poseStack.popPose(); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/HelicopterHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/HelicopterHudOverlay.java index 098b50e9b..11d58ca76 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/HelicopterHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/HelicopterHudOverlay.java @@ -17,44 +17,48 @@ 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.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; 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.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.ClipContext; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.EventPriority; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; import org.joml.Math; import org.joml.Matrix4f; import org.joml.Vector4f; +import javax.annotation.ParametersAreNonnullByDefault; + import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; import static com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity.HEAT; -@EventBusSubscriber(value = Dist.CLIENT) -public class HelicopterHudOverlay { +@OnlyIn(Dist.CLIENT) +public class HelicopterHudOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("helicopter_hud"); private static float scopeScale = 1; private static float lerpVy = 1; private static float lerpPower = 1; - @SubscribeEvent(priority = EventPriority.LOWEST) - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); 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; @@ -72,7 +76,7 @@ public class HelicopterHudOverlay { 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().getGameTimeDeltaPartialTick(true), scopeScale, 1F); + scopeScale = Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), 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); @@ -82,18 +86,18 @@ public class HelicopterHudOverlay { if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) { preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/heli_base.png"), k, l, 0, 0.0F, i, j, i, j); - renderDriverAngle(guiGraphics, player, mobileVehicle, k, l, i, j, event.getPartialTick().getGameTimeDeltaPartialTick(true)); + renderDriverAngle(guiGraphics, player, mobileVehicle, k, l, i, j, deltaTracker.getGameTimeDeltaPartialTick(true)); preciseBlit(guiGraphics, Mod.loc("textures/screens/compass.png"), (float) w / 2 - 128, (float) 6, 128 + ((float) 64 / 45 * mobileVehicle.getYRot()), 0, 256, 16, 512, 16); poseStack.pushPose(); - poseStack.rotateAround(Axis.ZP.rotationDegrees(-iHelicopterEntity.getRotZ(event.getPartialTick().getGameTimeDeltaPartialTick(true))), w / 2f, h / 2f, 0); - float pitch = iHelicopterEntity.getRotX(event.getPartialTick().getGameTimeDeltaPartialTick(true)); + poseStack.rotateAround(Axis.ZP.rotationDegrees(-iHelicopterEntity.getRotZ(deltaTracker.getGameTimeDeltaPartialTick(true))), w / 2f, h / 2f, 0); + float pitch = iHelicopterEntity.getRotX(deltaTracker.getGameTimeDeltaPartialTick(true)); preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/heli_line.png"), (float) w / 2 - 128, (float) h / 2 - 512 - 5.475f * pitch, 0, 0, 256, 1024, 256, 1024); poseStack.popPose(); poseStack.pushPose(); - poseStack.rotateAround(Axis.ZP.rotationDegrees(iHelicopterEntity.getRotZ(event.getPartialTick().getGameTimeDeltaPartialTick(true))), w / 2f, h / 2f - 56, 0); + poseStack.rotateAround(Axis.ZP.rotationDegrees(iHelicopterEntity.getRotZ(deltaTracker.getGameTimeDeltaPartialTick(true))), w / 2f, h / 2f - 56, 0); preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/roll_ind.png"), (float) w / 2 - 8, (float) h / 2 - 88, 0, 0, 16, 16, 16, 16); poseStack.popPose(); @@ -105,9 +109,9 @@ public class HelicopterHudOverlay { ClipContext.Block.OUTLINE, ClipContext.Fluid.ANY, mobileVehicle)).getBlockPos()))); float power = iHelicopterEntity.getPower(); - lerpPower = Mth.lerp(0.001f * event.getPartialTick().getGameTimeDeltaPartialTick(true), lerpPower, power); + lerpPower = Mth.lerp(0.001f * deltaTracker.getGameTimeDeltaPartialTick(true), lerpPower, power); preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/heli_power.png"), (float) w / 2 + 130f, ((float) h / 2 - 64 + 124 - power * 980), 0, 0, 4, power * 980, 4, power * 980); - lerpVy = (float) Mth.lerp(0.021f * event.getPartialTick().getGameTimeDeltaPartialTick(true), lerpVy, mobileVehicle.getDeltaMovement().y()); + lerpVy = (float) Mth.lerp(0.021f * deltaTracker.getGameTimeDeltaPartialTick(true), lerpVy, mobileVehicle.getDeltaMovement().y()); preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/heli_vy_move.png"), (float) w / 2 + 138, ((float) h / 2 - 3 - Math.max(lerpVy * 20, -24) * 2.5f), 0, 0, 8, 8, 8, 8); guiGraphics.drawString(Minecraft.getInstance().font, Component.literal(FormatTool.format0D(lerpVy * 20, "m/s")), w / 2 + 146, (int) (h / 2 - 3 - Math.max(lerpVy * 20, -24) * 2.5), (lerpVy * 20 < -24 || ((lerpVy * 20 < -10 || (lerpVy * 20 < -1 && length(mobileVehicle.getDeltaMovement().x, mobileVehicle.getDeltaMovement().y, mobileVehicle.getDeltaMovement().z) * 72 > 100)) && height < 36) || (length(mobileVehicle.getDeltaMovement().x, mobileVehicle.getDeltaMovement().y, mobileVehicle.getDeltaMovement().z) * 72 > 40 && blockInWay < 72) ? -65536 : 0x66FF00), false); @@ -148,7 +152,7 @@ public class HelicopterHudOverlay { } - Matrix4f transform = getVehicleTransform(mobileVehicle, event.getPartialTick().getGameTimeDeltaPartialTick(true)); + Matrix4f transform = getVehicleTransform(mobileVehicle, deltaTracker.getGameTimeDeltaPartialTick(true)); float x0 = 0f; float y0 = 0.65f; float z0 = 0.8f; @@ -158,12 +162,12 @@ public class HelicopterHudOverlay { float fovAdjust2 = (float) (Minecraft.getInstance().options.fov().get() / 30) - 1; double zoom = 0.96 * 3 + 0.06 * fovAdjust2; - Vec3 pos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).add(mobileVehicle.getViewVector(event.getPartialTick().getGameTimeDeltaPartialTick(true)).scale(192)); + Vec3 pos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).add(mobileVehicle.getViewVector(deltaTracker.getGameTimeDeltaPartialTick(true)).scale(192)); Vec3 lookAngle = player.getLookAngle().normalize().scale(pos.distanceTo(cameraPos) * (1 - 1.0 / zoom)); var cPos = cameraPos.add(lookAngle); - Vec3 p = RenderHelper.worldToScreen(new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).add(mobileVehicle.getViewVector(event.getPartialTick().getGameTimeDeltaPartialTick(true)).scale(192)), ClientEventHandler.zoomVehicle ? cPos : cameraPos); + Vec3 p = RenderHelper.worldToScreen(new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).add(mobileVehicle.getViewVector(deltaTracker.getGameTimeDeltaPartialTick(true)).scale(192)), ClientEventHandler.zoomVehicle ? cPos : cameraPos); if (p != null) { poseStack.pushPose(); @@ -176,7 +180,7 @@ public class HelicopterHudOverlay { renderKillIndicator(guiGraphics, x - 7.5f + (float) (2 * (Math.random() - 0.5f)), y - 7.5f + (float) (2 * (Math.random() - 0.5f))); } else if (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK) { poseStack.pushPose(); - poseStack.rotateAround(Axis.ZP.rotationDegrees(iHelicopterEntity.getRotZ(event.getPartialTick().getGameTimeDeltaPartialTick(true))), x, y, 0); + poseStack.rotateAround(Axis.ZP.rotationDegrees(iHelicopterEntity.getRotZ(deltaTracker.getGameTimeDeltaPartialTick(true))), x, y, 0); preciseBlit(guiGraphics, Mod.loc("textures/screens/drone.png"), x - 8, y - 8, 0, 0, 16, 16, 16, 16); renderKillIndicator(guiGraphics, x - 7.5f + (float) (2 * (Math.random() - 0.5f)), y - 7.5f + (float) (2 * (Math.random() - 0.5f))); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/JavelinHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/JavelinHudOverlay.java index 48f1ab66e..471073e14 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/JavelinHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/JavelinHudOverlay.java @@ -12,7 +12,10 @@ import com.atsuishio.superbwarfare.tools.SeekTool; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; @@ -22,29 +25,30 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.EventPriority; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; +import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; -@EventBusSubscriber(value = Dist.CLIENT) -public class JavelinHudOverlay { +@OnlyIn(Dist.CLIENT) +public class JavelinHudOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("javelin_hud"); private static final ResourceLocation FRAME = Mod.loc("textures/screens/frame/frame.png"); private static final ResourceLocation FRAME_TARGET = Mod.loc("textures/screens/frame/frame_target.png"); private static final ResourceLocation FRAME_LOCK = Mod.loc("textures/screens/frame/frame_lock.png"); private static float scopeScale = 1; - @SubscribeEvent(priority = EventPriority.LOWEST) - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); Player player = Minecraft.getInstance().player; - PoseStack poseStack = event.getGuiGraphics().pose(); + PoseStack poseStack = guiGraphics.pose(); if (player != null) { ItemStack stack = player.getMainHandItem(); @@ -76,15 +80,15 @@ public class JavelinHudOverlay { float l = ((h - j) / 2) + moveY; float i1 = k + i; float j1 = l + j; - preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/javelin/javelin_hud.png"), k, l, 0, 0.0F, i, j, i, j); - preciseBlit(event.getGuiGraphics(), Mod.loc(tag.getBoolean("TopMode") ? "textures/screens/javelin/top.png" : "textures/screens/javelin/dir.png"), k, l, 0, 0.0F, i, j, i, j); - preciseBlit(event.getGuiGraphics(), Mod.loc(data.ammo() > 0 ? "textures/screens/javelin/missile_green.png" : "textures/screens/javelin/missile_red.png"), k, l, 0, 0.0F, i, j, i, j); + preciseBlit(guiGraphics, Mod.loc("textures/screens/javelin/javelin_hud.png"), k, l, 0, 0.0F, i, j, i, j); + preciseBlit(guiGraphics, Mod.loc(tag.getBoolean("TopMode") ? "textures/screens/javelin/top.png" : "textures/screens/javelin/dir.png"), k, l, 0, 0.0F, i, j, i, j); + preciseBlit(guiGraphics, Mod.loc(data.ammo() > 0 ? "textures/screens/javelin/missile_green.png" : "textures/screens/javelin/missile_red.png"), k, l, 0, 0.0F, i, j, i, j); if (tag.getInt("SeekTime") > 1 && tag.getInt("SeekTime") < 20) { - preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/javelin/seek.png"), k, l, 0, 0.0F, i, j, i, j); + preciseBlit(guiGraphics, Mod.loc("textures/screens/javelin/seek.png"), k, l, 0, 0.0F, i, j, i, j); } - event.getGuiGraphics().fill(RenderType.guiOverlay(), 0, (int) l, (int) k + 3, (int) j1, -90, -16777216); - event.getGuiGraphics().fill(RenderType.guiOverlay(), (int) i1, (int) l, w, (int) j1, -90, -16777216); + guiGraphics.fill(RenderType.guiOverlay(), 0, (int) l, (int) k + 3, (int) j1, -90, -16777216); + guiGraphics.fill(RenderType.guiOverlay(), (int) i1, (int) l, w, (int) j1, -90, -16777216); RenderSystem.depthMask(true); RenderSystem.defaultBlendFunc(); RenderSystem.enableDepthTest(); @@ -101,11 +105,11 @@ public class JavelinHudOverlay { double zoom = Minecraft.getInstance().options.fov().get() / ClientEventHandler.fov + 0.5 * fovAdjust2; - Vec3 playerVec = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.zo, player.getZ())); + Vec3 playerVec = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.zo, player.getZ())); if (tag.getInt("GuideType") == 0) { for (var e : entities) { - Vec3 pos = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.xo, e.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.zo, e.getZ())); + Vec3 pos = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.xo, e.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.zo, e.getZ())); Vec3 lookAngle = player.getLookAngle().normalize().scale(pos.distanceTo(playerVec) * (1 - 1.0 / zoom)); var cPos = playerVec.add(lookAngle); @@ -119,7 +123,7 @@ public class JavelinHudOverlay { float x = (float) point.x; float y = (float) point.y; - RenderHelper.preciseBlit(event.getGuiGraphics(), lockOn ? FRAME_LOCK : nearest ? FRAME_TARGET : FRAME, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); + RenderHelper.preciseBlit(guiGraphics, lockOn ? FRAME_LOCK : nearest ? FRAME_TARGET : FRAME, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); poseStack.popPose(); } } else { @@ -136,7 +140,7 @@ public class JavelinHudOverlay { float x = (float) point.x; float y = (float) point.y; - RenderHelper.preciseBlit(event.getGuiGraphics(), lockOn ? FRAME_LOCK : FRAME_TARGET, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); + RenderHelper.preciseBlit(guiGraphics, lockOn ? FRAME_LOCK : FRAME_TARGET, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24); poseStack.popPose(); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/KillMessageOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/KillMessageOverlay.java index dd39e69f9..10ea42814 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/KillMessageOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/KillMessageOverlay.java @@ -12,26 +12,30 @@ import com.atsuishio.superbwarfare.tools.DamageTypeTool; import com.atsuishio.superbwarfare.tools.PlayerKillRecord; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.Nullable; import top.theillusivec4.curios.api.CuriosApi; +import javax.annotation.ParametersAreNonnullByDefault; import java.util.concurrent.atomic.AtomicReference; import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; -@EventBusSubscriber(value = Dist.CLIENT) -public class KillMessageOverlay { +@OnlyIn(Dist.CLIENT) +public class KillMessageOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("kill_message"); private static final ResourceLocation HEADSHOT = Mod.loc("textures/screens/damage_types/headshot.png"); @@ -50,8 +54,9 @@ public class KillMessageOverlay { private static final ResourceLocation WORLD_PEACE_STAFF = Mod.loc("textures/gun_icon/compat/world_peace_staff.png"); - @SubscribeEvent - public static void onRenderGui(RenderGuiEvent.Pre event) { + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { if (!KillMessageConfig.SHOW_KILL_MESSAGE.get()) { return; } @@ -88,12 +93,12 @@ public class KillMessageOverlay { } for (PlayerKillRecord r : KillMessageHandler.QUEUE) { - totalTop = renderKillMessages(r, event, totalTop); + totalTop = renderKillMessages(r, guiGraphics, deltaTracker, totalTop); } } - private static float renderKillMessages(PlayerKillRecord record, RenderGuiEvent.Pre event, float baseTop) { - int w = event.getGuiGraphics().guiWidth(); + private static float renderKillMessages(PlayerKillRecord record, GuiGraphics guiGraphics, DeltaTracker deltaTracker, float baseTop) { + int w = guiGraphics.guiWidth(); float top = baseTop; Font font = Minecraft.getInstance().font; @@ -107,8 +112,7 @@ public class KillMessageOverlay { int targetNameWidth = font.width(targetName.get()); - var gui = event.getGuiGraphics(); - gui.pose().pushPose(); + guiGraphics.pose().pushPose(); RenderSystem.disableDepthTest(); RenderSystem.depthMask(false); @@ -120,15 +124,15 @@ public class KillMessageOverlay { // 入场效果 if (record.tick < 3) { - gui.pose().translate((3 - record.tick - event.getPartialTick().getGameTimeDeltaPartialTick(true)) * 33, 0, 0); + guiGraphics.pose().translate((3 - record.tick - deltaTracker.getGameTimeDeltaPartialTick(true)) * 33, 0, 0); } // 4s后开始消失 if (record.tick >= 80) { int animationTickCount = record.fastRemove ? 2 : 20; - float rate = (float) Math.pow((record.tick + event.getPartialTick().getGameTimeDeltaPartialTick(true) - 80) / animationTickCount, 5); - gui.pose().translate(rate * 100, 0, 0); - gui.setColor(1, 1, 1, 1 - rate); + float rate = (float) Math.pow((record.tick + deltaTracker.getGameTimeDeltaPartialTick(true) - 80) / animationTickCount, 5); + guiGraphics.pose().translate(rate * 100, 0, 0); + guiGraphics.setColor(1, 1, 1, 1 - rate); baseTop += 10 * (1 - rate); } else { baseTop += 10; @@ -137,7 +141,7 @@ public class KillMessageOverlay { // 击杀提示是右对齐的,这里从右向左渲染 // 渲染被击杀者名称 - gui.drawString( + guiGraphics.drawString( Minecraft.getInstance().font, targetName.get(), w - targetNameWidth - 10f, @@ -152,7 +156,7 @@ public class KillMessageOverlay { ResourceLocation damageTypeIcon = getDamageTypeIcon(record); if (damageTypeIcon != null) { - preciseBlit(gui, + preciseBlit(guiGraphics, damageTypeIcon, damageTypeIconW, top - 2, @@ -176,7 +180,7 @@ public class KillMessageOverlay { ResourceLocation resourceLocation = vehicleEntity.getVehicleIcon(); - preciseBlit(gui, + preciseBlit(guiGraphics, resourceLocation, itemIconW, top, @@ -193,7 +197,7 @@ public class KillMessageOverlay { ResourceLocation resourceLocation = gunItem.getGunIcon(); - preciseBlit(gui, + preciseBlit(guiGraphics, resourceLocation, itemIconW, top, @@ -213,7 +217,7 @@ public class KillMessageOverlay { ResourceLocation resourceLocation = gunItem.getGunIcon(); - preciseBlit(gui, + preciseBlit(guiGraphics, resourceLocation, itemIconW, top, @@ -230,7 +234,7 @@ public class KillMessageOverlay { if (record.stack.getItem().getDescriptionId().equals("item.dreamaticvoyage.world_peace_staff")) { renderItem = true; - preciseBlit(gui, + preciseBlit(guiGraphics, WORLD_PEACE_STAFF, itemIconW, top, @@ -259,7 +263,7 @@ public class KillMessageOverlay { nameW -= 18; } - gui.drawString( + guiGraphics.drawString( Minecraft.getInstance().font, attackerName.get(), nameW, @@ -273,8 +277,8 @@ public class KillMessageOverlay { RenderSystem.depthMask(true); RenderSystem.enableDepthTest(); - gui.setColor(1, 1, 1, 1); - gui.pose().popPose(); + guiGraphics.setColor(1, 1, 1, 1); + guiGraphics.pose().popPose(); return baseTop; } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/MortarInfoOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/MortarInfoOverlay.java index 9ec88e854..3de316804 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/MortarInfoOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/MortarInfoOverlay.java @@ -1,38 +1,46 @@ package com.atsuishio.superbwarfare.client.overlay; +import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.client.gui.RangeHelper; import com.atsuishio.superbwarfare.entity.MortarEntity; import com.atsuishio.superbwarfare.tools.FormatTool; import com.atsuishio.superbwarfare.tools.TraceTool; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; -@EventBusSubscriber(value = Dist.CLIENT) -public class MortarInfoOverlay { +import javax.annotation.ParametersAreNonnullByDefault; - @SubscribeEvent - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); +@OnlyIn(Dist.CLIENT) +public class MortarInfoOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("mortar_info"); + + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); Player player = Minecraft.getInstance().player; Entity lookingEntity = null; if (player != null) { lookingEntity = TraceTool.findLookingEntity(player, 6); } if (lookingEntity instanceof MortarEntity mortar) { - event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.pitch") + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.pitch") .append(Component.literal(FormatTool.format1D(-mortar.getXRot(), "°"))), w / 2 - 90, h / 2 - 26, -1, false); - event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.yaw") + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.yaw") .append(Component.literal(FormatTool.format1D(mortar.getYRot(), "°"))), w / 2 - 90, h / 2 - 16, -1, false); - event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.range") + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.range") .append(Component.literal(FormatTool.format1D((int) RangeHelper.getRange(-mortar.getXRot(), 11.4, 0.146), "m"))), w / 2 - 90, h / 2 - 6, -1, false); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/RedTriangleOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/RedTriangleOverlay.java index b24db1d1e..9e8ecc5b6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/RedTriangleOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/RedTriangleOverlay.java @@ -7,7 +7,10 @@ import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.tools.SeekTool; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -15,19 +18,22 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; -@EventBusSubscriber(value = Dist.CLIENT) -public class RedTriangleOverlay { +import javax.annotation.ParametersAreNonnullByDefault; + +@OnlyIn(Dist.CLIENT) +public class RedTriangleOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("red_triangle"); private static final ResourceLocation TRIANGLE = Mod.loc("textures/screens/red_triangle.png"); - @SubscribeEvent - public static void eventHandler(RenderGuiEvent.Pre event) { + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { Minecraft mc = Minecraft.getInstance(); - PoseStack poseStack = event.getGuiGraphics().pose(); + PoseStack poseStack = guiGraphics.pose(); Player player = mc.player; if (player == null) return; @@ -39,9 +45,9 @@ public class RedTriangleOverlay { Entity idf = SeekTool.seekLivingEntity(player, player.level(), 128, 6); if (idf == null) return; - Vec3 playerVec = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.zo, player.getZ())); + Vec3 playerVec = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.zo, player.getZ())); double distance = idf.position().distanceTo(playerVec); - Vec3 pos = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), idf.xo, idf.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), idf.yo + idf.getEyeHeight() + 0.5 + 0.07 * distance, idf.getEyeY() + 0.5 + 0.07 * distance), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), idf.zo, idf.getZ())); + Vec3 pos = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), idf.xo, idf.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), idf.yo + idf.getEyeHeight() + 0.5 + 0.07 * distance, idf.getEyeY() + 0.5 + 0.07 * distance), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), idf.zo, idf.getZ())); Vec3 point = RenderHelper.worldToScreen(pos, playerVec); if (point == null) return; @@ -49,7 +55,7 @@ public class RedTriangleOverlay { float x = (float) point.x; float y = (float) point.y; - RenderHelper.preciseBlit(event.getGuiGraphics(), TRIANGLE, x - 4, y - 4, 8, 8, 0, 0, 8, 8, 8, 8); + RenderHelper.preciseBlit(guiGraphics, TRIANGLE, x - 4, y - 4, 8, 8, 0, 0, 8, 8, 8, 8); RenderSystem.depthMask(true); RenderSystem.defaultBlendFunc(); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/SpyglassRangeOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/SpyglassRangeOverlay.java index d68dc3362..1eac9cafe 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/SpyglassRangeOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/SpyglassRangeOverlay.java @@ -1,9 +1,14 @@ package com.atsuishio.superbwarfare.client.overlay; +import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.tools.FormatTool; import com.atsuishio.superbwarfare.tools.TraceTool; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Items; @@ -11,17 +16,20 @@ import net.minecraft.world.level.ClipContext; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; -@EventBusSubscriber(value = Dist.CLIENT) -public class SpyglassRangeOverlay { +import javax.annotation.ParametersAreNonnullByDefault; - @SubscribeEvent - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); +@OnlyIn(Dist.CLIENT) +public class SpyglassRangeOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("spyglass_range"); + + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); Player player = Minecraft.getInstance().player; if (player != null && (player.getMainHandItem().getItem() == Items.SPYGLASS || player.getOffhandItem().getItem() == Items.SPYGLASS) && player.isUsingItem()) { boolean lookAtEntity = false; @@ -41,15 +49,15 @@ public class SpyglassRangeOverlay { } if (lookAtEntity) { - event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range") + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range") .append(Component.literal(FormatTool.format1D(entityRange, "M ") + lookingEntity.getDisplayName().getString())), w / 2 + 12, h / 2 - 28, -1, false); } else { if (blockRange > 500) { - event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range") + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range") .append(Component.literal("---M")), w / 2 + 12, h / 2 - 28, -1, false); } else { - event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range") + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range") .append(Component.literal(FormatTool.format1D(blockRange, "M"))), w / 2 + 12, h / 2 - 28, -1, false); } 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 3743dc2a2..159cddf1d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java @@ -22,8 +22,10 @@ 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.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -36,13 +38,11 @@ import net.minecraft.world.level.ClipContext; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.EventPriority; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; import org.joml.Math; import top.theillusivec4.curios.api.CuriosApi; +import javax.annotation.ParametersAreNonnullByDefault; import java.util.concurrent.atomic.AtomicReference; import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; @@ -51,8 +51,10 @@ import static com.atsuishio.superbwarfare.entity.vehicle.Bmp2Entity.LOADED_MISSI import static com.atsuishio.superbwarfare.entity.vehicle.Bmp2Entity.MISSILE_COUNT; import static com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity.*; -@EventBusSubscriber(value = Dist.CLIENT) -public class VehicleHudOverlay { +@OnlyIn(Dist.CLIENT) +public class VehicleHudOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("vehicle_hud"); private static float scopeScale = 1; private static final ResourceLocation FRAME = Mod.loc("textures/screens/land/tv_frame.png"); @@ -73,10 +75,11 @@ public class VehicleHudOverlay { private static final AnimationTimer weaponIndexUpdateTimer = new AnimationTimer(ANIMATION_TIME).animation(AnimationCurves.EASE_OUT_CIRC); - @SubscribeEvent(priority = EventPriority.HIGH) - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); Player player = Minecraft.getInstance().player; if (!shouldRenderHud(player)) { @@ -86,7 +89,6 @@ public class VehicleHudOverlay { Entity vehicle = player.getVehicle(); - GuiGraphics guiGraphics = event.getGuiGraphics(); PoseStack poseStack = guiGraphics.pose(); poseStack.pushPose(); @@ -99,7 +101,7 @@ public class VehicleHudOverlay { RenderSystem.setShaderColor(1, 1, 1, 1); // 渲染地面武装HUD - renderLandArmorHud(event, w, h); + renderLandArmorHud(guiGraphics, deltaTracker, w, h); int compatHeight = getArmorPlateCompatHeight(player); @@ -138,10 +140,9 @@ public class VehicleHudOverlay { return 9; } - public static void renderLandArmorHud(RenderGuiEvent.Pre event, int w, int h) { + public static void renderLandArmorHud(GuiGraphics guiGraphics, DeltaTracker deltaTracker, int w, int h) { Minecraft mc = Minecraft.getInstance(); Player player = mc.player; - GuiGraphics guiGraphics = event.getGuiGraphics(); PoseStack poseStack = guiGraphics.pose(); Camera camera = mc.gameRenderer.getMainCamera(); Vec3 cameraPos = camera.getPosition(); @@ -165,7 +166,7 @@ public class VehicleHudOverlay { 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().getGameTimeDeltaPartialTick(true), scopeScale, 1F); + scopeScale = Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), 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); @@ -210,7 +211,7 @@ public class VehicleHudOverlay { // 炮塔方向 poseStack.pushPose(); - poseStack.rotateAround(Axis.ZP.rotationDegrees(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), iLand.turretYRotO(), iLand.turretYRot())), w / 2f + 112, h - 56, 0); + poseStack.rotateAround(Axis.ZP.rotationDegrees(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), iLand.turretYRotO(), iLand.turretYRot())), w / 2f + 112, h - 56, 0); preciseBlit(guiGraphics, Mod.loc("textures/screens/land/body.png"), w / 2f + 96, h - 72, 0, 0.0F, 32, 32, 32, 32); poseStack.popPose(); @@ -300,7 +301,7 @@ public class VehicleHudOverlay { renderKillIndicator(guiGraphics, w, h); } else if (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK && !ClientEventHandler.zoomVehicle) { - Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.zo, player.getZ())).add(iLand.getBarrelVec(event.getPartialTick().getGameTimeDeltaPartialTick(true)).scale(192)), cameraPos); + Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.zo, player.getZ())).add(iLand.getBarrelVec(deltaTracker.getGameTimeDeltaPartialTick(true)).scale(192)), cameraPos); // 第三人称准星 if (p != null) { poseStack.pushPose(); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleMgHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleMgHudOverlay.java index 0cfe60d19..22f4b35fd 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleMgHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleMgHudOverlay.java @@ -15,36 +15,41 @@ 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.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; 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.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; import org.joml.Math; +import javax.annotation.ParametersAreNonnullByDefault; + import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; import static com.atsuishio.superbwarfare.client.overlay.VehicleHudOverlay.renderKillIndicator3P; import static com.atsuishio.superbwarfare.entity.vehicle.Yx100Entity.MG_AMMO; import static com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity.AMMO; import static com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity.HEAT; -@EventBusSubscriber(value = Dist.CLIENT) -public class VehicleMgHudOverlay { +@OnlyIn(Dist.CLIENT) +public class VehicleMgHudOverlay implements LayeredDraw.Layer { - @SubscribeEvent - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); + public static final ResourceLocation ID = Mod.loc("vehicle_mg_hud"); + + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); Minecraft mc = Minecraft.getInstance(); Player player = mc.player; - GuiGraphics guiGraphics = event.getGuiGraphics(); PoseStack poseStack = guiGraphics.pose(); Camera camera = mc.gameRenderer.getMainCamera(); Vec3 cameraPos = camera.getPosition(); @@ -74,8 +79,8 @@ public class VehicleMgHudOverlay { RenderHelper.preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_crosshair_notzoom.png"), k, l, 0, 0.0F, i, j, i, j); VehicleHudOverlay.renderKillIndicator(guiGraphics, w, h); } else if (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK && !ClientEventHandler.zoomVehicle) { - Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), - Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.zo, player.getZ())).add(iLand.getGunVec(event.getPartialTick().getGameTimeDeltaPartialTick(true)).scale(192)), cameraPos); + Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), + Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.zo, player.getZ())).add(iLand.getGunVec(deltaTracker.getGameTimeDeltaPartialTick(true)).scale(192)), cameraPos); // 第三人称准星 if (p != null) { diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleTeamOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleTeamOverlay.java index 89b37329f..2b955fb7a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleTeamOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleTeamOverlay.java @@ -1,27 +1,35 @@ package com.atsuishio.superbwarfare.client.overlay; +import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.tools.FormatTool; import com.atsuishio.superbwarfare.tools.TraceTool; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; -@EventBusSubscriber(value = Dist.CLIENT) -public class VehicleTeamOverlay { +import javax.annotation.ParametersAreNonnullByDefault; - @SubscribeEvent - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); +@OnlyIn(Dist.CLIENT) +public class VehicleTeamOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("vehicle_team"); + + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); Player player = Minecraft.getInstance().player; - PoseStack poseStack = event.getGuiGraphics().pose(); + PoseStack poseStack = guiGraphics.pose(); if (player == null) return; boolean lookAtEntity = false; @@ -38,14 +46,14 @@ public class VehicleTeamOverlay { poseStack.pushPose(); poseStack.scale(0.8f, 0.8f, 1); if (lookingEntity.getFirstPassenger() instanceof Player passenger) { - event.getGuiGraphics().drawString(Minecraft.getInstance().font, + guiGraphics.drawString(Minecraft.getInstance().font, Component.literal(passenger.getDisplayName().getString() + (passenger.getTeam() == null ? "" : " <" + (passenger.getTeam().getName()) + ">")), w / 2 + 90, h / 2 - 4, passenger.getTeamColor(), false); - event.getGuiGraphics().drawString(Minecraft.getInstance().font, + guiGraphics.drawString(Minecraft.getInstance().font, Component.literal(lookingEntity.getDisplayName().getString() + " " + FormatTool.format1D(entityRange, "m")), w / 2 + 90, h / 2 + 5, passenger.getTeamColor(), false); } else { - event.getGuiGraphics().drawString(Minecraft.getInstance().font, + guiGraphics.drawString(Minecraft.getInstance().font, Component.literal(lookingEntity.getDisplayName().getString() + " " + FormatTool.format1D(entityRange, "M")), w / 2 + 90, h / 2 + 5, -1, false); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/Yx100SwarmDroneHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/Yx100SwarmDroneHudOverlay.java index 0142de67d..ae7a0af07 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/Yx100SwarmDroneHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/Yx100SwarmDroneHudOverlay.java @@ -9,8 +9,10 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.CameraType; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; @@ -18,23 +20,25 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; +import net.neoforged.api.distmarker.OnlyIn; import org.joml.Math; -@EventBusSubscriber(modid = Mod.MODID, value = Dist.CLIENT) -public class Yx100SwarmDroneHudOverlay { +import javax.annotation.ParametersAreNonnullByDefault; + +@OnlyIn(Dist.CLIENT) +public class Yx100SwarmDroneHudOverlay implements LayeredDraw.Layer { + + public static final ResourceLocation ID = Mod.loc("yx100_swarm_drone_hud"); private static final ResourceLocation FRAME = Mod.loc("textures/screens/frame/frame.png"); private static final ResourceLocation FRAME_LOCK = Mod.loc("textures/screens/frame/frame_lock.png"); - @SubscribeEvent - public static void eventHandler(RenderGuiEvent.Pre event) { - int w = event.getGuiGraphics().guiWidth(); - int h = event.getGuiGraphics().guiHeight(); + @Override + @ParametersAreNonnullByDefault + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + int w = guiGraphics.guiWidth(); + int h = guiGraphics.guiHeight(); Minecraft mc = Minecraft.getInstance(); Player player = mc.player; - GuiGraphics guiGraphics = event.getGuiGraphics(); PoseStack poseStack = guiGraphics.pose(); if (!shouldRenderCrossHair(player)) return; @@ -72,8 +76,8 @@ public class Yx100SwarmDroneHudOverlay { } if (naerestEntity != null) { - Vec3 playerVec = new Vec3(Mth.lerp(event.getPartialTick().getRealtimeDeltaTicks(), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getRealtimeDeltaTicks(), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(event.getPartialTick().getRealtimeDeltaTicks(), player.zo, player.getZ())); - Vec3 pos = new Vec3(Mth.lerp(event.getPartialTick().getRealtimeDeltaTicks(), naerestEntity.xo, naerestEntity.getX()), Mth.lerp(event.getPartialTick().getRealtimeDeltaTicks(), naerestEntity.yo + naerestEntity.getEyeHeight(), naerestEntity.getEyeY()), Mth.lerp(event.getPartialTick().getRealtimeDeltaTicks(), naerestEntity.zo, naerestEntity.getZ())); + Vec3 playerVec = new Vec3(Mth.lerp(deltaTracker.getRealtimeDeltaTicks(), player.xo, player.getX()), Mth.lerp(deltaTracker.getRealtimeDeltaTicks(), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(deltaTracker.getRealtimeDeltaTicks(), player.zo, player.getZ())); + Vec3 pos = new Vec3(Mth.lerp(deltaTracker.getRealtimeDeltaTicks(), naerestEntity.xo, naerestEntity.getX()), Mth.lerp(deltaTracker.getRealtimeDeltaTicks(), naerestEntity.yo + naerestEntity.getEyeHeight(), naerestEntity.getEyeY()), Mth.lerp(deltaTracker.getRealtimeDeltaTicks(), naerestEntity.zo, naerestEntity.getZ())); Vec3 lookAngle = player.getLookAngle().normalize().scale(pos.distanceTo(playerVec) * (1 - 1.0 / zoom)); var cPos = playerVec.add(lookAngle); diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/receive/SimulationDistanceMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/receive/SimulationDistanceMessage.java index b7dfc0abb..cde1083cc 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/receive/SimulationDistanceMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/receive/SimulationDistanceMessage.java @@ -1,7 +1,7 @@ package com.atsuishio.superbwarfare.network.message.receive; import com.atsuishio.superbwarfare.Mod; -import com.atsuishio.superbwarfare.client.overlay.DroneUIOverlay; +import com.atsuishio.superbwarfare.client.overlay.DroneHudOverlay; import io.netty.buffer.ByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; @@ -19,7 +19,7 @@ public record SimulationDistanceMessage(int distance) implements CustomPacketPay ); public static void handler(SimulationDistanceMessage message, final IPayloadContext context) { - DroneUIOverlay.MAX_DISTANCE = message.distance * 16; + DroneHudOverlay.MAX_DISTANCE = message.distance * 16; } @Override