Final terrain generation PR fixes
This commit is contained in:
parent
dff8348bc3
commit
30392fae69
@ -19,5 +19,7 @@ namespace TrueCraft.API.World
|
|||||||
byte WaterBlock { get; }
|
byte WaterBlock { get; }
|
||||||
byte SurfaceBlock { get; }
|
byte SurfaceBlock { get; }
|
||||||
byte FillerBlock { get; }
|
byte FillerBlock { get; }
|
||||||
|
int SurfaceDepth { get; }
|
||||||
|
int FillerDepth { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -21,7 +21,7 @@ namespace TrueCraft.Core.Logic.Blocks
|
|||||||
|
|
||||||
public override byte Luminance { get { return 0; } }
|
public override byte Luminance { get { return 0; } }
|
||||||
|
|
||||||
public override bool Opaque { get { return false; } }
|
public override bool Opaque { get { return true; } } // TODO: Distinguish between opaque and instantly destroyable
|
||||||
|
|
||||||
public override byte LightModifier { get { return 255; } }
|
public override byte LightModifier { get { return 255; } }
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ namespace TrueCraft.Core.Logic.Blocks
|
|||||||
|
|
||||||
var currentLevel = world.GetMetadata(coords);
|
var currentLevel = world.GetMetadata(coords);
|
||||||
var blockBelow = world.BlockRepository.GetBlockProvider(world.GetBlockID(coords + Coordinates3D.Down));
|
var blockBelow = world.BlockRepository.GetBlockProvider(world.GetBlockID(coords + Coordinates3D.Down));
|
||||||
if (!blockBelow.Opaque && blockBelow.ID != FlowingID && blockBelow.ID != StillID)
|
if (blockBelow.Hardness == 0 && blockBelow.ID != FlowingID && blockBelow.ID != StillID)
|
||||||
{
|
{
|
||||||
outwardFlow.Add(new LiquidFlow(coords + Coordinates3D.Down, 1));
|
outwardFlow.Add(new LiquidFlow(coords + Coordinates3D.Down, 1));
|
||||||
if (currentLevel != 0)
|
if (currentLevel != 0)
|
||||||
@ -232,7 +232,7 @@ namespace TrueCraft.Core.Logic.Blocks
|
|||||||
continue;
|
continue;
|
||||||
var check = new Coordinates3D(x: x, z: z) + Coordinates3D.Down;
|
var check = new Coordinates3D(x: x, z: z) + Coordinates3D.Down;
|
||||||
var c = world.BlockRepository.GetBlockProvider(world.GetBlockID(check + coords));
|
var c = world.BlockRepository.GetBlockProvider(world.GetBlockID(check + coords));
|
||||||
if (!c.Opaque)
|
if (c.Hardness == 0)
|
||||||
{
|
{
|
||||||
if (!LineOfSight(world, check + coords, coords))
|
if (!LineOfSight(world, check + coords, coords))
|
||||||
continue;
|
continue;
|
||||||
@ -288,7 +288,7 @@ namespace TrueCraft.Core.Logic.Blocks
|
|||||||
for (int i = 0; i < Neighbors.Length; i++)
|
for (int i = 0; i < Neighbors.Length; i++)
|
||||||
{
|
{
|
||||||
var b = world.BlockRepository.GetBlockProvider(world.GetBlockID(coords + Neighbors[i]));
|
var b = world.BlockRepository.GetBlockProvider(world.GetBlockID(coords + Neighbors[i]));
|
||||||
if (!b.Opaque && b.ID != StillID && b.ID != FlowingID)
|
if (b.Hardness == 0 && b.ID != StillID && b.ID != FlowingID)
|
||||||
outwardFlow.Add(new LiquidFlow(Neighbors[i] + coords, (byte)(currentLevel + 1)));
|
outwardFlow.Add(new LiquidFlow(Neighbors[i] + coords, (byte)(currentLevel + 1)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -310,7 +310,7 @@ namespace TrueCraft.Core.Logic.Blocks
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
var p = world.BlockRepository.GetBlockProvider(world.GetBlockID(candidate));
|
var p = world.BlockRepository.GetBlockProvider(world.GetBlockID(candidate));
|
||||||
if (p.Opaque)
|
if (p.Hardness != 0)
|
||||||
return false;
|
return false;
|
||||||
candidate.Z += direction.Z;
|
candidate.Z += direction.Z;
|
||||||
} while (target.Z != candidate.Z);
|
} while (target.Z != candidate.Z);
|
||||||
|
@ -72,14 +72,22 @@ namespace TrueCraft.Core.TerrainGen.Biomes
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The main surface block used for the terrain of the biome.
|
/// The main surface block used for the terrain of the biome.
|
||||||
/// Note: This field may be removed in the future.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual byte SurfaceBlock { get { return GrassBlock.BlockID; } }
|
public virtual byte SurfaceBlock { get { return GrassBlock.BlockID; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The main "filler" block found under the surface block in the terrain of the biome.
|
/// The main "filler" block found under the surface block in the terrain of the biome.
|
||||||
/// Note: This field may be removed in the future.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual byte FillerBlock { get { return StoneBlock.BlockID; } }
|
public virtual byte FillerBlock { get { return DirtBlock.BlockID; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The depth of the surface block layer
|
||||||
|
/// </summary>
|
||||||
|
public virtual int SurfaceDepth { get { return 1; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The depth of the "filler" blocks located below the surface block layer
|
||||||
|
/// </summary>
|
||||||
|
public virtual int FillerDepth { get { return 4; } }
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -57,5 +57,13 @@ namespace TrueCraft.Core.TerrainGen.Biomes
|
|||||||
return SandstoneBlock.BlockID;
|
return SandstoneBlock.BlockID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override int SurfaceDepth
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -33,21 +33,5 @@ namespace TrueCraft.Core.TerrainGen.Biomes
|
|||||||
return new PlantSpecies[] { PlantSpecies.TallGrass };
|
return new PlantSpecies[] { PlantSpecies.TallGrass };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte SurfaceBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GrassBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte FillerBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return DirtBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -33,21 +33,5 @@ namespace TrueCraft.Core.TerrainGen.Biomes
|
|||||||
return new TreeSpecies[] { TreeSpecies.Oak };
|
return new TreeSpecies[] { TreeSpecies.Oak };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte SurfaceBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GrassBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte FillerBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return DirtBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -49,21 +49,5 @@ namespace TrueCraft.Core.TerrainGen.Biomes
|
|||||||
return new PlantSpecies[] { PlantSpecies.Fern, PlantSpecies.TallGrass };
|
return new PlantSpecies[] { PlantSpecies.Fern, PlantSpecies.TallGrass };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte SurfaceBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GrassBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte FillerBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return DirtBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -49,21 +49,5 @@ namespace TrueCraft.Core.TerrainGen.Biomes
|
|||||||
return 50;
|
return 50;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte SurfaceBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GrassBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte FillerBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return DirtBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -33,21 +33,5 @@ namespace TrueCraft.Core.TerrainGen.Biomes
|
|||||||
return new PlantSpecies[] { PlantSpecies.Fern, PlantSpecies.TallGrass };
|
return new PlantSpecies[] { PlantSpecies.Fern, PlantSpecies.TallGrass };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte SurfaceBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GrassBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte FillerBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return DirtBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -41,21 +41,5 @@ namespace TrueCraft.Core.TerrainGen.Biomes
|
|||||||
return new PlantSpecies[0];
|
return new PlantSpecies[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte SurfaceBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GrassBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte FillerBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return DirtBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -41,21 +41,5 @@ namespace TrueCraft.Core.TerrainGen.Biomes
|
|||||||
return new PlantSpecies[] { PlantSpecies.SugarCane };
|
return new PlantSpecies[] { PlantSpecies.SugarCane };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte SurfaceBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GrassBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte FillerBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return DirtBlock.BlockID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -34,19 +34,11 @@ namespace TrueCraft.Core.TerrainGen.Biomes
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte SurfaceBlock
|
public override double TreeDensity
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return GrassBlock.BlockID;
|
return 5;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte FillerBlock
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return DirtBlock.BlockID;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,16 +25,18 @@ namespace TrueCraft.Core.TerrainGen.Decorators
|
|||||||
IBiomeProvider Biome = biomes.GetBiome(chunk.Biomes[X * Chunk.Width + Z]);
|
IBiomeProvider Biome = biomes.GetBiome(chunk.Biomes[X * Chunk.Width + Z]);
|
||||||
var BlockX = MathHelper.ChunkToBlockX(X, chunk.Coordinates.X);
|
var BlockX = MathHelper.ChunkToBlockX(X, chunk.Coordinates.X);
|
||||||
var BlockZ = MathHelper.ChunkToBlockZ(Z, chunk.Coordinates.Z);
|
var BlockZ = MathHelper.ChunkToBlockZ(Z, chunk.Coordinates.Z);
|
||||||
var Height = chunk.HeightMap[X * Chunk.Width + Z] + 1;
|
var Height = chunk.HeightMap[X * Chunk.Width + Z];
|
||||||
if (Biome.Plants.Contains(PlantSpecies.Cactus) && ChanceNoise.Value2D(BlockX, BlockZ) > 1.3)
|
if (Biome.Plants.Contains(PlantSpecies.Cactus) && ChanceNoise.Value2D(BlockX, BlockZ) > 1.7)
|
||||||
{
|
{
|
||||||
if (chunk.GetBlockID(new Coordinates3D(X, Height - 1, Z)).Equals(SandBlock.BlockID))
|
Coordinates3D BlockLocation = new Coordinates3D(X, Height, Z);
|
||||||
|
Coordinates3D CactiPosition = BlockLocation + Coordinates3D.Up;
|
||||||
|
if (chunk.GetBlockID(BlockLocation).Equals(SandBlock.BlockID))
|
||||||
{
|
{
|
||||||
var HeightChance = ChanceNoise.Value2D(BlockX, BlockZ);
|
var HeightChance = ChanceNoise.Value2D(BlockX, BlockZ);
|
||||||
var CactusHeight = (HeightChance < 1.4) ? 2 : 3;
|
var CactusHeight = (HeightChance < 1.4) ? 2 : 3;
|
||||||
for (int Y = Height; Y < Height + CactusHeight; Y++)
|
for (int Y = CactiPosition.Y; Y < CactiPosition.Y + CactusHeight; Y++)
|
||||||
{
|
{
|
||||||
chunk.SetBlockID(new Coordinates3D(X, Y, Z), CactusBlock.BlockID);
|
chunk.SetBlockID(new Coordinates3D(CactiPosition.X, Y, CactiPosition.Z), CactusBlock.BlockID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,18 +23,20 @@ namespace TrueCraft.Core.TerrainGen.Decorators
|
|||||||
var Height = chunk.HeightMap[X * Chunk.Width + Z];
|
var Height = chunk.HeightMap[X * Chunk.Width + Z];
|
||||||
for (int Y = Height; Y < Chunk.Height; Y++)
|
for (int Y = Height; Y < Chunk.Height; Y++)
|
||||||
{
|
{
|
||||||
if (Height < Chunk.Height - 1)
|
Coordinates3D Location = new Coordinates3D(X, Y, Z);
|
||||||
|
if (chunk.GetBlockID(Location).Equals(StationaryWaterBlock.BlockID) || chunk.GetBlockID(Location).Equals(WaterBlock.BlockID))
|
||||||
{
|
{
|
||||||
if (chunk.GetBlockID(new Coordinates3D(X, Height, Z)).Equals(StationaryWaterBlock.BlockID))
|
chunk.SetBlockID(Location, IceBlock.BlockID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (chunk.GetBlockID(Location).Equals(IceBlock.BlockID) && CoverIce(chunk, biomes, Location))
|
||||||
{
|
{
|
||||||
chunk.SetBlockID(new Coordinates3D(X, Height, Z), IceBlock.BlockID);
|
chunk.SetBlockID((Location + Coordinates3D.Up), SnowfallBlock.BlockID);
|
||||||
}
|
}
|
||||||
else
|
else if (!chunk.GetBlockID(Location).Equals(SnowfallBlock.BlockID) && !chunk.GetBlockID(Location).Equals(AirBlock.BlockID))
|
||||||
{
|
{
|
||||||
if (!chunk.GetBlockID(new Coordinates3D(X, Height, Z)).Equals(SnowfallBlock.BlockID) && !chunk.GetBlockID(new Coordinates3D(X, Height, Z)).Equals(0))
|
chunk.SetBlockID((Location + Coordinates3D.Up), SnowfallBlock.BlockID);
|
||||||
{
|
|
||||||
chunk.SetBlockID(new Coordinates3D(X, Height + 1, Z), SnowfallBlock.BlockID);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -42,5 +44,26 @@ namespace TrueCraft.Core.TerrainGen.Decorators
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CoverIce(IChunk chunk, IBiomeRepository biomes, Coordinates3D Location)
|
||||||
|
{
|
||||||
|
var MaxDistance = 4;
|
||||||
|
var Surrounding = new[] {
|
||||||
|
Location + new Coordinates3D(-MaxDistance, 0, 0),
|
||||||
|
Location + new Coordinates3D(MaxDistance, 0, 0),
|
||||||
|
Location + new Coordinates3D(0, 0, MaxDistance),
|
||||||
|
Location + new Coordinates3D(0, 0, -MaxDistance),
|
||||||
|
};
|
||||||
|
for (int I = 0; I < Surrounding.Length; I++)
|
||||||
|
{
|
||||||
|
Coordinates3D Check = Surrounding[I];
|
||||||
|
if (Check.X < 0 || Check.X >= Chunk.Width || Check.Z < 0 || Check.Z >= Chunk.Depth || Check.Y < 0 || Check.Y >= Chunk.Height)
|
||||||
|
return false;
|
||||||
|
IBiomeProvider Biome = biomes.GetBiome(chunk.Biomes[Check.X * Chunk.Width + Check.Z]);
|
||||||
|
if (chunk.GetBlockID(Check).Equals(Biome.SurfaceBlock) || chunk.GetBlockID(Check).Equals(Biome.FillerBlock))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -97,7 +97,7 @@ namespace TrueCraft.Core.TerrainGen.Decorators
|
|||||||
if (X >= 0 && Z >= 0 && Y >= Data.MinY && X < Chunk.Width && Y < Data.MaxY && Z < Chunk.Depth)
|
if (X >= 0 && Z >= 0 && Y >= Data.MinY && X < Chunk.Width && Y < Data.MaxY && Z < Chunk.Depth)
|
||||||
{
|
{
|
||||||
IBiomeProvider Biome = biomes.GetBiome(chunk.Biomes[(int)(X * Chunk.Width + Z)]);
|
IBiomeProvider Biome = biomes.GetBiome(chunk.Biomes[(int)(X * Chunk.Width + Z)]);
|
||||||
if (Biome.Ores.Contains(Data.Type) && chunk.GetBlockID(new Coordinates3D((int)X, (int)Y, (int)Z)).Equals(GlassBlock.BlockID))
|
if (Biome.Ores.Contains(Data.Type) && chunk.GetBlockID(new Coordinates3D((int)X, (int)Y, (int)Z)).Equals(StoneBlock.BlockID))
|
||||||
{
|
{
|
||||||
chunk.SetBlockID(new Coordinates3D((int)X, (int)Y, (int)Z), Data.ID);
|
chunk.SetBlockID(new Coordinates3D((int)X, (int)Y, (int)Z), Data.ID);
|
||||||
}
|
}
|
||||||
@ -128,7 +128,7 @@ namespace TrueCraft.Core.TerrainGen.Decorators
|
|||||||
if (NewX >= 0 && NewZ >= 0 && NewY >= Data.MinY && NewX < Chunk.Width && NewY < Data.MaxY && NewZ < Chunk.Depth)
|
if (NewX >= 0 && NewZ >= 0 && NewY >= Data.MinY && NewX < Chunk.Width && NewY < Data.MaxY && NewZ < Chunk.Depth)
|
||||||
{
|
{
|
||||||
IBiomeProvider Biome = biomes.GetBiome(chunk.Biomes[NewX * Chunk.Width + NewZ]);
|
IBiomeProvider Biome = biomes.GetBiome(chunk.Biomes[NewX * Chunk.Width + NewZ]);
|
||||||
if (Biome.Ores.Contains(Data.Type) && chunk.GetBlockID(new Coordinates3D((int)NewX, (int)NewY, (int)NewZ)).Equals(GlassBlock.BlockID))
|
if (Biome.Ores.Contains(Data.Type) && chunk.GetBlockID(new Coordinates3D((int)NewX, (int)NewY, (int)NewZ)).Equals(StoneBlock.BlockID))
|
||||||
{
|
{
|
||||||
chunk.SetBlockID(new Coordinates3D((int)NewX, (int)NewY, (int)NewZ), Data.ID);
|
chunk.SetBlockID(new Coordinates3D((int)NewX, (int)NewY, (int)NewZ), Data.ID);
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,6 @@ namespace TrueCraft.Core.TerrainGen.Decorators
|
|||||||
var BlockX = MathHelper.ChunkToBlockX(X, chunk.Coordinates.X);
|
var BlockX = MathHelper.ChunkToBlockX(X, chunk.Coordinates.X);
|
||||||
var BlockZ = MathHelper.ChunkToBlockZ(Z, chunk.Coordinates.Z);
|
var BlockZ = MathHelper.ChunkToBlockZ(Z, chunk.Coordinates.Z);
|
||||||
var Height = chunk.HeightMap[X * Chunk.Width + Z];
|
var Height = chunk.HeightMap[X * Chunk.Width + Z];
|
||||||
Coordinates3D Below = new Coordinates3D(X, Height, Z) + Coordinates3D.Down;
|
|
||||||
if (Noise.Value2D(BlockX, BlockZ) > 0.25)
|
if (Noise.Value2D(BlockX, BlockZ) > 0.25)
|
||||||
{
|
{
|
||||||
Coordinates3D BlockLocation = new Coordinates3D(X, Height, Z);
|
Coordinates3D BlockLocation = new Coordinates3D(X, Height, Z);
|
||||||
|
@ -24,18 +24,24 @@ namespace TrueCraft.Core.TerrainGen.Decorators
|
|||||||
{
|
{
|
||||||
Coordinates3D BlockLocation = new Coordinates3D(X, Y, Z);
|
Coordinates3D BlockLocation = new Coordinates3D(X, Y, Z);
|
||||||
int BlockID = chunk.GetBlockID(BlockLocation);
|
int BlockID = chunk.GetBlockID(BlockLocation);
|
||||||
if (BlockID.Equals(0))
|
if (BlockID.Equals(AirBlock.BlockID))
|
||||||
{
|
{
|
||||||
chunk.SetBlockID(BlockLocation, Biome.WaterBlock);
|
chunk.SetBlockID(BlockLocation, Biome.WaterBlock);
|
||||||
Coordinates3D Below = BlockLocation + Coordinates3D.Down;
|
Coordinates3D Below = BlockLocation + Coordinates3D.Down;
|
||||||
if (!chunk.GetBlockID(Below).Equals(0) && !chunk.GetBlockID(Below).Equals(Biome.WaterBlock))
|
if (!chunk.GetBlockID(Below).Equals(AirBlock.BlockID) && !chunk.GetBlockID(Below).Equals(Biome.WaterBlock))
|
||||||
{
|
{
|
||||||
Random R = new Random(world.Seed);
|
if (!Biome.WaterBlock.Equals(LavaBlock.BlockID) && !Biome.WaterBlock.Equals(StationaryLavaBlock.BlockID))
|
||||||
double Chance = R.NextDouble();
|
{
|
||||||
if (Chance < 0.15)
|
Random R = new Random(world.Seed);
|
||||||
chunk.SetBlockID(Below, ClayBlock.BlockID);
|
if (R.Next(100) < 40)
|
||||||
else
|
{
|
||||||
chunk.SetBlockID(Below, SandBlock.BlockID);
|
chunk.SetBlockID(Below, ClayBlock.BlockID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
chunk.SetBlockID(Below, SandBlock.BlockID);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,37 +20,49 @@ namespace TrueCraft.Core.TerrainGen
|
|||||||
BiomeRepository Biomes = new BiomeRepository();
|
BiomeRepository Biomes = new BiomeRepository();
|
||||||
Perlin HighNoise = new Perlin();
|
Perlin HighNoise = new Perlin();
|
||||||
Perlin LowNoise = new Perlin();
|
Perlin LowNoise = new Perlin();
|
||||||
|
Perlin BottomNoise = new Perlin();
|
||||||
ClampNoise HighClamp;
|
ClampNoise HighClamp;
|
||||||
ClampNoise LowClamp;
|
ClampNoise LowClamp;
|
||||||
|
ClampNoise BottomClamp;
|
||||||
|
ModifyNoise Modified;
|
||||||
private int GroundLevel = 50;
|
private int GroundLevel = 50;
|
||||||
public NewGenerator(bool SingleBiome = false, byte GenerateBiome = (byte)Biome.Plains)
|
public NewGenerator(bool SingleBiome = false, byte GenerateBiome = (byte)Biome.Plains)
|
||||||
{
|
{
|
||||||
this.SingleBiome = SingleBiome;
|
this.SingleBiome = SingleBiome;
|
||||||
this.GenerationBiome = GenerateBiome;
|
this.GenerationBiome = GenerateBiome;
|
||||||
HighNoise.Persistance = 1;
|
HighNoise.Persistance = 1;
|
||||||
HighNoise.Frequency = 0.023;
|
HighNoise.Frequency = 0.013;
|
||||||
HighNoise.Amplitude = 14;
|
HighNoise.Amplitude = 10;
|
||||||
HighNoise.Octaves = 2;
|
HighNoise.Octaves = 2;
|
||||||
HighNoise.Lacunarity = 2;
|
HighNoise.Lacunarity = 2;
|
||||||
LowNoise.Persistance = 1;
|
LowNoise.Persistance = 1;
|
||||||
LowNoise.Frequency = 0.023;
|
LowNoise.Frequency = 0.008;
|
||||||
LowNoise.Amplitude = 5;
|
LowNoise.Amplitude = 14;
|
||||||
LowNoise.Octaves = 2;
|
LowNoise.Octaves = 2;
|
||||||
LowNoise.Lacunarity = 2;
|
LowNoise.Lacunarity = 2.5;
|
||||||
HighClamp = new ClampNoise(HighClamp);
|
BottomNoise.Persistance = 0.5;
|
||||||
HighClamp.MinValue = 0;
|
BottomNoise.Frequency = 0.013;
|
||||||
HighClamp.MaxValue = 20;
|
BottomNoise.Amplitude = 5;
|
||||||
|
BottomNoise.Octaves = 2;
|
||||||
|
BottomNoise.Lacunarity = 1.5;
|
||||||
|
HighClamp = new ClampNoise(HighNoise);
|
||||||
|
HighClamp.MinValue = -10;
|
||||||
|
HighClamp.MaxValue = 25;
|
||||||
LowClamp = new ClampNoise(LowNoise);
|
LowClamp = new ClampNoise(LowNoise);
|
||||||
LowClamp.MinValue = -20;
|
LowClamp.MinValue = -30;
|
||||||
LowClamp.MaxValue = 20;
|
LowClamp.MaxValue = 30;
|
||||||
|
BottomClamp = new ClampNoise(BottomNoise);
|
||||||
|
BottomClamp.MinValue = -20;
|
||||||
|
BottomClamp.MaxValue = 5;
|
||||||
|
Modified = new ModifyNoise(HighClamp, LowClamp, NoiseModifier.Add);
|
||||||
ChunkDecorators = new List<IChunkDecorator>();
|
ChunkDecorators = new List<IChunkDecorator>();
|
||||||
ChunkDecorators.Add(new WaterDecorator());
|
ChunkDecorators.Add(new WaterDecorator());
|
||||||
|
ChunkDecorators.Add(new OreDecorator());
|
||||||
ChunkDecorators.Add(new TreeDecorator());
|
ChunkDecorators.Add(new TreeDecorator());
|
||||||
ChunkDecorators.Add(new FreezeDecorator());
|
ChunkDecorators.Add(new FreezeDecorator());
|
||||||
ChunkDecorators.Add(new PlantDecorator());
|
ChunkDecorators.Add(new PlantDecorator());
|
||||||
ChunkDecorators.Add(new CactusDecorator());
|
ChunkDecorators.Add(new CactusDecorator());
|
||||||
ChunkDecorators.Add(new SugarCaneDecorator());
|
ChunkDecorators.Add(new SugarCaneDecorator());
|
||||||
ChunkDecorators.Add(new OreDecorator());
|
|
||||||
ChunkDecorators.Add(new DungeonDecorator(GroundLevel));
|
ChunkDecorators.Add(new DungeonDecorator(GroundLevel));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,13 +72,12 @@ namespace TrueCraft.Core.TerrainGen
|
|||||||
public byte GenerationBiome { get; private set; }
|
public byte GenerationBiome { get; private set; }
|
||||||
public IChunk GenerateChunk(IWorld world, Coordinates2D coordinates)
|
public IChunk GenerateChunk(IWorld world, Coordinates2D coordinates)
|
||||||
{
|
{
|
||||||
int FeaturePointDistance = 90;
|
int FeaturePointDistance = 400;
|
||||||
CellNoise Worley = new CellNoise();
|
|
||||||
Worley.Seed = world.Seed;
|
|
||||||
int Seed = world.Seed;
|
int Seed = world.Seed;
|
||||||
|
CellNoise Worley = new CellNoise();
|
||||||
|
Worley.Seed = Seed;
|
||||||
HighNoise.Seed = Seed;
|
HighNoise.Seed = Seed;
|
||||||
LowNoise.Seed = Seed;
|
LowNoise.Seed = Seed;
|
||||||
ModifyNoise Modified = new ModifyNoise(HighNoise, LowNoise, NoiseModifier.Add);
|
|
||||||
var chunk = new Chunk(coordinates);
|
var chunk = new Chunk(coordinates);
|
||||||
for (int X = 0; X < 16; X++)
|
for (int X = 0; X < 16; X++)
|
||||||
{
|
{
|
||||||
@ -74,6 +85,20 @@ namespace TrueCraft.Core.TerrainGen
|
|||||||
{
|
{
|
||||||
var BlockX = MathHelper.ChunkToBlockX(X, coordinates.X);
|
var BlockX = MathHelper.ChunkToBlockX(X, coordinates.X);
|
||||||
var BlockZ = MathHelper.ChunkToBlockZ(Z, coordinates.Z);
|
var BlockZ = MathHelper.ChunkToBlockZ(Z, coordinates.Z);
|
||||||
|
double LowClampMid = LowClamp.MaxValue - ((LowClamp.MaxValue + LowClamp.MinValue) / 2);
|
||||||
|
double LowClampRange = 5;
|
||||||
|
double LowClampValue = LowClamp.Value2D(BlockX, BlockZ);
|
||||||
|
if (LowClampValue > LowClampMid - LowClampRange && LowClampValue < LowClampMid + LowClampRange)
|
||||||
|
{
|
||||||
|
InvertNoise NewPrimary = new InvertNoise(HighClamp);
|
||||||
|
Modified.PrimaryNoise = NewPrimary;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//reset it after modifying the values
|
||||||
|
Modified = new ModifyNoise(HighClamp, LowClamp, NoiseModifier.Add);
|
||||||
|
}
|
||||||
|
Modified = new ModifyNoise(Modified, BottomClamp, NoiseModifier.Subtract);
|
||||||
var CellValue = Worley.Value2D(BlockX, BlockZ);
|
var CellValue = Worley.Value2D(BlockX, BlockZ);
|
||||||
var Location = new Coordinates2D(BlockX, BlockZ);
|
var Location = new Coordinates2D(BlockX, BlockZ);
|
||||||
if (world.BiomeDiagram.BiomeCells.Count < 1 || CellValue.Equals(1) && world.BiomeDiagram.ClosestCellPoint(Location) >= FeaturePointDistance)
|
if (world.BiomeDiagram.BiomeCells.Count < 1 || CellValue.Equals(1) && world.BiomeDiagram.ClosestCellPoint(Location) >= FeaturePointDistance)
|
||||||
@ -87,7 +112,8 @@ namespace TrueCraft.Core.TerrainGen
|
|||||||
IBiomeProvider Biome = Biomes.GetBiome(BiomeID);
|
IBiomeProvider Biome = Biomes.GetBiome(BiomeID);
|
||||||
chunk.Biomes[X * Chunk.Width + Z] = BiomeID;
|
chunk.Biomes[X * Chunk.Width + Z] = BiomeID;
|
||||||
|
|
||||||
var Height = GetHeight(BlockX, BlockZ, Modified);
|
var Height = GetHeight(BlockX, BlockZ);
|
||||||
|
var SurfaceHeight = Height - Biome.SurfaceDepth;
|
||||||
chunk.HeightMap[X * Chunk.Width + Z] = Height;
|
chunk.HeightMap[X * Chunk.Width + Z] = Height;
|
||||||
for (int Y = 0; Y <= Height; Y++)
|
for (int Y = 0; Y <= Height; Y++)
|
||||||
{
|
{
|
||||||
@ -97,13 +123,13 @@ namespace TrueCraft.Core.TerrainGen
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Y.Equals(Height))
|
if (Y.Equals(Height) || Y < Height && Y > SurfaceHeight)
|
||||||
{
|
{
|
||||||
chunk.SetBlockID(new Coordinates3D(X, Y, Z), Biome.SurfaceBlock);
|
chunk.SetBlockID(new Coordinates3D(X, Y, Z), Biome.SurfaceBlock);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Y < Height && Y > Height - 4)
|
if (Y > SurfaceHeight - Biome.FillerDepth)
|
||||||
{
|
{
|
||||||
chunk.SetBlockID(new Coordinates3D(X, Y, Z), Biome.FillerBlock);
|
chunk.SetBlockID(new Coordinates3D(X, Y, Z), Biome.FillerBlock);
|
||||||
}
|
}
|
||||||
@ -121,7 +147,7 @@ namespace TrueCraft.Core.TerrainGen
|
|||||||
ChunkDecorator.Decorate(world, chunk, Biomes);
|
ChunkDecorator.Decorate(world, chunk, Biomes);
|
||||||
}
|
}
|
||||||
var SpawnOffset = 2;
|
var SpawnOffset = 2;
|
||||||
var SpawnPointHeight = GetHeight(0, 0, Modified);
|
var SpawnPointHeight = GetHeight(0, 0);
|
||||||
if (SpawnPointHeight + SpawnOffset < Chunk.Height)
|
if (SpawnPointHeight + SpawnOffset < Chunk.Height)
|
||||||
SpawnPointHeight += SpawnOffset;
|
SpawnPointHeight += SpawnOffset;
|
||||||
SpawnPoint = new Vector3(0, SpawnPointHeight, 0);
|
SpawnPoint = new Vector3(0, SpawnPointHeight, 0);
|
||||||
@ -137,9 +163,9 @@ namespace TrueCraft.Core.TerrainGen
|
|||||||
return world.BiomeDiagram.GetBiome(Location);
|
return world.BiomeDiagram.GetBiome(Location);
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetHeight(int X, int Z, INoise Noise)
|
int GetHeight(int X, int Z)
|
||||||
{
|
{
|
||||||
var NoiseValue = Noise.Value2D(X, Z) + GroundLevel;
|
var NoiseValue = Modified.Value2D(X, Z) + GroundLevel;
|
||||||
if (NoiseValue < 0)
|
if (NoiseValue < 0)
|
||||||
NoiseValue = GroundLevel;
|
NoiseValue = GroundLevel;
|
||||||
if (NoiseValue > Chunk.Height)
|
if (NoiseValue > Chunk.Height)
|
||||||
|
@ -3,6 +3,8 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using TrueCraft.API.World;
|
using TrueCraft.API.World;
|
||||||
|
using TrueCraft.API;
|
||||||
|
using TrueCraft.Core.World;
|
||||||
|
|
||||||
namespace TrueCraft.Core.TerrainGen.Noise
|
namespace TrueCraft.Core.TerrainGen.Noise
|
||||||
{
|
{
|
||||||
@ -52,9 +54,20 @@ namespace TrueCraft.Core.TerrainGen.Noise
|
|||||||
return Point0 * (1 - T) + Point1 * T;
|
return Point0 * (1 - T) + Point1 * T;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static double[] ExpandData()
|
public static double BiLinearInterpolate(double X, double Y, double Point00, double Point01, double Point10, double Point11)
|
||||||
{
|
{
|
||||||
return new double[0];
|
double Point0 = LinearInterpolate(Point00, Point10, X);
|
||||||
|
double Point1 = LinearInterpolate(Point01, Point11, X);
|
||||||
|
|
||||||
|
return LinearInterpolate(Point0, Point1, Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double TriLinearInterpolate(double X, double Y, double Z, double Point000, double Point001, double Point010, double Point100, double Point011, double Point101, double Point110, double Point111)
|
||||||
|
{
|
||||||
|
double Point0 = BiLinearInterpolate(X, Y, Point000, Point001, Point100, Point101);
|
||||||
|
double Point1 = BiLinearInterpolate(X, Y, Point010, Point011, Point110, Point111);
|
||||||
|
|
||||||
|
return LinearInterpolate(Point0, Point1, Z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,6 +39,11 @@ namespace TrueCraft.Core.TerrainGen.Noise
|
|||||||
}
|
}
|
||||||
|
|
||||||
public OpenSimplex(long Seed)
|
public OpenSimplex(long Seed)
|
||||||
|
{
|
||||||
|
SetSeed(Seed);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetSeed(long Seed)
|
||||||
{
|
{
|
||||||
Perm = new short[256];
|
Perm = new short[256];
|
||||||
PermGradIndex3D = new short[256];
|
PermGradIndex3D = new short[256];
|
||||||
@ -48,7 +53,8 @@ namespace TrueCraft.Core.TerrainGen.Noise
|
|||||||
Seed = Seed * 6364136223846793005L + 1442695040888963407L;
|
Seed = Seed * 6364136223846793005L + 1442695040888963407L;
|
||||||
Seed = Seed * 6364136223846793005L + 1442695040888963407L;
|
Seed = Seed * 6364136223846793005L + 1442695040888963407L;
|
||||||
Seed = Seed * 6364136223846793005L + 1442695040888963407L;
|
Seed = Seed * 6364136223846793005L + 1442695040888963407L;
|
||||||
for (int I = 255; I >= 0; I--) {
|
for (int I = 255; I >= 0; I--)
|
||||||
|
{
|
||||||
Seed = Seed * 6364136223846793005L + 1442695040888963407L;
|
Seed = Seed * 6364136223846793005L + 1442695040888963407L;
|
||||||
int R = (int)((Seed + 31) % (I + 1));
|
int R = (int)((Seed + 31) % (I + 1));
|
||||||
if (R < 0)
|
if (R < 0)
|
||||||
|
@ -21,10 +21,6 @@ namespace TrueCraft
|
|||||||
{
|
{
|
||||||
// TODO: Make this more flexible
|
// TODO: Make this more flexible
|
||||||
var server = new MultiplayerServer();
|
var server = new MultiplayerServer();
|
||||||
#if DEBUG
|
|
||||||
if (Directory.Exists("world"))
|
|
||||||
Directory.Delete("world", true);
|
|
||||||
#endif
|
|
||||||
IWorld world;
|
IWorld world;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user