Skip to content
This repository was archived by the owner on Nov 9, 2017. It is now read-only.
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 20 additions & 20 deletions source/Craft.Net.Anvil/World.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ public World(string name, IWorldGenerator worldGenerator) : this(name)
WorldGenerator = worldGenerator;
}

private Coordinates2D ChunkCoordinatesToRegion(Coordinates2D coordinates)
{
return new Coordinates2D(
(coordinates.X + ((coordinates.X < 0) ? 1 : 0)) / Region.Width - ((coordinates.X < 0) ? 1 : 0),
(coordinates.Z + ((coordinates.Z < 0) ? 1 : 0)) / Region.Depth - ((coordinates.Z < 0) ? 1 : 0));
}

public static World LoadWorld(string baseDirectory)
{
if (!Directory.Exists(baseDirectory))
Expand All @@ -50,43 +57,38 @@ public Chunk FindChunk(Coordinates3D coordinates)

public Chunk GetChunk(Coordinates2D coordinates)
{
int regionX = coordinates.X / Region.Width - ((coordinates.X < 0) ? 1 : 0);
int regionZ = coordinates.Z / Region.Depth - ((coordinates.Z < 0) ? 1 : 0);
var regionPosition = ChunkCoordinatesToRegion(coordinates);

var region = LoadOrGenerateRegion(new Coordinates2D(regionX, regionZ));
return region.GetChunk(new Coordinates2D(coordinates.X - regionX * 32, coordinates.Z - regionZ * 32));
var region = LoadOrGenerateRegion(regionPosition);
return region.GetChunk(new Coordinates2D(coordinates.X - regionPosition.X * 32, coordinates.Z - regionPosition.Z * 32));
}

public void GenerateChunk(Coordinates2D coordinates)
{
int regionX = coordinates.X / Region.Width - ((coordinates.X < 0) ? 1 : 0);
int regionZ = coordinates.Z / Region.Depth - ((coordinates.Z < 0) ? 1 : 0);
var regionPosition = ChunkCoordinatesToRegion(coordinates);

var region = LoadOrGenerateRegion(new Coordinates2D(regionX, regionZ));
region.GenerateChunk(new Coordinates2D(coordinates.X - regionX * 32, coordinates.Z - regionZ * 32));
var region = LoadOrGenerateRegion(regionPosition);
region.GenerateChunk(new Coordinates2D(coordinates.X - regionPosition.X * 32, coordinates.Z - regionPosition.Z * 32));
}

public Chunk GetChunkWithoutGeneration(Coordinates2D coordinates)
{
int regionX = coordinates.X / Region.Width - ((coordinates.X < 0) ? 1 : 0);
int regionZ = coordinates.Z / Region.Depth - ((coordinates.Z < 0) ? 1 : 0);
var regionPosition = ChunkCoordinatesToRegion(coordinates);

var regionPosition = new Coordinates2D(regionX, regionZ);
if (!Regions.ContainsKey(regionPosition)) return null;
return Regions[regionPosition].GetChunkWithoutGeneration(
new Coordinates2D(coordinates.X - regionX * 32, coordinates.Z - regionZ * 32));
new Coordinates2D(coordinates.X - regionPosition.X * 32, coordinates.Z - regionPosition.Z * 32));
}

public void SetChunk(Coordinates2D coordinates, Chunk chunk)
{
int regionX = coordinates.X / Region.Width - ((coordinates.X < 0) ? 1 : 0);
int regionZ = coordinates.Z / Region.Depth - ((coordinates.Z < 0) ? 1 : 0);
var regionPosition = ChunkCoordinatesToRegion(coordinates);

var region = LoadOrGenerateRegion(new Coordinates2D(regionX, regionZ));
var region = LoadOrGenerateRegion(regionPosition);
lock (region)
{
chunk.IsModified = true;
region.SetChunk(new Coordinates2D(coordinates.X - regionX * 32, coordinates.Z - regionZ * 32), chunk);
region.SetChunk(new Coordinates2D(coordinates.X - regionPosition.X * 32, coordinates.Z - regionPosition.Z * 32), chunk);
}
}

Expand All @@ -101,13 +103,11 @@ public void UnloadRegion(Coordinates2D coordinates)

public void UnloadChunk(Coordinates2D coordinates)
{
int regionX = coordinates.X / Region.Width - ((coordinates.X < 0) ? 1 : 0);
int regionZ = coordinates.Z / Region.Depth - ((coordinates.Z < 0) ? 1 : 0);
var regionPosition = ChunkCoordinatesToRegion(coordinates);

var regionPosition = new Coordinates2D(regionX, regionZ);
if (!Regions.ContainsKey(regionPosition))
throw new ArgumentOutOfRangeException("coordinates");
Regions[regionPosition].UnloadChunk(new Coordinates2D(coordinates.X - regionX * 32, coordinates.Z - regionZ * 32));
Regions[regionPosition].UnloadChunk(new Coordinates2D(coordinates.X - regionPosition.X * 32, coordinates.Z - regionPosition.Z * 32));
}

public short GetBlockId(Coordinates3D coordinates)
Expand Down