From 6178b87a9a13070d4be1d23ec228b483101c9650 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Tue, 21 May 2024 18:22:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9E=82=E7=9B=B4=E6=96=B9?= =?UTF-8?q?=E5=90=91=E6=B6=88=E5=A4=B1=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/screens/CrossHairOverlay.java | 27 +------------ .../client/screens/KillMessageOverlay.java | 39 ++++++++++++------- .../net/mcreator/target/tools/RenderTool.java | 32 +++++++++++++++ 3 files changed, 58 insertions(+), 40 deletions(-) create mode 100644 src/main/java/net/mcreator/target/tools/RenderTool.java diff --git a/src/main/java/net/mcreator/target/client/screens/CrossHairOverlay.java b/src/main/java/net/mcreator/target/client/screens/CrossHairOverlay.java index c1bc1c8f0..a0f190736 100644 --- a/src/main/java/net/mcreator/target/client/screens/CrossHairOverlay.java +++ b/src/main/java/net/mcreator/target/client/screens/CrossHairOverlay.java @@ -2,14 +2,12 @@ package net.mcreator.target.client.screens; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; import net.mcreator.target.init.TargetModAttributes; import net.mcreator.target.init.TargetModItems; import net.mcreator.target.init.TargetModTags; import net.mcreator.target.network.TargetModVariables; 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.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; @@ -18,7 +16,8 @@ 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.Matrix4f; + +import static net.mcreator.target.tools.RenderTool.preciseBlit; @Mod.EventBusSubscriber({Dist.CLIENT}) public class CrossHairOverlay { @@ -84,28 +83,6 @@ public class CrossHairOverlay { RenderSystem.setShaderColor(1, 1, 1, 1); } - private static void preciseBlit(GuiGraphics gui, ResourceLocation pAtlasLocation, float pX, float pY, float pUOffset, float pVOffset, float pWidth, float pHeight, float pTextureWidth, float pTextureHeight) { - float pX2 = pX + pWidth; - float pY2 = pY + pHeight; - float pBlitOffset = 0; - - float pMinU = pUOffset / pTextureWidth; - float pMaxU = (pUOffset + pWidth) / pTextureWidth; - float pMinV = pVOffset / pTextureHeight; - float pMaxV = (pVOffset + pHeight) / pTextureHeight; - - RenderSystem.setShaderTexture(0, pAtlasLocation); - RenderSystem.setShader(GameRenderer::getPositionTexShader); - Matrix4f matrix4f = gui.pose().last().pose(); - BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); - bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); - bufferbuilder.vertex(matrix4f, pX, pY, pBlitOffset).uv(pMinU, pMinV).endVertex(); - bufferbuilder.vertex(matrix4f, pX, pY2, pBlitOffset).uv(pMinU, pMaxV).endVertex(); - bufferbuilder.vertex(matrix4f, pX2, pY2, pBlitOffset).uv(pMaxU, pMaxV).endVertex(); - bufferbuilder.vertex(matrix4f, pX2, pY, pBlitOffset).uv(pMaxU, pMinV).endVertex(); - BufferUploader.drawWithShader(bufferbuilder.end()); - } - private static boolean shouldRenderCrosshair(Player player) { if (player == null) return false; diff --git a/src/main/java/net/mcreator/target/client/screens/KillMessageOverlay.java b/src/main/java/net/mcreator/target/client/screens/KillMessageOverlay.java index a719b8fef..eb797a063 100644 --- a/src/main/java/net/mcreator/target/client/screens/KillMessageOverlay.java +++ b/src/main/java/net/mcreator/target/client/screens/KillMessageOverlay.java @@ -25,6 +25,8 @@ import top.theillusivec4.curios.api.CuriosApi; import java.util.concurrent.atomic.AtomicReference; +import static net.mcreator.target.tools.RenderTool.preciseBlit; + @Mod.EventBusSubscriber(value = Dist.CLIENT) public class KillMessageOverlay { private static final ResourceLocation HEADSHOT = new ResourceLocation(TargetMod.MODID, "textures/screens/damage_types/headshot.png"); @@ -51,17 +53,16 @@ public class KillMessageOverlay { return; } - int index = 0; + float totalTop = 5; for (PlayerKillRecord record : KillMessageHandler.QUEUE) { - renderKillMessages(record, event, index); - index++; + totalTop = renderKillMessages(record, event, totalTop); } } - private static void renderKillMessages(PlayerKillRecord record, RenderGuiEvent.Pre event, int index) { + private static float renderKillMessages(PlayerKillRecord record, RenderGuiEvent.Pre event, float baseTop) { int w = event.getWindow().getGuiScaledWidth(); - int h = 10 + index * 10; + float top = baseTop; Font font = Minecraft.getInstance().font; @@ -100,9 +101,12 @@ public class KillMessageOverlay { // 4s后开始消失 if (record.tick >= 80) { - double rate = Math.pow((record.tick + event.getPartialTick() - 80) / 20, 5); + float rate = (float) Math.pow((record.tick + event.getPartialTick() - 80) / 20, 5); gui.pose().translate(rate * 100, 0, 0); - gui.setColor(1, 1, 1, (float) (1 - rate)); + gui.setColor(1, 1, 1, 1 - rate); + baseTop += 10 * (1 - rate); + } else { + baseTop += 10; } // 击杀提示是右对齐的,这里从右向左渲染 @@ -112,7 +116,7 @@ public class KillMessageOverlay { Minecraft.getInstance().font, targetName.get(), w - targetNameWidth - 10f, - h, + top, record.target.getTeamColor(), false ); @@ -123,9 +127,10 @@ public class KillMessageOverlay { ResourceLocation damageTypeIcon = getDamageTypeIcon(record); if (damageTypeIcon != null) { - gui.blit(damageTypeIcon, + preciseBlit(gui, + damageTypeIcon, damageTypeIconW, - h - 2, + top - 2, 0, 0, 12, @@ -143,9 +148,10 @@ public class KillMessageOverlay { ResourceLocation resourceLocation = gunItem.getGunIcon(); - gui.blit(resourceLocation, + preciseBlit(gui, + resourceLocation, itemIconW, - h, + top, 0, 0, 32, @@ -159,9 +165,10 @@ public class KillMessageOverlay { if (record.stack.getItem().getDescriptionId().equals("item.dreamaticvoyage.world_peace_staff")) { renderItem = true; - gui.blit(WORLD_PEACE_STAFF, + preciseBlit(gui, + WORLD_PEACE_STAFF, itemIconW, - h, + top, 0, 0, 32, @@ -196,7 +203,7 @@ public class KillMessageOverlay { Minecraft.getInstance().font, attackerName.get(), nameW, - h, + top, record.attacker.getTeamColor(), false ); @@ -208,6 +215,8 @@ public class KillMessageOverlay { gui.setColor(1, 1, 1, 1); gui.pose().popPose(); + + return baseTop; } @Nullable diff --git a/src/main/java/net/mcreator/target/tools/RenderTool.java b/src/main/java/net/mcreator/target/tools/RenderTool.java new file mode 100644 index 000000000..d752746e7 --- /dev/null +++ b/src/main/java/net/mcreator/target/tools/RenderTool.java @@ -0,0 +1,32 @@ +package net.mcreator.target.tools; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.resources.ResourceLocation; +import org.joml.Matrix4f; + +public class RenderTool { + public static void preciseBlit(GuiGraphics gui, ResourceLocation pAtlasLocation, float pX, float pY, float pUOffset, float pVOffset, float pWidth, float pHeight, float pTextureWidth, float pTextureHeight) { + float pX2 = pX + pWidth; + float pY2 = pY + pHeight; + float pBlitOffset = 0; + + float pMinU = pUOffset / pTextureWidth; + float pMaxU = (pUOffset + pWidth) / pTextureWidth; + float pMinV = pVOffset / pTextureHeight; + float pMaxV = (pVOffset + pHeight) / pTextureHeight; + + RenderSystem.setShaderTexture(0, pAtlasLocation); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + Matrix4f matrix4f = gui.pose().last().pose(); + BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + bufferbuilder.vertex(matrix4f, pX, pY, pBlitOffset).uv(pMinU, pMinV).endVertex(); + bufferbuilder.vertex(matrix4f, pX, pY2, pBlitOffset).uv(pMinU, pMaxV).endVertex(); + bufferbuilder.vertex(matrix4f, pX2, pY2, pBlitOffset).uv(pMaxU, pMaxV).endVertex(); + bufferbuilder.vertex(matrix4f, pX2, pY, pBlitOffset).uv(pMaxU, pMinV).endVertex(); + BufferUploader.drawWithShader(bufferbuilder.end()); + } +}