package com.bioxx.tfc2.world; import java.util.Iterator; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.play.server.SPacketChangeGameState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.DimensionType; import net.minecraft.world.WorldProvider; import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkGenerator; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import com.bioxx.tfc2.Core; import com.bioxx.tfc2.TFCBlocks; import com.bioxx.tfc2.rendering.SkyRenderer; import com.bioxx.tfc2.rendering.WeatherRenderer; import com.bioxx.tfc2.world.biome.BiomeProviderTFC; public class WorldProviderSurface extends WorldProvider { WeatherRenderer weatherRenderer = new WeatherRenderer(); SkyRenderer skyRenderer = new SkyRenderer(); @Override @SideOnly(Side.CLIENT) public net.minecraftforge.client.IRenderHandler getWeatherRenderer() { return weatherRenderer; } @Override protected void createBiomeProvider() { biomeProvider = new BiomeProviderTFC(); WorldGen.initialize(worldObj); WeatherManager.setupWeather(worldObj); } @Override public IChunkGenerator createChunkGenerator() { return new ChunkProviderSurface(this.worldObj, worldObj.getSeed(), false, ""); } @Override public boolean canCoordinateBeSpawn(int x, int z) { Block b = Core.getGroundAboveSeaLevel(this.worldObj, new BlockPos(x, 0, z)); return b == TFCBlocks.Sand; } @Override public boolean canBlockFreeze(BlockPos pos, boolean byWater) { int x = pos.getX() << 12; int z = pos.getZ() << 12; if(WorldGen.getInstance() == null) return false; /*Map m = WorldGen.getInstance().getIslandMap(x, z); if(m.islandParams.getIslandTemp() == ClimateTemp.SUBTROPICAL || m.islandParams.getIslandTemp() == ClimateTemp.TROPICAL) return false;*/ return false; } @Override public boolean canSnowAt(BlockPos pos, boolean checkLight) { int x = pos.getX() << 12; int z = pos.getZ() << 12; if(WorldGen.getInstance() == null) return false; /*Map m = WorldGen.getInstance().getIslandMap(x, z); if(m.islandParams.getIslandTemp() == ClimateTemp.SUBTROPICAL || m.islandParams.getIslandTemp() == ClimateTemp.TROPICAL) return false;*/ return worldObj.canSnowAtBody(pos, checkLight); } @Override public double getHorizon() { return 64D; } @Override @SideOnly(Side.CLIENT) public float getCloudHeight() { return 258; } @Override public Biome getBiomeForCoords(BlockPos pos) { //TODO make this read the islandmap and output relevant biome types return Biome.getBiome(1); } @Override public void updateWeather() { if (!getHasNoSky()) { if (!worldObj.isRemote && worldObj.provider.getDimension() == 0) { worldObj.getWorldInfo().setRainTime(48000); worldObj.getWorldInfo().setRaining(false); int i = worldObj.getWorldInfo().getCleanWeatherTime(); if (i > 0) { --i; worldObj.getWorldInfo().setCleanWeatherTime(i); worldObj.getWorldInfo().setThunderTime(worldObj.getWorldInfo().isThundering() ? 1 : 2); worldObj.getWorldInfo().setRainTime(worldObj.getWorldInfo().isRaining() ? 1 : 2); } int j = worldObj.getWorldInfo().getThunderTime(); if (j <= 0) { if (worldObj.getWorldInfo().isThundering()) { worldObj.getWorldInfo().setThunderTime(worldObj.rand.nextInt(12000) + 3600); } else { worldObj.getWorldInfo().setThunderTime(worldObj.rand.nextInt(168000) + 12000); } } else { --j; worldObj.getWorldInfo().setThunderTime(j); if (j <= 0) { worldObj.getWorldInfo().setThundering(!worldObj.getWorldInfo().isThundering()); } } worldObj.prevThunderingStrength = worldObj.thunderingStrength; /*if (worldObj.getWorldInfo().isThundering()) { worldObj.thunderingStrength = (float)((double)worldObj.thunderingStrength + 0.01D); } else { worldObj.thunderingStrength = (float)((double)worldObj.thunderingStrength - 0.01D); } worldObj.thunderingStrength = MathHelper.clamp_float(worldObj.thunderingStrength, 0.0F, 1.0F);*/ worldObj.prevRainingStrength = worldObj.rainingStrength; Iterator iterator = worldObj.playerEntities.iterator(); //TODO: Add thunder support while (iterator.hasNext()) { EntityPlayerMP player = (EntityPlayerMP) iterator.next(); if(!player.isDead && player.dimension == 0) { float old = player.getEntityData().getFloat("oldPrecipitation"); float precip = (float)WeatherManager.getInstance().getPreciptitation((int)player.posX, (int)player.posZ); if(precip != old) { player.connection.sendPacket(new SPacketChangeGameState(7, precip)); } } } } } } @Override public DimensionType getDimensionType() { return DimensionTFC.SURFACE; } }