/*
* This file is part of Cubic Chunks Mod, licensed under the MIT License (MIT).
*
* Copyright (c) 2015 contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package cubicchunks.world.provider;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.DimensionType;
import net.minecraft.world.World;
import net.minecraft.world.WorldProvider;
import net.minecraft.world.WorldType;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.BiomeProvider;
import net.minecraft.world.border.WorldBorder;
import net.minecraft.world.chunk.IChunkGenerator;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nullable;
import cubicchunks.world.ICubicWorld;
import cubicchunks.world.type.ICubicWorldType;
import cubicchunks.worldgen.generator.ICubeGenerator;
import cubicchunks.worldgen.generator.vanilla.VanillaCompatibilityGenerator;
public class VanillaCubicProvider extends CubicWorldProvider {
private static final WorldType HEURISTIC_WORLDTYPE = new WorldType("no-op") {
@Override public IChunkGenerator getChunkGenerator(World world, String options) {
return null; // now thats something we can detect >:D
}
};
private WorldProvider provider;
private ICubeGenerator cubeGen;
public VanillaCubicProvider(ICubicWorld world, WorldProvider provider) {
this.provider = provider;
this.worldObj = (World) world;
boolean useProvider = false;
if (!worldObj.isRemote) {
if (worldObj.getWorldType() instanceof ICubicWorldType) { // Who do we trust!??!?! D:
// nasty hack heuristic to see if provider asks its WorldType for a chunk generator
//ReflectionUtil.setFieldValueSrg(wp, "field_76577_b", HEURISTIC_WORLDTYPE);
provider.terrainType = HEURISTIC_WORLDTYPE;
IChunkGenerator pro_or_null = provider.createChunkGenerator();
// clean up
//ReflectionUtil.setFieldValueSrg(provider, "field_76577_b", worldObj.getWorldType());
provider.terrainType = worldObj.getWorldType();
if (pro_or_null != null) { // It will be null if it tries to get one form WorldType
// It was from a vanilla WorldProvider... use it
cubeGen = new VanillaCompatibilityGenerator(pro_or_null, world);
} else {
// It was from WorldType, try to use cubic generator
cubeGen = ((ICubicWorldType) worldObj.getWorldType()).createCubeGenerator(getCubicWorld());
if (cubeGen == null) {
useProvider = true;
}
}
} else {
useProvider = true;
}
if (useProvider) {
cubeGen = new VanillaCompatibilityGenerator(provider.createChunkGenerator(), world);
}
}
}
@Override
public ICubeGenerator createCubeGenerator() {
return cubeGen;
}
@SuppressWarnings("deprecation")
@Override public IChunkGenerator createChunkGenerator() {
return provider.createChunkGenerator(); // Just in case a mod wants it (I cant think of why any would need to do this)
}
@Override public boolean canCoordinateBeSpawn(int x, int z) {
return provider.canCoordinateBeSpawn(x, z);
}
@Override public float calculateCelestialAngle(long worldTime, float partialTicks) {
return provider.calculateCelestialAngle(worldTime, partialTicks);
}
@Override public int getMoonPhase(long worldTime) {
return provider.getMoonPhase(worldTime);
}
@Override public boolean isSurfaceWorld() {
return provider.isSurfaceWorld();
}
@Nullable
@SideOnly(Side.CLIENT)
@Override public float[] calcSunriseSunsetColors(float celestialAngle, float partialTicks) {
return provider.calcSunriseSunsetColors(celestialAngle, partialTicks);
}
@SideOnly(Side.CLIENT)
@Override public Vec3d getFogColor(float p_76562_1_, float p_76562_2_) {
return provider.getFogColor(p_76562_1_, p_76562_2_);
}
@Override public boolean canRespawnHere() {
return provider.canRespawnHere();
}
@SideOnly(Side.CLIENT)
@Override public float getCloudHeight() {
return provider.getCloudHeight();
}
@SideOnly(Side.CLIENT)
@Override public boolean isSkyColored() {
return provider.isSkyColored();
}
@Override public BlockPos getSpawnCoordinate() {
return provider.getSpawnCoordinate();
}
@Override public int getAverageGroundLevel() {
return provider.getAverageGroundLevel();
}
@SideOnly(Side.CLIENT)
@Override public boolean doesXZShowFog(int x, int z) {
return provider.doesXZShowFog(x, z);
}
@Override public BiomeProvider getBiomeProvider() {
return provider.getBiomeProvider();
}
@Override public boolean doesWaterVaporize() {
return provider.doesWaterVaporize();
}
@Override public boolean getHasNoSky() {
return provider.getHasNoSky();
}
@Override public float[] getLightBrightnessTable() {
return provider.getLightBrightnessTable();
}
@Override public WorldBorder createWorldBorder() {
return provider.createWorldBorder();
}
@Override public void setDimension(int dim) {
provider.setDimension(dim);
}
@Override public int getDimension() {
return provider.getDimension();
}
@Override public String getSaveFolder() {
return provider.getSaveFolder();
}
@Override public String getWelcomeMessage() {
return provider.getWelcomeMessage();
}
@Override public String getDepartMessage() {
return provider.getDepartMessage();
}
@Override public double getMovementFactor() {
return provider.getMovementFactor();
}
@SideOnly(Side.CLIENT)
@Override public net.minecraftforge.client.IRenderHandler getSkyRenderer() {
return provider.getSkyRenderer();
}
@SideOnly(Side.CLIENT)
@Override public void setSkyRenderer(net.minecraftforge.client.IRenderHandler skyRenderer) {
provider.setSkyRenderer(skyRenderer);
}
@SideOnly(Side.CLIENT)
@Override public net.minecraftforge.client.IRenderHandler getCloudRenderer() {
return provider.getCloudRenderer();
}
@SideOnly(Side.CLIENT)
@Override public void setCloudRenderer(net.minecraftforge.client.IRenderHandler renderer) {
setCloudRenderer(renderer);
}
@SideOnly(Side.CLIENT)
@Override public net.minecraftforge.client.IRenderHandler getWeatherRenderer() {
return provider.getWeatherRenderer();
}
@SideOnly(Side.CLIENT)
@Override public void setWeatherRenderer(net.minecraftforge.client.IRenderHandler renderer) {
provider.setWeatherRenderer(renderer);
}
//public BlockPos getRandomizedSpawnPoint() {
// return wp.getRandomizedSpawnPoint();
//}
@Override public boolean shouldMapSpin(String entity, double x, double y, double z) {
return provider.shouldMapSpin(entity, x, y, z);
}
@Override public int getRespawnDimension(net.minecraft.entity.player.EntityPlayerMP player) {
return provider.getRespawnDimension(player);
}
@Override public net.minecraftforge.common.capabilities.ICapabilityProvider initCapabilities() {
return provider.initCapabilities();
}
@Override public Biome getBiomeForCoords(BlockPos pos) {
return provider.getBiomeForCoords(pos);
}
@Override public boolean isDaytime() {
return provider.isDaytime();
}
@Override public float getSunBrightnessFactor(float par1) {
return provider.getSunBrightnessFactor(par1);
}
@Override public float getCurrentMoonPhaseFactor() {
return provider.getCurrentMoonPhaseFactor();
}
@SideOnly(Side.CLIENT)
@Override public Vec3d getSkyColor(net.minecraft.entity.Entity cameraEntity, float partialTicks) {
return provider.getSkyColor(cameraEntity, partialTicks);
}
@SideOnly(Side.CLIENT)
@Override public Vec3d getCloudColor(float partialTicks) {
return provider.getCloudColor(partialTicks);
}
@SideOnly(Side.CLIENT)
@Override public float getSunBrightness(float par1) {
return provider.getSunBrightness(par1);
}
@SideOnly(Side.CLIENT)
@Override public float getStarBrightness(float par1) {
return provider.getStarBrightness(par1);
}
@Override public void setAllowedSpawnTypes(boolean allowHostile, boolean allowPeaceful) {
provider.setAllowedSpawnTypes(allowHostile, allowPeaceful);
}
@Override public void calculateInitialWeather() {
provider.calculateInitialWeather();
}
@Override public void updateWeather() {
provider.updateWeather();
}
@Override public boolean canBlockFreeze(BlockPos pos, boolean byWater) {
return provider.canBlockFreeze(pos, byWater);
}
@Override public boolean canSnowAt(BlockPos pos, boolean checkLight) {
return provider.canSnowAt(pos, checkLight);
}
@Override public void setWorldTime(long time) {
provider.setWorldTime(time);
}
@Override public long getSeed() {
return provider.getSeed();
}
@Override public long getWorldTime() {
return provider.getWorldTime();
}
@Override public BlockPos getSpawnPoint() {
return provider.getSpawnPoint();
}
@Override public void setSpawnPoint(BlockPos pos) {
provider.setSpawnPoint(pos);
}
@Override public boolean canMineBlock(net.minecraft.entity.player.EntityPlayer player, BlockPos pos) {
return provider.canMineBlock(player, pos);
}
@Override public boolean isBlockHighHumidity(BlockPos pos) {
return provider.isBlockHighHumidity(pos);
}
@Override public double getHorizon() {
return provider.getHorizon();
}
@Override public void resetRainAndThunder() {
provider.resetRainAndThunder();
}
@Override public boolean canDoLightning(net.minecraft.world.chunk.Chunk chunk) {
return provider.canDoLightning(chunk);
}
@Override public boolean canDoRainSnowIce(net.minecraft.world.chunk.Chunk chunk) {
return provider.canDoRainSnowIce(chunk);
}
@Override public void onPlayerAdded(EntityPlayerMP player) {
provider.onPlayerAdded(player);
}
@Override public void onPlayerRemoved(EntityPlayerMP player) {
provider.onPlayerRemoved(player);
}
@Override public DimensionType getDimensionType() {
return provider.getDimensionType();
}
@Override public void onWorldSave() {
provider.onWorldSave();
}
@Override public void onWorldUpdateEntities() {
provider.onWorldUpdateEntities();
}
@SuppressWarnings("deprecation")
@Override public boolean canDropChunk(int x, int z) {
return provider.canDropChunk(x, z);
}
}