package joshie.harvest.calendar.render;
import gnu.trove.map.TIntIntMap;
import gnu.trove.map.hash.TIntIntHashMap;
import joshie.harvest.api.HFApi;
import joshie.harvest.api.calendar.Season;
import joshie.harvest.api.calendar.Weather;
import joshie.harvest.calendar.CalendarHelper;
import joshie.harvest.core.HFTrackers;
import joshie.harvest.core.helpers.MCClientHelper;
import joshie.harvest.core.util.annotations.HFEvents;
import joshie.harvest.npcs.gui.GuiNPCBase;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.biome.Biome;
import net.minecraftforge.client.event.EntityViewRenderEvent.FogColors;
import net.minecraftforge.client.event.EntityViewRenderEvent.RenderFogEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
import net.minecraftforge.event.terraingen.BiomeEvent.GetFoliageColor;
import net.minecraftforge.event.terraingen.BiomeEvent.GetGrassColor;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
@HFEvents(Side.CLIENT)
public class CalendarRender {
private static final BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos();
public static volatile TIntIntMap grassToBlend = new TIntIntHashMap();
public static volatile TIntIntMap leavesToBlend = new TIntIntHashMap();
private static int fogStart = 0;
private static int fogTarget = 0;
@SubscribeEvent
public void onRenderOverlay(RenderGameOverlayEvent.Pre event) {
if (event.getType() == ElementType.CROSSHAIRS) {
if (Minecraft.getMinecraft().currentScreen instanceof GuiNPCBase) {
event.setCanceled(true);
}
}
}
@SubscribeEvent
public void onFogRender(RenderFogEvent event) {
if (event.getEntity().worldObj.provider.getDimension() == 0) {
if (!event.getState().getMaterial().isLiquid()) {
//Update the fog smoothly
if (fogTarget != fogStart) {
if (fogTarget > fogStart) {
fogStart += 5;
} else if (fogTarget < fogStart) {
fogStart -= 5;
}
}
Minecraft mc = MCClientHelper.getMinecraft();
blockpos$mutableblockpos.setPos(mc.thePlayer.posX, mc.thePlayer.posY, mc.thePlayer.posZ);
int i1 = mc.gameSettings.fancyGraphics ? 10 : 5;
int j = MathHelper.floor_double(mc.thePlayer.posY);
int j2 = mc.theWorld.getPrecipitationHeight(blockpos$mutableblockpos).getY();
int k2 = j - i1;
int l2 = j + i1;
if (k2 < j2) {
k2 = j2;
}
if (l2 < j2) {
l2 = j2;
}
Weather weather = HFApi.calendar.getWeather(mc.theWorld);
if (k2 != l2) {
Biome biome = mc.theWorld.getBiome(blockpos$mutableblockpos);
if (biome.canRain() && !biome.isHighHumidity()) {
if (weather == Weather.BLIZZARD) {
fogTarget = -20000;
} else if (weather == Weather.SNOW) {
fogTarget = -1000;
} else fogTarget = 100;
} else fogTarget = 5000;
} else fogTarget = 100;
if (blockpos$mutableblockpos.getY() < j2) fogTarget = 5000;
//If we're snow or resetting the target
if (weather.isSnow()) {
GlStateManager.setFogEnd(Math.min(event.getFarPlaneDistance(), 150F) * 0.5F);
GlStateManager.setFogStart((float) fogStart / 100F);
}
} else {
fogStart = 100;
fogTarget = 100;
}
}
}
@SubscribeEvent
public void onFogColor(FogColors event) {
if (event.getEntity().worldObj.provider.getDimension() == 0) {
if (!event.getState().getMaterial().isLiquid()) {
Weather weather = HFApi.calendar.getWeather(MCClientHelper.getWorld());
if (weather == Weather.SNOW || weather == Weather.BLIZZARD) {
event.setRed(1F);
event.setBlue(1F);
event.setGreen(1F);
}
}
}
}
@SubscribeEvent
public void getFoliageColor(GetFoliageColor event) {
if (!event.getBiome().canRain() || event.getBiome().isHighHumidity()) return;
if (HFApi.calendar.getDate(MCClientHelper.getWorld()).getSeason() == Season.AUTUMN) {
event.setNewColor(0xFF9900);
} else {
int leaves = HFTrackers.getCalendar(MCClientHelper.getWorld()).getSeasonData().leavesColor;
if (leaves != 0) {
event.setNewColor(CalendarHelper.getBlendedColour(leavesToBlend, event.getOriginalColor(), leaves));
}
}
}
@SubscribeEvent
public void getGrassColor(GetGrassColor event) {
if (!event.getBiome().canRain() || event.getBiome().isHighHumidity()) return;
int grass = HFTrackers.getCalendar(MCClientHelper.getWorld()).getSeasonData().grassColor;
if (grass != 0) {
event.setNewColor(CalendarHelper.getBlendedColour(grassToBlend, event.getOriginalColor(), grass));
}
}
}