You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Minecraft 1.18.2 Forge模组自定义维度日月纹理替换求助

Minecraft 1.18.2 Forge 自定义维度太阳/月亮纹理替换实现

实现逻辑不需要复杂的模组开发基础,全程只需要替换代码里的占位符、按路径放好纹理即可,不会影响原版和其他维度的日月显示。


前置准备

  • 准备好自定义太阳、月亮纹理:太阳建议尺寸128128px,月亮建议尺寸256128px(按原版格式横向拼接8个月相,单月相尺寸32*32px),格式为带透明通道的PNG。
  • 确认你已经注册好自定义维度,记下维度的完整ID,格式为你的模组id:维度名称,例如mymod:fantasy_realm。

步骤1:放置纹理文件

将做好的纹理放到模组资源目录的对应路径:
src/main/resources/assets/你的模组id/textures/environment/
建议命名为custom_sun.png、custom_moon.png,方便后续路径填写。

步骤2:编写渲染监听类

在模组的客户端包路径下新建CustomSkyRenderer.java类,直接复制以下代码,将代码里标注了需要替换的占位符改成你自己的模组信息即可,不需要改动其他渲染参数:

// 替换成你自己模组的实际包路径
package com.yourname.yourmodid.client;

import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.FogRenderer;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.Level;
import net.minecraftforge.client.event.RenderLevelStageEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;

public class CustomSkyRenderer {
    // --- 以下三个值替换成你自己的内容 ---
    private static final ResourceLocation CUSTOM_SUN_TEX = new ResourceLocation("你的模组id", "textures/environment/custom_sun.png");
    private static final ResourceLocation CUSTOM_MOON_TEX = new ResourceLocation("你的模组id", "textures/environment/custom_moon.png");
    private static final ResourceLocation TARGET_DIMENSION = new ResourceLocation("你的模组id", "你的维度名");
    // --- 替换结束 ---

    @SubscribeEvent
    public void renderCustomCelestialBodies(RenderLevelStageEvent event) {
        Level currentLevel = Minecraft.getInstance().level;
        // 非目标维度直接放行,保留原版渲染逻辑
        if (currentLevel == null || !currentLevel.dimension().location().equals(TARGET_DIMENSION)) {
            return;
        }

        PoseStack poseStack = event.getPoseStack();
        // 仅在天空渲染阶段执行,避免渲染层级错误
        if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_SKY) {
            RenderSystem.depthMask(false);
            FogRenderer.setupNoFog();
            RenderSystem.enableBlend();

            // 渲染自定义太阳,位置、尺寸对齐原版参数无需修改
            RenderSystem.setShaderTexture(0, CUSTOM_SUN_TEX);
            poseStack.pushPose();
            poseStack.mulPose(event.getModelViewMatrix());
            poseStack.translate(-30F, 100F, -30F);
            poseStack.scale(120F, 120F, 120F);
            Minecraft.getInstance().gui.blit(poseStack, -15, -15, 0, 0, 30, 30, 30, 30);
            poseStack.popPose();

            // 渲染自定义月亮,自动适配月相
            RenderSystem.setShaderTexture(0, CUSTOM_MOON_TEX);
            int moonPhase = currentLevel.getMoonPhase();
            int uOffset = 2 * moonPhase % 8;
            int vOffset = 2 * (moonPhase / 4);
            poseStack.pushPose();
            poseStack.mulPose(event.getModelViewMatrix());
            poseStack.translate(-20F, -100F, 20F);
            poseStack.scale(90F, 90F, 90F);
            Minecraft.getInstance().gui.blit(poseStack, -10, -10, uOffset * 10, vOffset * 10, 20, 20, 160, 40);
            poseStack.popPose();

            RenderSystem.disableBlend();
            RenderSystem.depthMask(true);
        }
    }
}

步骤3:注册渲染事件

找到你模组的客户端初始化入口(一般在主类里处理FMLClientSetupEvent事件的位置),添加一行注册代码,注意这行代码必须仅在客户端侧执行,放到服务端逻辑里会直接崩溃:

MinecraftForge.EVENT_BUS.register(CustomSkyRenderer.class);

常见问题排查

  • 纹理不显示/显示紫黑块:检查ResourceLocation里的模组id、纹理路径是否和实际文件路径完全一致,注意文件名大小写。
  • 日月位置偏移/不随视角转动:不要替换成其他渲染事件,必须使用RenderLevelStageEvent的AFTER_SKY阶段,不要修改代码里的translate、scale参数。
  • 纹理发黑/透明异常:确认纹理是32位带Alpha通道的PNG文件,不要使用JPG、BMP等不支持透明的格式。
  • 其他维度的日月也被替换:检查维度ID的判断逻辑是否正确,确认TARGET_DIMENSION的取值和你注册的自定义维度ID完全匹配。

内容的提问来源于stack exchange,提问作者Scripter stuff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:27:28