package micdoodle8.mods.galacticraft.planets.asteroids.world.gen.base;
import java.util.List;
import java.util.Random;
import micdoodle8.mods.galacticraft.api.vector.BlockVec3;
import micdoodle8.mods.galacticraft.api.world.IGalacticraftWorldProvider;
import micdoodle8.mods.galacticraft.core.world.gen.dungeon.MapGenDungeon;
import micdoodle8.mods.galacticraft.planets.asteroids.dimension.WorldProviderAsteroids;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraft.world.chunk.ChunkPrimer;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.structure.MapGenStructure;
import net.minecraft.world.gen.structure.MapGenStructureIO;
import net.minecraft.world.gen.structure.StructureComponent;
import net.minecraft.world.gen.structure.StructureStart;
public class MapGenAbandonedBase extends MapGenStructure
{
private static boolean initialized;
static
{
try
{
MapGenAbandonedBase.initiateStructures();
}
catch (Throwable e)
{
}
}
public MapGenAbandonedBase()
{
}
public static void initiateStructures() throws Throwable
{
if (!MapGenAbandonedBase.initialized)
{
MapGenStructureIO.registerStructure(MapGenAbandonedBase.Start.class, "AbandonedBase");
MapGenStructureIO.registerStructureComponent(BaseStart.class, "AbandonedBaseStart");
MapGenStructureIO.registerStructureComponent(BaseRoom.class, "AbandonedBaseRoom");
MapGenStructureIO.registerStructureComponent(BaseDeck.class, "AbandonedBaseDeck");
MapGenStructureIO.registerStructureComponent(BasePlate.class, "AbandonedBasePlate");
MapGenStructureIO.registerStructureComponent(BaseHangar.class, "AbandonedBaseHangar");
//Currently in fact unused, but just in case...
MapGenStructureIO.registerStructureComponent(BaseLinking.class, "AbandonedBaseCorridor");
}
MapGenAbandonedBase.initialized = true;
}
@Override
public String getStructureName()
{
return "GC_AbandonedBase";
}
@Override
protected boolean canSpawnStructureAtCoords(int chunkX, int chunkZ)
{
long dungeonPos = MapGenDungeon.getDungeonPosForCoords(this.worldObj, chunkX, chunkZ, ((IGalacticraftWorldProvider) this.worldObj.provider).getDungeonSpacing());
int i = (int) (dungeonPos >> 32);
int j = (int) dungeonPos;
return i == chunkX && j == chunkZ;
}
@Override
public void generate(IChunkProvider chunkProviderIn, World worldIn, int x, int z, ChunkPrimer chunkPrimerIn)
{
int i = this.range;
this.worldObj = worldIn;
this.rand.setSeed(worldIn.getSeed());
long j = this.rand.nextLong();
long k = this.rand.nextLong();
for (int l = x - i; l <= x + i; ++l)
{
for (int i1 = z - i; i1 <= z + i; ++i1)
{
long j1 = (long)l * j;
long k1 = (long)i1 * k;
this.rand.setSeed(j1 ^ k1 ^ worldIn.getSeed());
this.recursiveGenerate(worldIn, l, i1, x, z, chunkPrimerIn);
}
}
}
public void reset()
{
this.structureMap.clear();
}
@Override
protected StructureStart getStructureStart(int chunkX, int chunkZ)
{
BlockVec3 asteroid = ((WorldProviderAsteroids) this.worldObj.provider).getClosestAsteroidXZ((chunkX << 4) + 8, 0, (chunkZ << 4) + 8, false);
return new MapGenAbandonedBase.Start(this.worldObj, this.rand, asteroid.x, asteroid.z, asteroid.sideDoneBits - 5, new BaseConfiguration(asteroid.y - 10, this.rand));
}
public static class Start extends StructureStart
{
private BaseConfiguration configuration;
public Start()
{
}
public Start(World worldIn, Random rand, int posX, int posZ, int size, BaseConfiguration configuration)
{
super(posX >> 4, posZ >> 4);
this.configuration = configuration;
if (size < 1) size = 1;
size = size * (int) MathHelper.sqrt_float(size) / 4;
if (configuration.isHangarDeck()) size -= 6;
int xoffset = 0;
int zoffset = 0;
EnumFacing direction = EnumFacing.Plane.HORIZONTAL.random(rand);
switch (direction)
{
case NORTH:
zoffset = -size;
break;
case SOUTH:
zoffset = size;
break;
case WEST:
xoffset = -size;
break;
case EAST:
xoffset = size;
break;
}
BaseStart startPiece = new BaseStart(configuration, rand, posX + xoffset, posZ + zoffset, direction);
startPiece.buildComponent(startPiece, this.components, rand);
List<StructureComponent> list = startPiece.attachedComponents;
while (!list.isEmpty())
{
int i = rand.nextInt(list.size());
StructureComponent structurecomponent = list.remove(i);
structurecomponent.buildComponent(startPiece, this.components, rand);
}
this.updateBoundingBox();
}
}
}