private void PopulateChunkWithCave(ByteChunkCursor cursor, int x, int y, int z, int layers, byte cubeId, FastRandom rnd) { cursor.SetInternalPosition(x, y, z); int caveRadius = rnd.Next(3, 8); int layerRadiusModifier = 0; for (int l = 0; l < layers; l++) { //Generate Lake Layers for (int X = x - (caveRadius - layerRadiusModifier); X <= x + (caveRadius - layerRadiusModifier); X++) { for (int Z = z - (caveRadius - layerRadiusModifier); Z <= z + (caveRadius - layerRadiusModifier); Z++) { //Create "Noise" at Cave border if ((X == x - (caveRadius - layerRadiusModifier) || X == x + (caveRadius - layerRadiusModifier) || Z == z - (caveRadius - layerRadiusModifier) || Z == z + (caveRadius - layerRadiusModifier)) && rnd.NextDouble() < 0.2) { continue; } cursor.SetInternalPosition(X, y + l, Z); if (l <= 1 && rnd.NextDouble() < 0.3) { cursor.Write(cubeId); } else { if (l != 0) { if (l == layers - 1) { if (cursor.Read() == UtopiaProcessorParams.CubeId.Stone) { cursor.Write(UtopiaProcessorParams.CubeId.LightWhite); } } else { cursor.Write(UtopiaProcessorParams.CubeId.Air); } } } } } if (layerRadiusModifier < caveRadius) { layerRadiusModifier++; } } }
/// <summary> /// Will create a resource vein /// </summary> /// <param name="cubeId">The resource to be created</param> /// <param name="cursor">Class helper to move inside the Chunk cube data</param> /// <param name="x">InsideChunk X starting position</param> /// <param name="y">InsideChunk Y starting position</param> /// <param name="z">InsideChunk Z starting position</param> /// <param name="qt">Vein size</param> /// <param name="rnd">Random generator for vein creation</param> private void PopulateChunkWithResource(byte cubeId, ByteChunkCursor cursor, int x, int y, int z, int qt, FastRandom rnd) { cursor.SetInternalPosition(x, y, z); int nbrCubePlaced; if (cursor.Read() == UtopiaProcessorParams.CubeId.Stone) { cursor.Write(cubeId); nbrCubePlaced = 1; for (int i = 0; i < qt + 10 && nbrCubePlaced < qt; i++) { int relativeMove = rnd.Next(1, 7); cursor.Move(relativeMove); if (cursor.Read() == UtopiaProcessorParams.CubeId.Stone) { cursor.Write(cubeId); nbrCubePlaced++; } } } }
/// <summary> /// Will create a single Liquid "Source" /// </summary> /// <param name="cubeId">the liquid CubeId</param> /// <param name="cursor">Class helper to move inside the chunk</param> /// <param name="x">InsideChunk X starting position</param> /// <param name="y">InsideChunk Y starting position</param> /// <param name="z">InsideChunk Z starting position</param> private void PopulateChunkWithLiquidSources(byte cubeId, ByteChunkCursor cursor, int x, int y, int z, int liquidPower) { cursor.SetInternalPosition(x, y, z); //Check if this source is candidate as valid source = Must be surrended by 5 solid blocks and ahave one side block going to Air if (cursor.Read() != UtopiaProcessorParams.CubeId.Air) { //Looking Up for Air if (_config.BlockProfiles[cursor.Peek(CursorRelativeMovement.Up)].IsBlockingWater == false || cursor.Peek(CursorRelativeMovement.Up) == UtopiaProcessorParams.CubeId.Snow) { return; } if (_config.BlockProfiles[cursor.Peek(CursorRelativeMovement.Down)].IsBlockingWater == false) { return; } int cpt = 0; //Counting the number of holes arround the source if (_config.BlockProfiles[cursor.Peek(CursorRelativeMovement.East)].IsBlockingWater == false) { cpt++; } if (_config.BlockProfiles[cursor.Peek(CursorRelativeMovement.West)].IsBlockingWater == false) { cpt++; } if (_config.BlockProfiles[cursor.Peek(CursorRelativeMovement.North)].IsBlockingWater == false) { cpt++; } if (_config.BlockProfiles[cursor.Peek(CursorRelativeMovement.South)].IsBlockingWater == false) { cpt++; } //Only one face touching air ==> Createing the Liquid Source ! if (cpt != 1) { return; } cursor.Write(cubeId); Queue <Tuple <ByteChunkCursor, int> > sourcesWithPower = new Queue <Tuple <ByteChunkCursor, int> >(); sourcesWithPower.Enqueue(new Tuple <ByteChunkCursor, int>(cursor, liquidPower)); PropagateLiquidSources(sourcesWithPower, cubeId); } }