туман исчезает при переходе между измерениями

Версия Minecraft
1.12.2
API
Forge
51
8
5
я хочу сделать туман для измерения 0, но когда я в условиях делаю проверку на измерение (если проверки на измерение нет, то все нормально), то после перехода в другое измерение и обратно туман пропадает и все перестает работать (лечится перезаходом в мир). Мой код ниже, помогите, пожалуйста
Java:
package com.lep.fog;

import com.lep.ElementsLEP;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.EnumSkyBlock;
import net.minecraft.world.World;
import net.minecraftforge.client.event.EntityViewRenderEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

@ElementsLEP.ModElement.Tag
public class ColorFogControl extends ElementsLEP.ModElement {
    private static final BlockPos.MutableBlockPos MUTABLE_POS = new BlockPos.MutableBlockPos();
    private static final int[][] AREA_OFFSETS = generateOffsets();
    private static final float INV_15 = 1.0F / 15.0F;
    private static final float PI = (float)Math.PI;
    private static final float TIME_NORMALIZER = 0.000083333336F;

    private float currentDensity = 0.05F;
    private float targetDensity = 0.05F;
    private long lastUpdateTime = System.nanoTime();
    private final Minecraft mc;

    public ColorFogControl(ElementsLEP instance) {
        super(instance, 1);
        mc = Minecraft.getMinecraft();
        MinecraftForge.EVENT_BUS.register(this);
    }

    private static int[][] generateOffsets() {
        int[][] offsets = new int[9][2];
        for(int i = 0, x = -1; x <= 1; x++)
            for(int z = -1; z <= 1; z++)
                offsets[i++] = new int[]{x, z};
        return offsets;
    }

    @SubscribeEvent
    public void onFogColor(EntityViewRenderEvent.FogColors event) {
        EntityPlayer player = mc.player;
        World world = mc.world;
        if (player == null || world == null || player.dimension != 0) return;

        float nightFactor = calculateNightFactor(world.getWorldTime());
        event.setRed(event.getRed() * (1 - nightFactor));
        event.setGreen(event.getGreen() * (1 - nightFactor));
        event.setBlue(event.getBlue() * (1 - nightFactor));
    }

    @SubscribeEvent
    public void onFogDensity(EntityViewRenderEvent.FogDensity event) {
        EntityPlayer player = mc.player;
        World world = mc.world;
        if (player == null || world == null || player.dimension != 0) return;

        long currentTime = System.nanoTime();
        float deltaTime = (currentTime - lastUpdateTime) * 1E-9F;
        lastUpdateTime = currentTime;

        BlockPos pos = player.getPosition();
        float skyLightFactor = getMaxSkyLightInArea(world, pos) * INV_15;
        float newTargetDensity = world.isRaining() ? 0.12F * skyLightFactor : 0.05F * skyLightFactor;

        float transitionSpeed = newTargetDensity > currentDensity ? 0.5F : 4.0F;

        targetDensity = newTargetDensity;
        currentDensity += (targetDensity - currentDensity) * Math.min(deltaTime * transitionSpeed, 1.0F);

        event.setDensity(currentDensity);
        event.setCanceled(true);
    }

    private int getMaxSkyLightInArea(World world, BlockPos pos) {
        int maxLight = 0;
        int y = pos.getY();
        int skySubtracted = world.getSkylightSubtracted();

        for(int[] offset : AREA_OFFSETS) {
            MUTABLE_POS.setPos(pos.getX() + offset[0], y, pos.getZ() + offset[1]);
            int light = world.getLightFor(EnumSkyBlock.SKY, MUTABLE_POS) - skySubtracted;
            if(light > maxLight && (maxLight = light) == 15) break;
        }
        return maxLight;
    }

    private static float calculateNightFactor(long worldTime) {
        if(worldTime < 10000 || worldTime > 24000) return 0.0F;
        return MathHelper.sin((worldTime - 10000) * TIME_NORMALIZER * PI);
    }
}
 
Решение
я исправил эту проблему, вот мой исправленный код, если кому-то надо
Java:
package com.lep.fog;

import com.lep.ElementsLEP;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.EnumSkyBlock;
import net.minecraftforge.client.event.EntityViewRenderEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;

@ElementsLEP.ModElement.Tag
public class ColorFogControl extends ElementsLEP.ModElement {
    private final Minecraft mc...
я исправил эту проблему, вот мой исправленный код, если кому-то надо
Java:
package com.lep.fog;

import com.lep.ElementsLEP;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.EnumSkyBlock;
import net.minecraftforge.client.event.EntityViewRenderEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;

@ElementsLEP.ModElement.Tag
public class ColorFogControl extends ElementsLEP.ModElement {
    private final Minecraft mc;
    private static final BlockPos.MutableBlockPos MUTABLE_POS = new BlockPos.MutableBlockPos();
    private static final int[][] AREA_OFFSETS = {{0, 0}, {1, 0}, {0, 1}, {-1, 0}, {0, -1}};

    private float currentDensity = 0.05f;
    private float targetDensity = 0.05f;
    private static final float TRANSITION_SPEED = 0.005f;

    public ColorFogControl(ElementsLEP instance) {
        super(instance, 1);
        mc = Minecraft.getMinecraft();
        MinecraftForge.EVENT_BUS.register(this);
    }

    @SubscribeEvent
    public void onClientTick(TickEvent.ClientTickEvent event) {
        if (event.phase == TickEvent.Phase.END) {
            updateFogDensity();
        }
    }

    private void updateFogDensity() {
        if (currentDensity < targetDensity) {
            currentDensity = Math.min(currentDensity + TRANSITION_SPEED, targetDensity);
        } else if (currentDensity > targetDensity) {
            currentDensity = Math.max(currentDensity - TRANSITION_SPEED, targetDensity);
        }
    }

    @SubscribeEvent
    public void onFogColor(EntityViewRenderEvent.FogColors event) {
        EntityPlayer player = mc.player;
        World world = mc.world;

        if (player != null && world != null && player.dimension == 0) {
            long timeOfDay = world.getWorldTime() % 24000;
            float skyLight = getMaxSkyLightInArea(world, new BlockPos(player.posX, player.posY, player.posZ)) / 15.0f;

            float darkening = 1.0f;

            if (timeOfDay >= 12000 && timeOfDay <= 23000) {
                if (timeOfDay <= 14000) {
                    darkening = 1.0f - ((timeOfDay - 12000) / 2000f);
                } else {
                    darkening = 0.3f;
                }
            }

            event.setRed(event.getRed() * darkening);
            event.setGreen(event.getGreen() * darkening);
            event.setBlue(event.getBlue() * darkening);
        }
    }

    @SubscribeEvent
    public void onFogDensity(EntityViewRenderEvent.FogDensity event) {
        EntityPlayer player = mc.player;
        World world = mc.world;

        if (player != null && world != null && player.dimension == 0) {
            float baseDensity = world.isRaining() ? 0.12f : 0.05f;
            int skyLight = getMaxSkyLightInArea(world, new BlockPos(player.posX, player.posY, player.posZ));
            float lightFactor = skyLight / 15.0f;

            targetDensity = baseDensity * lightFactor;

            GlStateManager.setFog(GlStateManager.FogMode.EXP);
            GlStateManager.setFogStart(0.0F);
            GlStateManager.setFogEnd(1.0F);

            event.setDensity(Math.max(0.0f, currentDensity));
            event.setCanceled(true);
        }
    }

    private int getMaxSkyLightInArea(World world, BlockPos pos) {
        int maxLight = 0;
        int y = pos.getY();
        int skySubtracted = world.getSkylightSubtracted();

        for(int[] offset : AREA_OFFSETS) {
            MUTABLE_POS.setPos(pos.getX() + offset[0], y, pos.getZ() + offset[1]);
            int light = world.getLightFor(EnumSkyBlock.SKY, MUTABLE_POS) - skySubtracted;
            if(light > maxLight && (maxLight = light) == 15) break;
        }
        return maxLight;
    }
}
 
Назад
Сверху