package jk_5.nailed.server.world; import jk_5.nailed.api.map.Map; import jk_5.nailed.api.util.Location; import jk_5.nailed.api.world.WorldProvider; import jk_5.nailed.server.world.voidgen.ChunkProviderVoid; import jk_5.nailed.server.world.voidgen.WorldChunkManagerVoid; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.biome.WorldChunkManager; import net.minecraft.world.biome.WorldChunkManagerHell; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.*; public class DelegatingWorldProvider extends net.minecraft.world.WorldProvider { private final WorldProvider wrapped; private int dimId; private jk_5.nailed.api.world.World world; private Map map; public DelegatingWorldProvider(WorldProvider wrapped){ this.wrapped = wrapped; } @Override public String getDimensionName() { return "DIM" + wrapped.getId(); } @Override public void setDimension(int dimensionId) { this.dimId = dimensionId; wrapped.setId(dimensionId); super.setDimension(dimensionId); } @Override public IChunkProvider createChunkGenerator() { if(wrapped.getType().equals("overworld")){ return new ChunkProviderGenerate(this.worldObj, this.worldObj.getSeed(), this.worldObj.getWorldInfo().isMapFeaturesEnabled(), ""); //TODO: is the "" correct? Extra options }else if(wrapped.getType().equals("void")){ return new ChunkProviderVoid(this.worldObj); }else if(wrapped.getType().equals("nether")){ return new ChunkProviderHell(this.worldObj, false, this.worldObj.getSeed()); //True to generate nether fortresses }else if(wrapped.getType().equals("end")){ return new ChunkProviderEnd(this.worldObj, this.worldObj.getSeed()); }else if(wrapped.getType().equals("flat")){ return new ChunkProviderFlat(this.worldObj, this.worldObj.getSeed(), this.worldObj.getWorldInfo().isMapFeaturesEnabled(), this.wrapped.getOptions()); }else{ throw new IllegalArgumentException("Unknown world type " + this.wrapped.getType()); } } @Override protected void registerWorldChunkManager() { if(wrapped.getType().equals("overworld")){ this.worldChunkMgr = new WorldChunkManager(this.worldObj); }else if(wrapped.getType().equals("void")){ this.worldChunkMgr = new WorldChunkManagerVoid(this.worldObj); }else if(wrapped.getType().equals("nether")){ this.worldChunkMgr = new WorldChunkManagerHell(BiomeGenBase.hell, 0.0F); this.isHellWorld = true; this.hasNoSky = true; }else if(wrapped.getType().equals("end")){ this.worldChunkMgr = new WorldChunkManagerHell(BiomeGenBase.sky, 0.0F); this.hasNoSky = true; }else if(wrapped.getType().equals("flat")){ FlatGeneratorInfo info = FlatGeneratorInfo.createFlatGeneratorFromString(this.wrapped.getOptions()); this.worldChunkMgr = new WorldChunkManagerHell(BiomeGenBase.getBiome(info.getBiome()), 0.5F); }else{ throw new IllegalArgumentException("Unknown world type " + this.wrapped.getType()); } } @Override public Location getSpawnPoint() { //TODO: check worldborder interference return this.getWorld().getConfig().spawnPoint(); } @Override public String getInternalNameSuffix() { return ""; } public jk_5.nailed.api.world.World getWorld(){ if(this.world == null){ this.world = NailedDimensionManager.instance().getWorld(this.dimId); } return this.world; } public Map getMap(){ if(this.map == null){ this.map = this.getWorld().getMap(); } return this.map; } public WorldProvider getWrapped() { return wrapped; } }