summaryrefslogtreecommitdiffstats
path: root/AnvilStats/Statistics.h
blob: 980241ae6e9a84b45240f385d7635dabe7d6e57e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

// Statistics.h

// Interfaces to the cStatistics class representing a statistics-collecting callback





#pragma once

#include "Callback.h"





class cStatistics :
	public cCallback
{
	friend class cStatisticsFactory;
	
public:
	cStatistics(void);
	
protected:
	int m_TotalChunks;  // Total number of chunks that go through this callback (OnNewChunk())
	int m_BiomeCounts[256];
	int m_BlockCounts[256][256];  // First dimension is the biome, second dimension is BlockType
	int m_BiomeNumChunks;  // Num chunks that have been processed for biome stats
	int m_BlockNumChunks;  // Num chunks that have been processed for block stats
	bool m_IsBiomesValid;  // Set to true in OnBiomes(), reset to false in OnNewChunk(); if true, the m_BiomeData is valid for the current chunk
	unsigned char m_BiomeData[16 * 16];
	bool m_IsFirstSectionInChunk;  // True if there was no section in the chunk yet. Set by OnNewChunk(), reset by OnSection()

	// cCallback overrides:
	virtual bool OnNewChunk(int a_ChunkX, int a_ChunkZ) override;
	virtual bool OnHeader(int a_FileOffset, unsigned char a_NumSectors, int a_Timestamp) override { return false; }
	virtual bool OnCompressedDataSizePos(int a_CompressedDataSize, int a_DataOffset, char a_CompressionMethod) override { return false; }
	virtual bool OnDecompressedData(const char * a_DecompressedNBT, int a_DataSize) override { return false; }
	virtual bool OnRealCoords(int a_ChunkX, int a_ChunkZ) override { return false; }
	virtual bool OnLastUpdate(Int64 a_LastUpdate) override { return false; }
	virtual bool OnTerrainPopulated(bool a_Populated) override { return !a_Populated; }  // If not populated, we don't want it!
	virtual bool OnBiomes(const unsigned char * a_BiomeData) override;
	virtual bool OnHeightMap(const int * a_HeightMap) override { return false; }
	virtual bool OnSection(
		unsigned char a_Y,
		const BLOCKTYPE * a_BlockTypes,
		const NIBBLETYPE * a_BlockAdditional,
		const NIBBLETYPE * a_BlockMeta,
		const NIBBLETYPE * a_BlockLight,
		const NIBBLETYPE * a_BlockSkyLight
	) override;
} ;





class cStatisticsFactory :
	public cCallbackFactory
{
public:
	virtual ~cStatisticsFactory();
	
	virtual cCallback * CreateNewCallback(void)
	{
		return new cStatistics;
	}
	
protected:
	// The results, combined, are stored here:
	int m_TotalChunks;
	int m_BiomeCounts[256];
	int m_BlockCounts[256][256];  // First dimension is the biome, second dimension is BlockType
	int m_BiomeNumChunks;  // Num chunks that have been processed for biome stats
	int m_BlockNumChunks;  // Num chunks that have been processed for block stats

	void JoinResults(void);
	void SaveBiomes(void);
	void SaveBlockTypes(void);
	void SaveBiomeBlockTypes(void);

} ;