
/*
 * Copyright 2011-2022 Cuberite Contributors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// ChunkDataCallback.h

// Declares the cChunkDataCallback interface and several trivial descendants, for reading chunk data





#pragma once

#include "ChunkData.h"





/** Interface class used for getting data out of a chunk using the GetAllData() function.
Implementation must use the pointers immediately and NOT store any of them for later use
The virtual methods are called in the same order as they're declared here. */
class cChunkDataCallback abstract
{
public:

	virtual ~cChunkDataCallback() {}

	/** Called before any other callbacks to inform of the current coords
	(only in processes where multiple chunks can be processed, such as cWorld::ForEachChunkInRect()).
	If false is returned, the chunk is skipped. */
	virtual bool Coords(int a_ChunkX, int a_ChunkZ) { UNUSED(a_ChunkX); UNUSED(a_ChunkZ); return true; }

	/** Called once to let know if the chunk lighting is valid. Return value is ignored */
	virtual void LightIsValid(bool a_IsLightValid) { UNUSED(a_IsLightValid); }

	/** Called once to export block data. */
	virtual void ChunkData(const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData) { UNUSED(a_BlockData); UNUSED(a_LightData); }

	/** Called once to provide heightmap data. */
	virtual void HeightMap(const cChunkDef::HeightMap & a_HeightMap) { UNUSED(a_HeightMap); }

	/** Called once to provide biome data. */
	virtual void BiomeMap(const cChunkDef::BiomeMap & a_BiomeMap) { UNUSED(a_BiomeMap); }

	/** Called for each entity in the chunk */
	virtual void Entity(cEntity * a_Entity) { UNUSED(a_Entity); }

	/** Called for each blockentity in the chunk */
	virtual void BlockEntity(cBlockEntity * a_Entity) { UNUSED(a_Entity); }
} ;




/** A simple implementation of the cChunkDataCallback interface that just copies the cChunkData */
class cChunkDataCopyCollector :
	public cChunkDataCallback
{
public:

	ChunkBlockData m_BlockData;
	ChunkLightData m_LightData;

private:

	virtual void ChunkData(const ChunkBlockData & a_BlockData, const ChunkLightData & a_LightData) override
	{
		m_BlockData.Assign(a_BlockData);
		m_LightData.Assign(a_LightData);
	}
};
