LeviLamina
Loading...
Searching...
No Matches
ChunkSource.h
1#pragma once
2
3#include "mc/_HeaderOutputPredefine.h"
4
5// auto generated inclusion list
6#include "mc/deps/core/utility/EnableNonOwnerReferences.h"
7#include "mc/deps/core/utility/buffer_span.h"
8#include "mc/deps/core/utility/pub_sub/Subscription.h"
9#include "mc/platform/brstd/move_only_function.h"
10#include "mc/util/GridArea.h"
11#include "mc/world/level/chunk/ChunkSourceViewGenerateMode.h"
12#include "mc/world/level/chunk/ChunkState.h"
13#include "mc/world/level/chunk/LevelChunkGridAreaElement.h"
14
15// auto generated forward declare list
16// clang-format off
18class BlockPos;
19class BlockSource;
20class BoundingBox;
21class ChunkKey;
22class ChunkPos;
23class ChunkViewSource;
24class Dimension;
26class Level;
27class LevelChunk;
30class LevelStorage;
31class Random;
32class TaskResult;
36// clang-format on
37
38class ChunkSource : public ::Bedrock::EnableNonOwnerReferences {
39public:
40 // ChunkSource inner types define
41 enum class LoadMode : int {
42 None = 0,
43 Deferred = 1,
44 };
45
46public:
47 // member variables
48 // NOLINTBEGIN
49 ::ll::TypedStorage<4, 4, int> mChunkSide;
50 ::ll::TypedStorage<8, 8, ::Level*> mLevel;
51 ::ll::TypedStorage<8, 8, ::Dimension*> mDimension;
52 ::ll::TypedStorage<8, 8, ::ChunkSource*> mParent;
53 ::ll::TypedStorage<8, 8, ::std::unique_ptr<::ChunkSource>> mOwnedParent;
54 ::ll::TypedStorage<8, 8, ::LevelChunkBuilderData*> mLevelChunkBuilderData;
55 ::ll::TypedStorage<1, 1, ::std::atomic<bool>> mShuttingDown;
56 ::ll::TypedStorage<8, 16, ::Bedrock::PubSub::Subscription> mOnSaveSubscription;
57 ::ll::TypedStorage<8, 16, ::Bedrock::PubSub::Subscription> mOnLevelStorageAppSuspendSubscription;
58 // NOLINTEND
59
60public:
61 // prevent constructor by default
62 ChunkSource();
63
64public:
65 // virtual functions
66 // NOLINTBEGIN
67 virtual ~ChunkSource() /*override*/;
68
69 virtual void shutdown();
70
71 virtual bool isShutdownDone();
72
73 virtual ::std::shared_ptr<::LevelChunk> getExistingChunk(::ChunkPos const& pos);
74
75 virtual ::std::shared_ptr<::LevelChunk> getRandomChunk(::Random& random);
76
77 virtual bool isChunkKnown(::ChunkPos const& chunkPos);
78
79 virtual bool isChunkSaved(::ChunkPos const& chunkPos);
80
81 virtual ::std::shared_ptr<::LevelChunk>
82 createNewChunk(::ChunkPos const& cp, ::ChunkSource::LoadMode lm, bool readOnly);
83
84 virtual ::std::shared_ptr<::LevelChunk>
85 getOrLoadChunk(::ChunkPos const& cp, ::ChunkSource::LoadMode lm, bool readOnly);
86
87 virtual bool structurePostProcessChunk(::ChunkViewSource& neighborhood);
88
89 virtual bool decorationPostProcessChunk(::ChunkViewSource& neighborhood);
90
91 virtual void checkAndReplaceChunk(::ChunkViewSource& neighborhood, ::LevelChunk& lc);
92
93 virtual bool verifyChunkNeedsNeighborAwareUpgrade(::LevelChunk& lc);
94
95 virtual void neighborAwareChunkUpgrade(::LevelChunk& levelChunk, ::ChunkViewSource& neighborhood);
96
97 virtual void loadChunk(::LevelChunk& lc, bool forceImmediateReplacementDataLoad);
98
99 virtual void postProcessMobsAt(::BlockSource& region, int chunkWestBlock, int chunkNorthBlock, ::Random& random);
100
101 virtual void postProcessMobsAt(::BlockSource& region, ::BoundingBox const& chunkBB) const;
102
103 virtual void deleteAllChunkData(
104 ::std::unordered_set<::ChunkPos> chunksToDelete,
105 ::std::function<void()> completionCallback,
106 ::std::shared_ptr<::ChunkDeletionMetadata> metadata
107 );
108
109 virtual void deleteStoredChunkData(
110 ::std::unordered_set<::ChunkPos> chunksToDelete,
111 ::std::function<void()> completionCallback,
112 ::std::shared_ptr<::ChunkDeletionMetadata> metadata
113 );
114
115 virtual bool saveLiveChunk(::LevelChunk& lc);
116
117 virtual void writeEntityChunkTransfer(::LevelChunk& levelChunk);
118
119 virtual void writeEntityChunkTransfersToUnloadedChunk(
120 ::ChunkKey const& chunkKey,
121 ::std::vector<::ActorUnloadedChunkTransferEntry> const& transfers
122 );
123
124 virtual void deserializeActorStorageToLevelChunk(::LevelChunk& levelChunk);
125
126 virtual void hintDiscardBatchBegin();
127
128 virtual void hintDiscardBatchEnd();
129
130 virtual void acquireDiscarded(::std::unique_ptr<::LevelChunk, ::LevelChunkFinalDeleter> ptr);
131
132 virtual void compact();
133
134 virtual void flushPendingDiscardedChunkWrites();
135
136 virtual void flushThreadBatch();
137
138 virtual bool isWithinWorldLimit(::ChunkPos const& cp) const;
139
140 virtual ::std::unordered_map<::ChunkPos, ::std::weak_ptr<::LevelChunk>> const* getChunkMap();
141
142 virtual ::std::unordered_map<::ChunkPos, ::std::weak_ptr<::LevelChunk>> const& getStorage() const;
143
144 virtual void clearDeletedEntities();
145
146 virtual bool canCreateViews() const;
147
148 virtual ::std::unique_ptr<::BlendingDataProvider> tryGetBlendingDataProvider();
149
150 virtual ::std::shared_ptr<::LevelChunkMetaDataDictionary> loadLevelChunkMetaDataDictionary();
151
152 virtual void setLevelChunk(::std::shared_ptr<::LevelChunk> lc);
153
154 virtual bool canLaunchTasks() const;
155
156 virtual bool chunkPosNeedsBlending(::ChunkPos const& cp);
157
158 virtual void _clearBlendingCache();
159 // NOLINTEND
160
161public:
162 // member functions
163 // NOLINTBEGIN
164 MCAPI explicit ChunkSource(::std::unique_ptr<::ChunkSource> parent);
165
166 MCAPI bool _checkAndDispatchTaskForLevelChunk(
167 ::std::pair<::ChunkPos, ::ChunkState> const& chunkPosAndExpectedState,
168 bool areInTask
169 );
170
171 MCAPI void _checkForReplacementDataTask(::LevelChunk& lc, ::ChunkViewSource& chunks);
172
173 MCAPI void _checkForUnblockingChunks(::LevelChunk const& lc);
174
175 MCAPI void _checkLevelChunkForNextStage(
176 ::LevelChunk const& lc,
177 ::LevelChunkGridAreaElement<::std::weak_ptr<::LevelChunk>>& grid,
178 ::ChunkState stateToCheck
179 );
180
181 MCAPI void _checkSpecificLevelChunkForUnblocking(
182 ::LevelChunk const& lc,
183 ::LevelChunkGridAreaElement<::std::weak_ptr<::LevelChunk>>& grid
184 );
185
186 MCAPI bool _chunkAtStage(::std::weak_ptr<::LevelChunk> lcwp, ::ChunkState stateToCheck);
187
188 MCAPI void _createOrReplaceGridAreaMap(::std::shared_ptr<::LevelChunk> lc, bool createNeighbourGridsIfMissing);
189
190 MCAPI void _decorationPostProcessingTask(::LevelChunk& lc, ::ChunkViewSource& chunks);
191
192 MCAPI void _dispatchTaskForLevelChunk(
193 ::std::shared_ptr<::LevelChunk> const& lc,
194 ::std::shared_ptr<::ChunkViewSource> const& chunks,
195 bool areInTask
196 );
197
198 MCAPI void _freeChunkGenerationGridMap(::ChunkPos const& cp, bool isLevelChunkDeletion);
199
200 MCAPI void _handleTaskFailure(::LevelChunk& levelChunk, ::ChunkState currentState, ::ChunkState previousState);
201
202 MCAPI void _launchChunkTask(
203 ::std::string_view taskName,
204 ::ChunkPos const& chunkPos,
205 bool areInTask,
207 );
208
209 MCAPI void _launchDecorationPostProcessingTask(
210 ::std::shared_ptr<::LevelChunk> const& lc,
211 ::std::shared_ptr<::ChunkViewSource> const& chunks,
212 bool areInTask
213 );
214
215 MCAPI void _launchLightingTask(
216 ::std::shared_ptr<::LevelChunk> const& lc,
217 ::std::shared_ptr<::ChunkViewSource> const& chunks,
218 bool areInTask
219 );
220
221 MCAPI void _launchNeighborAwareUpgradeTask(
222 ::std::shared_ptr<::LevelChunk> const& lc,
223 ::std::shared_ptr<::ChunkViewSource> const& chunks,
224 bool areInTask
225 );
226
227 MCAPI void _launchReplacementDataTask(
228 ::std::shared_ptr<::LevelChunk> const& lc,
229 ::std::shared_ptr<::ChunkViewSource> const& chunks,
230 bool areInTask
231 );
232
233 MCAPI void _launchStructurePostProcessingTask(
234 ::std::shared_ptr<::LevelChunk> const& lc,
235 ::std::shared_ptr<::ChunkViewSource> const& chunks,
236 bool areInTask
237 );
238
239 MCAPI void _lightingTask(::std::shared_ptr<::LevelChunk> const& lc, ::ChunkViewSource& chunks);
240
241 MCAPI void _loadChunkTask(::LevelChunk& lc);
242
243 MCAPI void _neighborAwareUpgradeTask(::LevelChunk& lc, ::ChunkViewSource& chunks);
244
245 MCAPI void _saveDirtyChunks(::LevelStorage&);
246
247 MCAPI void _spawnChunkGenerationTasks(int numTasks, bool calledFromTask);
248
249#ifdef LL_PLAT_C
250 MCAPI void _structurePostProcessingTask(::LevelChunk& lc, ::ChunkViewSource& chunks);
251
252 MCAPI void addEmptyChunkPosForProcessingNeighbours(::std::shared_ptr<::LevelChunk> lc);
253#endif
254
255 MCAPI void checkAndLaunchChunkGenerationTasks(bool calledFromTask);
256
257 MCAPI ::GridArea<::std::shared_ptr<::LevelChunk>> createEmptyView(
258 ::ChunkSource::LoadMode lm,
259 bool circle,
260 ::std::function<void(::buffer_span_mut<::std::shared_ptr<::LevelChunk>>, ::buffer_span<uint>)> add,
261 ::ChunkSourceViewGenerateMode chunkViewGenerateMode,
262 float const* serverBuildRatio
263 );
264
265 MCAPI ::std::shared_ptr<::LevelChunk> getAvailableChunk(::ChunkPos const& cp);
266
267#ifdef LL_PLAT_C
268 MCAPI ::std::shared_ptr<::LevelChunk> getAvailableChunkAt(::BlockPos const& pos);
269#endif
270
271 MCAPI void
272 initializeWithLevelStorageManagerConnector(::ILevelStorageManagerConnector& levelStorageManagerConnector);
273
274 MCAPI bool shouldServerGeneratePos(::ChunkPos const& chunkPos, float serverBuildRatio, int viewRadius);
275 // NOLINTEND
276
277public:
278 // static variables
279 // NOLINTBEGIN
280 MCAPI static bool& gPerfIsClientSide();
281 // NOLINTEND
282
283public:
284 // constructor thunks
285 // NOLINTBEGIN
286 MCAPI void* $ctor(::std::unique_ptr<::ChunkSource> parent);
287 // NOLINTEND
288
289public:
290 // destructor thunk
291 // NOLINTBEGIN
292 MCAPI void $dtor();
293 // NOLINTEND
294
295public:
296 // virtual function thunks
297 // NOLINTBEGIN
298 MCAPI void $shutdown();
299
300 MCAPI bool $isShutdownDone();
301
302 MCFOLD ::std::shared_ptr<::LevelChunk> $getExistingChunk(::ChunkPos const& pos);
303
304 MCFOLD ::std::shared_ptr<::LevelChunk> $getRandomChunk(::Random& random);
305
306 MCAPI bool $isChunkKnown(::ChunkPos const& chunkPos);
307
308 MCAPI bool $isChunkSaved(::ChunkPos const& chunkPos);
309
310 MCAPI ::std::shared_ptr<::LevelChunk>
311 $createNewChunk(::ChunkPos const& cp, ::ChunkSource::LoadMode lm, bool readOnly);
312
313 MCAPI ::std::shared_ptr<::LevelChunk>
314 $getOrLoadChunk(::ChunkPos const& cp, ::ChunkSource::LoadMode lm, bool readOnly);
315
316 MCFOLD bool $structurePostProcessChunk(::ChunkViewSource& neighborhood);
317
318 MCFOLD bool $decorationPostProcessChunk(::ChunkViewSource& neighborhood);
319
320 MCFOLD void $checkAndReplaceChunk(::ChunkViewSource& neighborhood, ::LevelChunk& lc);
321
322 MCFOLD bool $verifyChunkNeedsNeighborAwareUpgrade(::LevelChunk& lc);
323
324 MCFOLD void $neighborAwareChunkUpgrade(::LevelChunk& levelChunk, ::ChunkViewSource& neighborhood);
325
326 MCAPI void $loadChunk(::LevelChunk& lc, bool forceImmediateReplacementDataLoad);
327
328 MCAPI void $postProcessMobsAt(::BlockSource& region, int chunkWestBlock, int chunkNorthBlock, ::Random& random);
329
330 MCAPI void $postProcessMobsAt(::BlockSource& region, ::BoundingBox const& chunkBB) const;
331
332 MCAPI void $deleteAllChunkData(
333 ::std::unordered_set<::ChunkPos> chunksToDelete,
334 ::std::function<void()> completionCallback,
335 ::std::shared_ptr<::ChunkDeletionMetadata> metadata
336 );
337
338 MCAPI void $deleteStoredChunkData(
339 ::std::unordered_set<::ChunkPos> chunksToDelete,
340 ::std::function<void()> completionCallback,
341 ::std::shared_ptr<::ChunkDeletionMetadata> metadata
342 );
343
344 MCAPI bool $saveLiveChunk(::LevelChunk& lc);
345
346 MCAPI void $writeEntityChunkTransfer(::LevelChunk& levelChunk);
347
348 MCAPI void $writeEntityChunkTransfersToUnloadedChunk(
349 ::ChunkKey const& chunkKey,
350 ::std::vector<::ActorUnloadedChunkTransferEntry> const& transfers
351 );
352
353 MCAPI void $deserializeActorStorageToLevelChunk(::LevelChunk& levelChunk);
354
355 MCAPI void $hintDiscardBatchBegin();
356
357 MCAPI void $hintDiscardBatchEnd();
358
359 MCAPI void $acquireDiscarded(::std::unique_ptr<::LevelChunk, ::LevelChunkFinalDeleter> ptr);
360
361 MCAPI void $compact();
362
363 MCAPI void $flushPendingDiscardedChunkWrites();
364
365 MCAPI void $flushThreadBatch();
366
367 MCFOLD bool $isWithinWorldLimit(::ChunkPos const& cp) const;
368
369 MCFOLD ::std::unordered_map<::ChunkPos, ::std::weak_ptr<::LevelChunk>> const* $getChunkMap();
370
371 MCAPI ::std::unordered_map<::ChunkPos, ::std::weak_ptr<::LevelChunk>> const& $getStorage() const;
372
373 MCFOLD void $clearDeletedEntities();
374
375 MCFOLD bool $canCreateViews() const;
376
377 MCAPI ::std::unique_ptr<::BlendingDataProvider> $tryGetBlendingDataProvider();
378
379 MCAPI ::std::shared_ptr<::LevelChunkMetaDataDictionary> $loadLevelChunkMetaDataDictionary();
380
381 MCFOLD void $setLevelChunk(::std::shared_ptr<::LevelChunk> lc);
382
383 MCAPI bool $canLaunchTasks() const;
384
385 MCAPI bool $chunkPosNeedsBlending(::ChunkPos const& cp);
386
387 MCAPI void $_clearBlendingCache();
388
389
390 // NOLINTEND
391
392public:
393 // vftables
394 // NOLINTBEGIN
395 MCAPI static void** $vftable();
396 // NOLINTEND
397};
Definition EnableNonOwnerReferences.h:7
static MCAPI void ** $vftable()
Definition BlendingDataProvider.h:5
Definition BlockPos.h:19
Definition BlockSource.h:71
Definition BoundingBox.h:13
Definition ChunkKey.h:14
Definition ChunkPos.h:11
Definition ChunkViewSource.h:22
Definition Dimension.h:85
Definition ILevelStorageManagerConnector.h:13
Definition LevelChunkBuilderData.h:16
Definition LevelChunkGridAreaElement.h:6
Definition LevelChunkMetaDataDictionary.h:11
Definition LevelChunk.h:79
Definition LevelStorage.h:25
Definition Level.h:250
Definition Random.h:10
Definition TaskResult.h:5
Definition move_only_function.h:9
Definition _HeaderOutputPredefine.h:238
Definition buffer_span.h:6
Definition ActorUnloadedChunkTransferEntry.h:13
Definition ChunkDeletionMetadata.h:5
Definition LevelChunkFinalDeleter.h:5