2013-02-18 03:46:16 +01:00
|
|
|
package StevenDimDoors.mod_pocketDim;
|
|
|
|
|
|
|
|
import java.util.Random;
|
|
|
|
|
|
|
|
import net.minecraft.block.Block;
|
|
|
|
import net.minecraft.world.World;
|
|
|
|
import net.minecraft.world.chunk.IChunkProvider;
|
2013-06-16 15:57:51 +02:00
|
|
|
import StevenDimDoors.mod_pocketDim.helpers.dimHelper;
|
|
|
|
import StevenDimDoors.mod_pocketDim.items.ItemRiftBlade;
|
|
|
|
import StevenDimDoors.mod_pocketDim.world.pocketProvider;
|
2013-02-18 03:46:16 +01:00
|
|
|
import cpw.mods.fml.common.IWorldGenerator;
|
|
|
|
|
|
|
|
public class RiftGenerator implements IWorldGenerator
|
|
|
|
{
|
2013-06-16 15:57:51 +02:00
|
|
|
public static final int MAX_GATEWAY_GENERATION_CHANCE = 10000;
|
|
|
|
public static final int MAX_CLUSTER_GENERATION_CHANCE = 10000;
|
|
|
|
private static final int CLUSTER_GROWTH_CHANCE = 80;
|
|
|
|
private static final int MAX_CLUSTER_GROWTH_CHANCE = 100;
|
2013-06-16 20:36:32 +02:00
|
|
|
private static final int MIN_RIFT_Y = 21;
|
|
|
|
private static final int MAX_RIFT_Y = 250;
|
|
|
|
private static final int CHUNK_LENGTH = 16;
|
2013-06-16 22:03:10 +02:00
|
|
|
private static final int GATEWAY_RADIUS = 4;
|
2013-06-14 01:01:54 +02:00
|
|
|
private static DDProperties properties = null;
|
2013-06-16 15:57:51 +02:00
|
|
|
|
2013-06-14 01:01:54 +02:00
|
|
|
public RiftGenerator()
|
|
|
|
{
|
|
|
|
if (properties == null)
|
|
|
|
properties = DDProperties.instance();
|
|
|
|
}
|
2013-02-18 03:46:16 +01:00
|
|
|
|
2013-06-14 01:01:54 +02:00
|
|
|
@Override
|
|
|
|
public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider)
|
|
|
|
{
|
2013-06-16 20:36:32 +02:00
|
|
|
//Don't generate rifts or gateways if the rift generation flag is disabled,
|
|
|
|
//the current world is a pocket dimension, or the world is remote.
|
|
|
|
if (!properties.WorldRiftGenerationEnabled || world.provider instanceof pocketProvider || world.isRemote)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
2013-06-14 01:01:54 +02:00
|
|
|
|
2013-06-16 20:36:32 +02:00
|
|
|
int x, y, z;
|
|
|
|
int blockID;
|
|
|
|
LinkData link;
|
2013-06-14 01:01:54 +02:00
|
|
|
|
2013-06-16 20:36:32 +02:00
|
|
|
//Randomly decide whether to place a cluster of rifts here
|
|
|
|
if (random.nextInt(MAX_CLUSTER_GENERATION_CHANCE) < properties.ClusterGenerationChance)
|
2013-06-14 01:01:54 +02:00
|
|
|
{
|
2013-06-16 20:36:32 +02:00
|
|
|
link = null;
|
|
|
|
do
|
2013-06-14 01:01:54 +02:00
|
|
|
{
|
2013-06-16 20:36:32 +02:00
|
|
|
//Pick a random point on the surface of the chunk
|
|
|
|
x = chunkX * CHUNK_LENGTH - random.nextInt(CHUNK_LENGTH);
|
|
|
|
z = chunkZ * CHUNK_LENGTH - random.nextInt(CHUNK_LENGTH);
|
|
|
|
y = world.getHeightValue(x, z);
|
2013-06-14 01:01:54 +02:00
|
|
|
|
2013-06-16 20:36:32 +02:00
|
|
|
//If the point is within the acceptable altitude range and the block above is empty, then place a rift
|
|
|
|
if (y >= MIN_RIFT_Y && y <= MAX_RIFT_Y && world.isAirBlock(x, y + 1, z))
|
2013-06-14 01:01:54 +02:00
|
|
|
{
|
2013-06-16 20:36:32 +02:00
|
|
|
//Create a link. If this is the first time, create a dungeon pocket and create a two-way link.
|
|
|
|
//Otherwise, create a one-way link and connect to the destination of the first link.
|
|
|
|
if (link == null)
|
|
|
|
{
|
|
|
|
link = new LinkData(world.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, random.nextInt(4));
|
|
|
|
link = dimHelper.instance.createPocket(link, true, true);
|
|
|
|
}
|
|
|
|
else
|
2013-06-14 01:01:54 +02:00
|
|
|
{
|
2013-06-16 20:36:32 +02:00
|
|
|
link = dimHelper.instance.createLink(link.locDimID, link.destDimID, x, y + 1, z, link.destXCoord, link.destYCoord, link.destZCoord);
|
2013-06-14 01:01:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-06-16 20:36:32 +02:00
|
|
|
//Randomly decide whether to repeat the process and add another rift to the cluster
|
|
|
|
while (random.nextInt(MAX_CLUSTER_GROWTH_CHANCE) < CLUSTER_GROWTH_CHANCE);
|
2013-06-14 01:01:54 +02:00
|
|
|
}
|
|
|
|
|
2013-06-16 20:36:32 +02:00
|
|
|
//Randomly decide whether to place a Rift Gateway here.
|
|
|
|
//This only happens if a rift cluster was NOT generated.
|
|
|
|
else if (random.nextInt(MAX_GATEWAY_GENERATION_CHANCE) < properties.GatewayGenerationChance)
|
2013-06-14 01:01:54 +02:00
|
|
|
{
|
2013-06-16 20:36:32 +02:00
|
|
|
//Pick a random point on the surface of the chunk
|
|
|
|
x = chunkX * CHUNK_LENGTH - random.nextInt(CHUNK_LENGTH);
|
|
|
|
z = chunkZ * CHUNK_LENGTH - random.nextInt(CHUNK_LENGTH);
|
|
|
|
y = world.getHeightValue(x, z);
|
|
|
|
|
|
|
|
//Check if the point is within the acceptable altitude range, the block above that point is empty,
|
|
|
|
//and at least one of the two blocks under that point are opaque
|
|
|
|
if (y >= MIN_RIFT_Y && y <= MAX_RIFT_Y && world.isAirBlock(x, y + 1, z) &&
|
|
|
|
world.isBlockOpaqueCube(x, y - 2, z) || world.isBlockOpaqueCube(x, y - 1, z))
|
2013-06-14 01:01:54 +02:00
|
|
|
{
|
2013-06-16 20:36:32 +02:00
|
|
|
//Create a two-way link between the upper block of the gateway and a pocket dimension
|
|
|
|
//That pocket dimension is where we'll start a dungeon!
|
|
|
|
link = new LinkData(world.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, random.nextInt(4));
|
|
|
|
link = dimHelper.instance.createPocket(link, true, true);
|
2013-06-14 01:01:54 +02:00
|
|
|
|
2013-06-16 20:36:32 +02:00
|
|
|
//If the current dimension isn't Limbo, build a Rift Gateway out of Stone Bricks
|
|
|
|
if (world.provider.dimensionId != properties.LimboDimensionID)
|
2013-06-14 01:01:54 +02:00
|
|
|
{
|
2013-06-16 20:36:32 +02:00
|
|
|
blockID = Block.stoneBrick.blockID;
|
|
|
|
|
|
|
|
//Replace some of the ground around the gateway with bricks
|
|
|
|
for (int xc = -GATEWAY_RADIUS; xc <= GATEWAY_RADIUS; xc++)
|
2013-06-14 01:01:54 +02:00
|
|
|
{
|
2013-06-16 20:36:32 +02:00
|
|
|
for (int zc= -GATEWAY_RADIUS; zc <= GATEWAY_RADIUS; zc++)
|
2013-06-14 01:01:54 +02:00
|
|
|
{
|
2013-06-16 20:36:32 +02:00
|
|
|
//Check that the block is supported by an opaque block.
|
|
|
|
//This prevents us from building over a cliff, on the peak of a mountain,
|
|
|
|
//or the surface of the ocean or a frozen lake.
|
|
|
|
if (world.isBlockOpaqueCube(x + xc, y - 2, z + zc))
|
2013-06-14 01:01:54 +02:00
|
|
|
{
|
2013-06-16 20:36:32 +02:00
|
|
|
//Randomly choose whether to place bricks or not. The math is designed so that the
|
|
|
|
//chances of placing a block decrease as we get farther from the gateway's center.
|
2013-06-16 22:03:10 +02:00
|
|
|
if (Math.abs(xc) + Math.abs(zc) < random.nextInt(2) + 3)
|
2013-06-14 01:01:54 +02:00
|
|
|
{
|
2013-06-16 20:36:32 +02:00
|
|
|
//Place Stone Bricks
|
|
|
|
world.setBlock(x + xc, y - 1, z + zc, blockID);
|
|
|
|
}
|
|
|
|
else if (Math.abs(xc) + Math.abs(zc) < random.nextInt(3) + 3)
|
|
|
|
{
|
|
|
|
//Place Cracked Stone Bricks
|
|
|
|
world.setBlock(x + xc, y - 1, z + zc, blockID, 2, 1);
|
2013-06-14 01:01:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-06-16 20:36:32 +02:00
|
|
|
|
|
|
|
//Use Chiseled Stone Bricks to top off the pillars around the door
|
|
|
|
world.setBlock(x, y + 2, z + 1, blockID, 3, 1);
|
|
|
|
world.setBlock(x, y + 2, z - 1, blockID, 3, 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//Build the gateway out of Unraveled Fabric. Since nearly all the blocks in Limbo are of
|
|
|
|
//that type, there is no point replacing the ground. Just build the tops of the columns here.
|
|
|
|
blockID = properties.LimboBlockID;
|
|
|
|
world.setBlock(x, y + 2, z + 1, blockID, 0, 1);
|
|
|
|
world.setBlock(x, y + 2, z - 1, blockID, 0, 1);
|
2013-06-14 01:01:54 +02:00
|
|
|
}
|
2013-06-16 20:36:32 +02:00
|
|
|
|
|
|
|
//Place the shiny transient door into a dungeon
|
|
|
|
ItemRiftBlade.placeDoorBlock(world, x, y + 1, z, 0, mod_pocketDim.transientDoor);
|
|
|
|
|
|
|
|
//Build the columns around the door
|
|
|
|
world.setBlock(x, y + 1, z - 1, blockID, 0, 1);
|
|
|
|
world.setBlock(x, y + 1, z + 1, blockID, 0, 1);
|
|
|
|
world.setBlock(x, y, z - 1, blockID, 0, 1);
|
|
|
|
world.setBlock(x, y, z + 1, blockID, 0, 1);
|
2013-06-14 01:01:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-02-18 03:46:16 +01:00
|
|
|
}
|