XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

MyDimension

【Java】我的维度模组

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/MyDimension

新增 MindPortalOverlay 心灵传送门界面遮罩

新增 MindPortalOverlay.java,实现检测玩家是否处于 Mind Portal 方块内并渲染传送门特效。 在 ClientForgeEvents.java 的客户端 Tick 事件中调用 tick 方法,动态更新遮罩强度。 在 ModClientEvents.java 注册新的 GUI Overlay,支持在原版特效之上渲染。 遮罩使用原版下界传送门贴图,带有脉冲动画和淡入淡出效果。

b17a86f
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

3 个文件 +106 -0
Modified src/main/java/com/xfestudio/mydimension/client/ClientForgeEvents.java +1 -0
@@ -20,6 +20,7 @@ public class ClientForgeEvents {
20 20 }
21 21
22 22 Minecraft minecraft = Minecraft.getInstance();
23 MindPortalOverlay.tick(minecraft);
23 24 if (minecraft.level == null) {
24 25 return;
25 26 }
Added src/main/java/com/xfestudio/mydimension/client/MindPortalOverlay.java +98 -0
@@ -0,0 +1,98 @@
1 package com.xfestudio.mydimension.client;
2
3 import com.mojang.blaze3d.systems.RenderSystem;
4 import com.xfestudio.mydimension.registry.ModBlocks;
5 import net.minecraft.client.Minecraft;
6 import net.minecraft.client.gui.GuiGraphics;
7 import net.minecraft.client.renderer.texture.TextureAtlas;
8 import net.minecraft.client.renderer.texture.TextureAtlasSprite;
9 import net.minecraft.core.BlockPos;
10 import net.minecraft.resources.ResourceLocation;
11 import net.minecraft.util.Mth;
12 import net.minecraft.world.entity.player.Player;
13 import net.minecraft.world.phys.AABB;
14 import net.minecraftforge.client.gui.overlay.IGuiOverlay;
15
16 public final class MindPortalOverlay {
17 private static final ResourceLocation PORTAL_SPRITE = new ResourceLocation("minecraft", "block/nether_portal");
18 private static final float CHARGE_STEP = 1.0F / 40.0F;
19 private static final float FADE_STEP = 0.1F;
20
21 public static final IGuiOverlay OVERLAY = MindPortalOverlay::render;
22
23 private static float previousIntensity;
24 private static float intensity;
25
26 private MindPortalOverlay() {
27 }
28
29 public static void tick(Minecraft minecraft) {
30 previousIntensity = intensity;
31 if (minecraft.level == null || minecraft.player == null) {
32 previousIntensity = 0.0F;
33 intensity = 0.0F;
34 return;
35 }
36
37 if (isInsidePortal(minecraft.player)) {
38 intensity = Mth.clamp(intensity + CHARGE_STEP, 0.0F, 1.0F);
39 } else {
40 intensity = Mth.clamp(intensity - FADE_STEP, 0.0F, 1.0F);
41 }
42 }
43
44 private static boolean isInsidePortal(Player player) {
45 AABB bounds = player.getBoundingBox().deflate(0.001D);
46 int minX = Mth.floor(bounds.minX);
47 int minY = Mth.floor(bounds.minY);
48 int minZ = Mth.floor(bounds.minZ);
49 int maxX = Mth.floor(bounds.maxX);
50 int maxY = Mth.floor(bounds.maxY);
51 int maxZ = Mth.floor(bounds.maxZ);
52 BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos();
53
54 for (int x = minX; x <= maxX; x++) {
55 for (int y = minY; y <= maxY; y++) {
56 for (int z = minZ; z <= maxZ; z++) {
57 if (player.level().getBlockState(pos.set(x, y, z)).is(ModBlocks.MIND_PORTAL.get())) {
58 return true;
59 }
60 }
61 }
62 }
63 return false;
64 }
65
66 private static void render(net.minecraftforge.client.gui.overlay.ForgeGui gui, GuiGraphics graphics,
67 float partialTick, int screenWidth, int screenHeight) {
68 float progress = Mth.lerp(partialTick, previousIntensity, intensity);
69 if (progress <= 0.0F) {
70 return;
71 }
72
73 float alpha = progress;
74 if (alpha < 1.0F) {
75 alpha *= alpha;
76 alpha *= alpha;
77 alpha = alpha * 0.8F + 0.2F;
78 }
79
80 Minecraft minecraft = gui.getMinecraft();
81 float pulse = 0.96F;
82 if (minecraft.level != null) {
83 pulse += Mth.sin((minecraft.level.getGameTime() + partialTick) * 0.25F) * 0.04F;
84 }
85 alpha = Mth.clamp(alpha * pulse, 0.0F, 1.0F);
86
87 TextureAtlasSprite sprite = minecraft.getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(PORTAL_SPRITE);
88 RenderSystem.disableDepthTest();
89 RenderSystem.depthMask(false);
90 RenderSystem.enableBlend();
91 RenderSystem.defaultBlendFunc();
92 graphics.setColor(0.76F, 0.9F, 1.0F, alpha);
93 graphics.blit(0, 0, -90, screenWidth, screenHeight, sprite);
94 graphics.setColor(1.0F, 1.0F, 1.0F, 1.0F);
95 RenderSystem.depthMask(true);
96 RenderSystem.enableDepthTest();
97 }
98 }
Modified src/main/java/com/xfestudio/mydimension/client/ModClientEvents.java +7 -0
@@ -5,6 +5,8 @@ import com.xfestudio.mydimension.registry.ModEntities;
5 5 import com.xfestudio.mydimension.registry.ModBlockEntities;
6 6 import net.minecraftforge.api.distmarker.Dist;
7 7 import net.minecraftforge.client.event.EntityRenderersEvent;
8 import net.minecraftforge.client.event.RegisterGuiOverlaysEvent;
9 import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay;
8 10 import net.minecraftforge.eventbus.api.SubscribeEvent;
9 11 import net.minecraftforge.fml.common.Mod;
10 12
@@ -15,4 +17,9 @@ public class ModClientEvents {
15 17 event.registerEntityRenderer(ModEntities.RIFT_ANCHOR.get(), RiftAnchorRenderer::new);
16 18 event.registerBlockEntityRenderer(ModBlockEntities.MIND_PORTAL.get(), MindPortalRenderer::new);
17 19 }
20
21 @SubscribeEvent
22 public static void registerOverlays(RegisterGuiOverlaysEvent event) {
23 event.registerAbove(VanillaGuiOverlay.PORTAL.id(), "mind_portal", MindPortalOverlay.OVERLAY);
24 }
18 25 }