Botcraft 1.21.4
Loading...
Searching...
No Matches
Chunk.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4#include <thread>
5#include <unordered_map>
6#include <unordered_set>
7#include <vector>
8
13
14namespace Botcraft
15{
16 class Biome;
17 class Section;
18
19 //We assume that a chunk is 16*256*16 in versions before 1.18 and 16*N*16 after
20 //And a section is 16*16*16
21 static constexpr int CHUNK_WIDTH = 16;
22 static constexpr int SECTION_HEIGHT = 16;
23
24 class Chunk
25 {
26 public:
27#if PROTOCOL_VERSION < 757 /* < 1.18 */
28 Chunk(const size_t dim_index, const bool has_sky_light_);
29#else
30 Chunk(const int min_y_, const unsigned int height_, const size_t dim_index, const bool has_sky_light_);
31#endif
32 Chunk(const Chunk& c);
33
35
36 int GetMinY() const;
37 int GetHeight() const;
38
39#if USE_GUI
40 bool GetModifiedSinceLastRender() const;
41 void SetModifiedSinceLastRender(const bool b);
42#endif
43
44#if PROTOCOL_VERSION < 552 /* < 1.15 */
45 void LoadChunkData(const std::vector<unsigned char>& data, const int primary_bit_mask, const bool ground_up_continuous);
46#elif PROTOCOL_VERSION < 755 /* < 1.17 */
47 void LoadChunkData(const std::vector<unsigned char>& data, const int primary_bit_mask);
48#elif PROTOCOL_VERSION < 757 /* < 1.18 */
49 void LoadChunkData(const std::vector<unsigned char>& data, const std::vector<unsigned long long int>& primary_bit_mask);
50#else
51 void LoadChunkData(const std::vector<unsigned char>& data);
52#endif
53#if PROTOCOL_VERSION < 757 /* < 1.18 */
54 void LoadChunkBlockEntitiesData(const std::vector<ProtocolCraft::NBT::Value>& block_entities);
55#else
56 void LoadChunkBlockEntitiesData(const std::vector<ProtocolCraft::BlockEntityInfo>& block_entities);
57#endif
58 void SetBlockEntityData(const Position& pos, const ProtocolCraft::NBT::Value& block_entity);
59 void RemoveBlockEntityData(const Position& pos);
61
62 const Blockstate* GetBlock(const Position& pos) const;
63
64 void SetBlock(const Position& pos, const Blockstate* block);
65 void SetBlock(const Position& pos, const BlockstateId id);
66
67 unsigned char GetBlockLight(const Position& pos) const;
68 void SetBlockLight(const Position& pos, const unsigned char v);
69
70 unsigned char GetSkyLight(const Position& pos) const;
71 void SetSkyLight(const Position& pos, const unsigned char v);
72
73 size_t GetDimensionIndex() const;
74 bool GetHasSkyLight() const;
75
76 bool HasSection(const int y) const;
77 void AddSection(const int y);
78
79#if PROTOCOL_VERSION < 552 /* < 1.15 */
80 const Biome* GetBiome(const int x, const int z) const;
81 void SetBiome(const int x, const int z, const int b);
82#else
83 const Biome* GetBiome(const int x, const int y, const int z) const;
84 const Biome* GetBiome(const int i) const;
85 void SetBiomes(const std::vector<int>& new_biomes);
86 void SetBiome(const int x, const int y, const int z, const int new_biome);
87 void SetBiome(const int i, const int new_biome);
88#endif
89#if PROTOCOL_VERSION > 761 /* > 1.19.3 */
90 void LoadBiomesData(const std::vector<unsigned char>& data);
91#endif
92 void UpdateNeighbour(Chunk* const neighbour, const Orientation direction);
93
94 /// @brief Add a thread to the loaders list
95 /// @param thread_id Id of the thread
96 void AddLoader(const std::thread::id& thread_id);
97 /// @brief Remove a thread from the loaders list
98 /// @param thread_id Id of the thread
99 /// @return Number of remaining loaders
100 size_t RemoveLoader(const std::thread::id& thread_id);
101
102 private:
103 bool IsInsideChunk(const Position& pos, const bool ignore_gui_borders) const;
104#if PROTOCOL_VERSION > 756 /* > 1.17.1 */
105 void LoadSectionBiomeData(const int section_y, ProtocolCraft::ReadIterator& iter, size_t& length);
106#endif
107 private:
108 std::vector<std::shared_ptr<Section> > sections;
109 std::vector<unsigned char> biomes;
110
111 std::unordered_map<Position, ProtocolCraft::NBT::Value> block_entities_data;
112
115
116#if PROTOCOL_VERSION < 757 /* < 1.18 */
117 static constexpr int min_y = 0;
118 static constexpr int height = 256;
119#else
120 int min_y;
122#endif
123#if USE_GUI
125#endif
126 std::unordered_set<std::thread::id> loaded_from;
127 };
128} // Botcraft
void AddSection(const int y)
Definition Chunk.cpp:690
size_t dimension_index
Definition Chunk.hpp:113
unsigned char GetSkyLight(const Position &pos) const
Definition Chunk.cpp:628
void SetBiomes(const std::vector< int > &new_biomes)
Definition Chunk.cpp:736
void AddLoader(const std::thread::id &thread_id)
Add a thread to the loaders list.
Definition Chunk.cpp:944
const Biome * GetBiome(const int x, const int y, const int z) const
Definition Chunk.cpp:720
std::vector< unsigned char > biomes
Definition Chunk.hpp:109
std::unordered_set< std::thread::id > loaded_from
Definition Chunk.hpp:126
bool IsInsideChunk(const Position &pos, const bool ignore_gui_borders) const
Definition Chunk.cpp:955
void RemoveBlockEntityData(const Position &pos)
Definition Chunk.cpp:491
bool modified_since_last_rendered
Definition Chunk.hpp:124
bool GetHasSkyLight() const
Definition Chunk.cpp:680
bool HasSection(const int y) const
Definition Chunk.cpp:685
ProtocolCraft::NBT::Value GetBlockEntityData(const Position &pos) const
Definition Chunk.cpp:496
size_t RemoveLoader(const std::thread::id &thread_id)
Remove a thread from the loaders list.
Definition Chunk.cpp:949
void LoadBiomesData(const std::vector< unsigned char > &data)
Definition Chunk.cpp:776
void LoadSectionBiomeData(const int section_y, ProtocolCraft::ReadIterator &iter, size_t &length)
Definition Chunk.cpp:975
bool GetModifiedSinceLastRender() const
Definition Chunk.cpp:93
void UpdateNeighbour(Chunk *const neighbour, const Orientation direction)
Definition Chunk.cpp:793
std::vector< std::shared_ptr< Section > > sections
Definition Chunk.hpp:108
size_t GetDimensionIndex() const
Definition Chunk.cpp:675
void LoadChunkData(const std::vector< unsigned char > &data)
Definition Chunk.cpp:314
int GetMinY() const
Definition Chunk.cpp:82
std::unordered_map< Position, ProtocolCraft::NBT::Value > block_entities_data
Definition Chunk.hpp:111
int GetHeight() const
Definition Chunk.cpp:87
const Blockstate * GetBlock(const Position &pos) const
Definition Chunk.cpp:507
void SetBlockEntityData(const Position &pos, const ProtocolCraft::NBT::Value &block_entity)
Definition Chunk.cpp:477
void SetBlockLight(const Position &pos, const unsigned char v)
Definition Chunk.cpp:598
void SetModifiedSinceLastRender(const bool b)
Definition Chunk.cpp:98
void SetBiome(const int x, const int y, const int z, const int new_biome)
Definition Chunk.cpp:754
void LoadChunkBlockEntitiesData(const std::vector< ProtocolCraft::BlockEntityInfo > &block_entities)
Definition Chunk.cpp:443
void SetSkyLight(const Position &pos, const unsigned char v)
Definition Chunk.cpp:644
unsigned char GetBlockLight(const Position &pos) const
Definition Chunk.cpp:582
static Position BlockCoordsToChunkCoords(const Position &pos)
Definition Chunk.cpp:73
bool has_sky_light
Definition Chunk.hpp:114
void SetBlock(const Position &pos, const Blockstate *block)
Definition Chunk.cpp:530
static constexpr int SECTION_HEIGHT
Definition Chunk.hpp:22
static constexpr int CHUNK_WIDTH
Definition Chunk.hpp:21
unsigned int BlockstateId
std::vector< unsigned char >::const_iterator ReadIterator