2015-11-30 15:30:49 +01:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
2022-04-23 12:00:50 +02:00
|
|
|
|
using System.Threading;
|
2015-11-30 15:30:49 +01:00
|
|
|
|
|
|
|
|
|
|
namespace MinecraftClient.Mapping
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Represent a chunk of terrain in a Minecraft world
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class Chunk
|
|
|
|
|
|
{
|
|
|
|
|
|
public const int SizeX = 16;
|
|
|
|
|
|
public const int SizeY = 16;
|
|
|
|
|
|
public const int SizeZ = 16;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Blocks contained into the chunk
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private readonly Block[,,] blocks = new Block[SizeX, SizeY, SizeZ];
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Read, or set the specified block
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="blockX">Block X</param>
|
|
|
|
|
|
/// <param name="blockY">Block Y</param>
|
|
|
|
|
|
/// <param name="blockZ">Block Z</param>
|
|
|
|
|
|
/// <returns>chunk at the given location</returns>
|
|
|
|
|
|
public Block this[int blockX, int blockY, int blockZ]
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
if (blockX < 0 || blockX >= SizeX)
|
|
|
|
|
|
throw new ArgumentOutOfRangeException("blockX", "Must be between 0 and " + (SizeX - 1) + " (inclusive)");
|
|
|
|
|
|
if (blockY < 0 || blockY >= SizeY)
|
|
|
|
|
|
throw new ArgumentOutOfRangeException("blockY", "Must be between 0 and " + (SizeY - 1) + " (inclusive)");
|
|
|
|
|
|
if (blockZ < 0 || blockZ >= SizeZ)
|
|
|
|
|
|
throw new ArgumentOutOfRangeException("blockZ", "Must be between 0 and " + (SizeZ - 1) + " (inclusive)");
|
2022-04-23 12:00:50 +02:00
|
|
|
|
|
2022-08-25 01:34:07 +08:00
|
|
|
|
return blocks[blockX, blockY, blockZ];
|
2015-11-30 15:30:49 +01:00
|
|
|
|
}
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (blockX < 0 || blockX >= SizeX)
|
|
|
|
|
|
throw new ArgumentOutOfRangeException("blockX", "Must be between 0 and " + (SizeX - 1) + " (inclusive)");
|
|
|
|
|
|
if (blockY < 0 || blockY >= SizeY)
|
|
|
|
|
|
throw new ArgumentOutOfRangeException("blockY", "Must be between 0 and " + (SizeY - 1) + " (inclusive)");
|
|
|
|
|
|
if (blockZ < 0 || blockZ >= SizeZ)
|
|
|
|
|
|
throw new ArgumentOutOfRangeException("blockZ", "Must be between 0 and " + (SizeZ - 1) + " (inclusive)");
|
2022-04-23 12:00:50 +02:00
|
|
|
|
|
2022-08-25 01:34:07 +08:00
|
|
|
|
blocks[blockX, blockY, blockZ] = value;
|
2015-11-30 15:30:49 +01:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-25 01:34:07 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Used when parsing chunks
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="blockX">Block X</param>
|
|
|
|
|
|
/// <param name="blockY">Block Y</param>
|
|
|
|
|
|
/// <param name="blockZ">Block Z</param>
|
|
|
|
|
|
/// <param name="block">Block</param>
|
|
|
|
|
|
public void SetWithoutCheck(int blockX, int blockY, int blockZ, Block block)
|
|
|
|
|
|
{
|
|
|
|
|
|
blocks[blockX, blockY, blockZ] = block;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-30 15:30:49 +01:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Get block at the specified location
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="location">Location, a modulo will be applied</param>
|
|
|
|
|
|
/// <returns>The block</returns>
|
|
|
|
|
|
public Block GetBlock(Location location)
|
|
|
|
|
|
{
|
2015-12-08 00:34:40 +01:00
|
|
|
|
return this[location.ChunkBlockX, location.ChunkBlockY, location.ChunkBlockZ];
|
2015-11-30 15:30:49 +01:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|