返回提交历史
Modified
src/main/java/com/xfestudio/mydimension/client/ClientForgeEvents.java
+1
-0
Added
src/main/java/com/xfestudio/mydimension/client/MindPortalOverlay.java
+98
-0
Modified
src/main/java/com/xfestudio/mydimension/client/ModClientEvents.java
+7
-0
XFEstudio/MyDimension
新增 MindPortalOverlay 心灵传送门界面遮罩
新增 MindPortalOverlay.java,实现检测玩家是否处于 Mind Portal 方块内并渲染传送门特效。 在 ClientForgeEvents.java 的客户端 Tick 事件中调用 tick 方法,动态更新遮罩强度。 在 ModClientEvents.java 注册新的 GUI Overlay,支持在原版特效之上渲染。 遮罩使用原版下界传送门贴图,带有脉冲动画和淡入淡出效果。
b17a86f
代码差异
3 个文件
+106
-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
}
@@ -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
}
@@ -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
}