git-svn-id: http://mc-server.googlecode.com/svn/trunk@1447 0a769ca7-a7f5-676a-18bf-c427514a06d6
		
			
				
	
	
		
			215 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
 | 
						|
// ChunkDesc.h
 | 
						|
 | 
						|
// Declares the cChunkDesc class representing the chunk description used while generating a chunk. This class is also exported to Lua for HOOK_CHUNK_GENERATING.
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include "../BlockArea.h"
 | 
						|
#include "../ChunkDef.h"
 | 
						|
#include "../Cuboid.h"
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
// fwd: ../BlockArea.h
 | 
						|
class cBlockArea;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
// tolua_begin
 | 
						|
class cChunkDesc
 | 
						|
{
 | 
						|
public:
 | 
						|
	// tolua_end
 | 
						|
	
 | 
						|
	/// Uncompressed block metas, 1 meta per byte
 | 
						|
	typedef NIBBLETYPE BlockNibbleBytes[cChunkDef::NumBlocks];
 | 
						|
	
 | 
						|
	cChunkDesc(int a_ChunkX, int a_ChunkZ);
 | 
						|
	~cChunkDesc();
 | 
						|
 | 
						|
	// tolua_begin
 | 
						|
 | 
						|
	int GetChunkX(void) const { return m_ChunkX; }
 | 
						|
	int GetChunkZ(void) const { return m_ChunkZ; }
 | 
						|
	
 | 
						|
	void SetChunkCoords(int a_ChunkX, int a_ChunkZ);
 | 
						|
	
 | 
						|
	void       FillBlocks(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
 | 
						|
	void       SetBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
 | 
						|
	void       GetBlockTypeMeta(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta);
 | 
						|
 | 
						|
	void       SetBlockType(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType);
 | 
						|
	BLOCKTYPE  GetBlockType(int a_RelX, int a_RelY, int a_RelZ);
 | 
						|
	
 | 
						|
	void       SetBlockMeta(int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_BlockMeta);
 | 
						|
	NIBBLETYPE GetBlockMeta(int a_RelX, int a_RelY, int a_RelZ);
 | 
						|
 | 
						|
	void       SetBiome(int a_RelX, int a_RelZ, int a_BiomeID);
 | 
						|
	EMCSBiome  GetBiome(int a_RelX, int a_RelZ);
 | 
						|
 | 
						|
	void       SetHeight(int a_RelX, int a_RelZ, int a_Height);
 | 
						|
	int        GetHeight(int a_RelX, int a_RelZ);
 | 
						|
 | 
						|
	// Default generation:
 | 
						|
	void SetUseDefaultBiomes(bool a_bUseDefaultBiomes);
 | 
						|
	bool IsUsingDefaultBiomes(void) const;
 | 
						|
	void SetUseDefaultHeight(bool a_bUseDefaultHeight);
 | 
						|
	bool IsUsingDefaultHeight(void) const;
 | 
						|
	void SetUseDefaultComposition(bool a_bUseDefaultComposition);
 | 
						|
	bool IsUsingDefaultComposition(void) const;
 | 
						|
	void SetUseDefaultStructures(bool a_bUseDefaultStructures);
 | 
						|
	bool IsUsingDefaultStructures(void) const;
 | 
						|
	void SetUseDefaultFinish(bool a_bUseDefaultFinish);
 | 
						|
	bool IsUsingDefaultFinish(void) const;
 | 
						|
 | 
						|
	/// Writes the block area into the chunk, with its origin set at the specified relative coords. Area's data overwrite everything in the chunk.
 | 
						|
	void WriteBlockArea(const cBlockArea & a_BlockArea, int a_RelX, int a_RelY, int a_RelZ, cBlockArea::eMergeStrategy a_MergeStrategy = cBlockArea::msOverwrite);
 | 
						|
 | 
						|
	/// Reads an area from the chunk into a cBlockArea
 | 
						|
	void ReadBlockArea(cBlockArea & a_Dest, int a_MinRelX, int a_MaxRelX, int a_MinRelY, int a_MaxRelY, int a_MinRelZ, int a_MaxRelZ);
 | 
						|
 | 
						|
	/// Returns the maximum height value in the heightmap
 | 
						|
	HEIGHTTYPE GetMaxHeight(void) const;
 | 
						|
	
 | 
						|
	/// Fills the relative cuboid with specified block; allows cuboid out of range of this chunk
 | 
						|
	void FillRelCuboid(
 | 
						|
		int a_MinX, int a_MaxX,
 | 
						|
		int a_MinY, int a_MaxY,
 | 
						|
		int a_MinZ, int a_MaxZ,
 | 
						|
		BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta
 | 
						|
	);
 | 
						|
	
 | 
						|
	/// Fills the relative cuboid with specified block; allows cuboid out of range of this chunk
 | 
						|
	void FillRelCuboid(const cCuboid & a_RelCuboid, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
 | 
						|
	{
 | 
						|
		FillRelCuboid(
 | 
						|
			a_RelCuboid.p1.x, a_RelCuboid.p2.x,
 | 
						|
			a_RelCuboid.p1.y, a_RelCuboid.p2.y,
 | 
						|
			a_RelCuboid.p1.z, a_RelCuboid.p2.z,
 | 
						|
			a_BlockType, a_BlockMeta
 | 
						|
		);
 | 
						|
	}
 | 
						|
	
 | 
						|
	/// Replaces the specified src blocks in the cuboid by the dst blocks; allows cuboid out of range of this chunk
 | 
						|
	void ReplaceRelCuboid(
 | 
						|
		int a_MinX, int a_MaxX,
 | 
						|
		int a_MinY, int a_MaxY,
 | 
						|
		int a_MinZ, int a_MaxZ,
 | 
						|
		BLOCKTYPE a_SrcType, NIBBLETYPE a_SrcMeta,
 | 
						|
		BLOCKTYPE a_DstType, NIBBLETYPE a_DstMeta
 | 
						|
	);
 | 
						|
	
 | 
						|
	/// Replaces the specified src blocks in the cuboid by the dst blocks; allows cuboid out of range of this chunk
 | 
						|
	void ReplaceRelCuboid(
 | 
						|
		const cCuboid & a_RelCuboid,
 | 
						|
		BLOCKTYPE a_SrcType, NIBBLETYPE a_SrcMeta,
 | 
						|
		BLOCKTYPE a_DstType, NIBBLETYPE a_DstMeta
 | 
						|
	)
 | 
						|
	{
 | 
						|
		ReplaceRelCuboid(
 | 
						|
			a_RelCuboid.p1.x, a_RelCuboid.p2.x,
 | 
						|
			a_RelCuboid.p1.y, a_RelCuboid.p2.y,
 | 
						|
			a_RelCuboid.p1.z, a_RelCuboid.p2.z,
 | 
						|
			a_SrcType, a_SrcMeta,
 | 
						|
			a_DstType, a_DstMeta
 | 
						|
		);
 | 
						|
	}
 | 
						|
 | 
						|
	/// Replaces the blocks in the cuboid by the dst blocks if they are considered non-floor (air, water); allows cuboid out of range of this chunk
 | 
						|
	void FloorRelCuboid(
 | 
						|
		int a_MinX, int a_MaxX,
 | 
						|
		int a_MinY, int a_MaxY,
 | 
						|
		int a_MinZ, int a_MaxZ,
 | 
						|
		BLOCKTYPE a_DstType, NIBBLETYPE a_DstMeta
 | 
						|
	);
 | 
						|
	
 | 
						|
	/// Replaces the blocks in the cuboid by the dst blocks if they are considered non-floor (air, water); allows cuboid out of range of this chunk
 | 
						|
	void FloorRelCuboid(
 | 
						|
		const cCuboid & a_RelCuboid,
 | 
						|
		BLOCKTYPE a_DstType, NIBBLETYPE a_DstMeta
 | 
						|
	)
 | 
						|
	{
 | 
						|
		FloorRelCuboid(
 | 
						|
			a_RelCuboid.p1.x, a_RelCuboid.p2.x,
 | 
						|
			a_RelCuboid.p1.y, a_RelCuboid.p2.y,
 | 
						|
			a_RelCuboid.p1.z, a_RelCuboid.p2.z,
 | 
						|
			a_DstType, a_DstMeta
 | 
						|
		);
 | 
						|
	}
 | 
						|
	
 | 
						|
	/// Fills the relative cuboid with specified block with a random chance; allows cuboid out of range of this chunk
 | 
						|
	void RandomFillRelCuboid(
 | 
						|
		int a_MinX, int a_MaxX,
 | 
						|
		int a_MinY, int a_MaxY,
 | 
						|
		int a_MinZ, int a_MaxZ,
 | 
						|
		BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,
 | 
						|
		int a_RandomSeed, int a_ChanceOutOf10k
 | 
						|
	);
 | 
						|
	
 | 
						|
	/// Fills the relative cuboid with specified block with a random chance; allows cuboid out of range of this chunk
 | 
						|
	void RandomFillRelCuboid(
 | 
						|
		const cCuboid & a_RelCuboid, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,
 | 
						|
		int a_RandomSeed, int a_ChanceOutOf10k
 | 
						|
	)
 | 
						|
	{
 | 
						|
		RandomFillRelCuboid(
 | 
						|
			a_RelCuboid.p1.x, a_RelCuboid.p2.x,
 | 
						|
			a_RelCuboid.p1.y, a_RelCuboid.p2.y,
 | 
						|
			a_RelCuboid.p1.z, a_RelCuboid.p2.z,
 | 
						|
			a_BlockType, a_BlockMeta,
 | 
						|
			a_RandomSeed, a_ChanceOutOf10k
 | 
						|
		);
 | 
						|
	}
 | 
						|
	
 | 
						|
	// tolua_end
 | 
						|
	
 | 
						|
	void AddBlockEntity(cBlockEntity * a_BlockEntity);
 | 
						|
	
 | 
						|
	// Accessors used by cChunkGenerator::Generator descendants:
 | 
						|
	inline cChunkDef::BiomeMap &     GetBiomeMap              (void) { return m_BiomeMap; }
 | 
						|
	inline cChunkDef::BlockTypes &   GetBlockTypes            (void) { return *((cChunkDef::BlockTypes *)m_BlockArea.GetBlockTypes()); }
 | 
						|
	// CANNOT, different compression! 
 | 
						|
	// inline cChunkDef::BlockNibbles & GetBlockMetas            (void) { return *((cChunkDef::BlockNibbles *)m_BlockArea.GetBlockMetas()); }
 | 
						|
	inline BlockNibbleBytes &        GetBlockMetasUncompressed(void) { return *((BlockNibbleBytes *)m_BlockArea.GetBlockMetas()); }
 | 
						|
	inline cChunkDef::HeightMap &    GetHeightMap             (void) { return m_HeightMap; }
 | 
						|
	inline cEntityList &             GetEntities              (void) { return m_Entities; }
 | 
						|
	inline cBlockEntityList &        GetBlockEntities         (void) { return m_BlockEntities; }
 | 
						|
	
 | 
						|
	/// Compresses the metas from the BlockArea format (1 meta per byte) into regular format (2 metas per byte)
 | 
						|
	void CompressBlockMetas(cChunkDef::BlockNibbles & a_DestMetas);
 | 
						|
	
 | 
						|
	#ifdef _DEBUG
 | 
						|
	/// Verifies that the heightmap corresponds to blocktype contents; if not, asserts on that column
 | 
						|
	void VerifyHeightmap(void);
 | 
						|
	#endif  // _DEBUG
 | 
						|
	
 | 
						|
private:
 | 
						|
	int m_ChunkX;
 | 
						|
	int m_ChunkZ;
 | 
						|
	
 | 
						|
	cChunkDef::BiomeMap     m_BiomeMap;
 | 
						|
	cBlockArea              m_BlockArea;
 | 
						|
	cChunkDef::HeightMap    m_HeightMap;
 | 
						|
	cEntityList             m_Entities;       // Individual entities are NOT owned by this object!
 | 
						|
	cBlockEntityList        m_BlockEntities;  // Individual block entities are NOT owned by this object!
 | 
						|
 | 
						|
	bool m_bUseDefaultBiomes;
 | 
						|
	bool m_bUseDefaultHeight;
 | 
						|
	bool m_bUseDefaultComposition;
 | 
						|
	bool m_bUseDefaultStructures;
 | 
						|
	bool m_bUseDefaultFinish;
 | 
						|
} ;  // tolua_export
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |