
// Zapper.h

// Declares the cZapper class representing the processor that actually zaps blocks and entities





#pragma once

#include "Regions.h"





// fwd: ParsedNBT.h
class cParsedNBT;
class cFastNBTWriter;





class cZapper
{
public:
	cZapper(const AString & a_MCAFolder);
	
	/// Zaps all the specified regions
	void ZapRegions(const cRegionVector & a_Regions);
	
protected:
	static const int BlocksPerChunkX = 16;
	static const int BlocksPerChunkZ = 16;
	static const int ChunksPerMCAX = 32;
	static const int ChunksPerMCAZ = 32;
	
	AString m_MCAFolder;

	/// Converts from block coords to MCA coords
	void BlockToMCA(int a_BlockX, int a_BlockZ, int & a_MCAX, int & a_MCAZ);
	
	/// Converts from block coords to chunk coords
	void BlockToChunk(int a_BlockX, int a_BlockZ, int & a_ChunkX, int & a_ChunkZ);
	
	/// Zaps the specified region in the MCA file with the specified MCA coords
	void ZapRegionInMCAFile(const cRegion & a_Region, int a_MCAX, int a_MCAZ);
	
	/** Loads raw compressed chunk data from the specified file
	* chunk is specified by ChunkHeaderValue, which is the int describing the chunk in file header.
	*/
	void LoadChunkData(cFile & a_InFile, int a_ChunkHeaderValue, AString & a_ChunkData, int a_ChunkX, int a_ChunkZ);
	
	/// Zaps the specified region in the raw (compressed) chunk data.
	void ZapRegionInRawChunkData(const cRegion & a_Region, AString & a_ChunkData, int a_ChunkX, int a_ChunkZ);
	
	/// Zaps the specified region in the specified NBT structure
	void ZapRegionInNBTChunk(const cRegion & a_Region, cParsedNBT & a_NBT, int a_ChunkX, int a_ChunkZ);
	
	/// Zaps the blocks in the specified region from the specified NBT
	void ZapRegionBlocksInNBT(const cRegion & a_Region, cParsedNBT & a_NBT, int a_SectionsTag);
	
	/// Zaps the blocks in the specified bytes (types) from one vertical section (16^3 blocks) of a chunk.
	void ZapRegionInNBTSectionBytes(const cRegion & a_Region, int a_SectionY, unsigned char * a_BlockBytes);

	/// Zaps the blocks in the specified nibbles (meta, add) from one vertical section (16^3 blocks) of a chunk.
	void ZapRegionInNBTSectionNibbles(const cRegion & a_Region, int a_SectionY, unsigned char * a_BlockNibbles);
	
	/// Zaps entities in the specified region from the specified NBT
	void ZapRegionEntitiesInNBT(const cRegion & a_Region, cParsedNBT & a_NBT, int a_EntitiesTag);
	
	/// Serializes the NBT subtree into a writer
	void SerializeNBTTag(const cParsedNBT & a_NBT, int a_Tag, cFastNBTWriter & a_Writer);
} ;




