- 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);
}
}