Package net.minecraft.server.level
Class ChunkMap
java.lang.Object
net.minecraft.world.level.chunk.storage.ChunkStorage
net.minecraft.server.level.ChunkMap
- All Implemented Interfaces:
AutoCloseable
,ChunkHolder.PlayerProvider
,GeneratingChunkMap
public class ChunkMap
extends ChunkStorage
implements ChunkHolder.PlayerProvider, GeneratingChunkMap
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) class
(package private) class
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final int
private static final int
private static final byte
private static final byte
private static final byte
private final ChunkGeneratorStructureState
private final it.unimi.dsi.fastutil.longs.Long2LongMap
private final ChunkStatusUpdateListener
private final it.unimi.dsi.fastutil.longs.Long2ByteMap
private final ChunkMap.DistanceManager
private static final int
private final it.unimi.dsi.fastutil.ints.Int2ObjectMap
<ChunkMap.TrackedEntity> static final int
(package private) final ServerLevel
private final ThreadedLevelLightEngine
private static final org.slf4j.Logger
private final BlockableEventLoop
<Runnable> private final ProcessorHandle
<ChunkTaskPriorityQueueSorter.Message<Runnable>> static final int
static final int
private boolean
True if changes have been made toinvalid reference
#loadedChunks
invalid reference
#immutableLoadedChunks
private final Supplier
<DimensionDataStorage> private final List
<ChunkGenerationTask> private final it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap
<ChunkHolder> private final PlayerMap
private final PoiManager
private final ChunkProgressListener
private final ChunkTaskPriorityQueueSorter
private final RandomState
private int
private final String
private final AtomicInteger
(package private) final it.unimi.dsi.fastutil.longs.LongSet
Chunks that have been requested to be unloaded, but haven't been unloaded yet.private static final CompletableFuture
<ChunkResult<List<ChunkAccess>>> private static final ChunkResult
<List<ChunkAccess>> private final it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap
<ChunkHolder> Chunks in memory.private it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap
<ChunkHolder> Same asinvalid reference
#loadedChunks
private final WorldGenContext
private final ProcessorHandle
<ChunkTaskPriorityQueueSorter.Message<Runnable>> Fields inherited from class net.minecraft.world.level.chunk.storage.ChunkStorage
fixerUpper, LAST_MONOLYTH_STRUCTURE_DATA_VERSION
-
Constructor Summary
ConstructorsConstructorDescriptionChunkMap
(ServerLevel p_214836_, LevelStorageSource.LevelStorageAccess p_214837_, com.mojang.datafixers.DataFixer p_214838_, StructureTemplateManager p_214839_, Executor p_214840_, BlockableEventLoop<Runnable> p_214841_, LightChunkGetter p_214842_, ChunkGenerator p_214843_, ChunkProgressListener p_214844_, ChunkStatusUpdateListener p_214845_, Supplier<DimensionDataStorage> p_214846_, int p_214847_, boolean p_214848_) -
Method Summary
Modifier and TypeMethodDescriptionacquireGeneration
(long pChunkPos) protected void
(package private) boolean
anyPlayerCloseEnoughForSpawning
(ChunkPos pChunkPos) private void
applyChunkTrackingView
(ServerPlayer pPlayer, ChunkTrackingView pChunkTrackingView) applyStep
(GenerationChunkHolder pChunk, ChunkStep pStep, StaticCache2D<GenerationChunkHolder> pCache) void
protected void
broadcastAndSend
(Entity pEntity, Packet<?> pPacket) void
close()
private ChunkAccess
createEmptyChunk
(ChunkPos pChunkPos) debugFuturesAndCreateReportedException
(IllegalStateException pException, String pDetails) private static void
dropChunk
(ServerPlayer pPlayer, ChunkPos pChunkPos) (package private) void
dumpChunks
(Writer pWriter) private static double
euclideanDistanceSquared
(ChunkPos pChunkPos, Entity pEntity) Returns the squared distance to the center of the chunk.protected ChunkGenerator
protected ChunkGeneratorStructureState
getChunkDebugData
(ChunkPos pPos) protected IntSupplier
getChunkQueueLevel
(long pChunkPos) private CompletableFuture
<ChunkResult<List<ChunkAccess>>> getChunkRangeFuture
(ChunkHolder pChunkHolder, int pRange, IntFunction<ChunkStatus> pStatusGetter) protected Iterable
<ChunkHolder> getChunkToSend
(long pChunkPos) protected ThreadedLevelLightEngine
getPlayers
(ChunkPos pPos, boolean pBoundaryOnly) Returns the players tracking the given chunk.getPlayersCloseForSpawning
(ChunkPos pChunkPos) (package private) int
getPlayerViewDistance
(ServerPlayer pPlayer) protected PoiManager
int
protected ChunkHolder
getUpdatingChunkIfPresent
(long pChunkPos) getVisibleChunkIfPresent
(long pChunkPos) private ChunkAccess
handleChunkLoadFailure
(Throwable pException, ChunkPos pChunkPos) boolean
hasWork()
private static boolean
isChunkDataValid
(CompoundTag pTag) private boolean
isChunkOnTrackedBorder
(ServerPlayer pPlayer, int pX, int pZ) Checks if a chunk is on the edge of the player's view distance.(package private) boolean
isChunkTracked
(ServerPlayer pPlayer, int pX, int pZ) Checks if a chunk is within a player's view distance.private boolean
isExistingChunkFull
(ChunkPos pChunkPos) private static void
markChunkPendingToSend
(ServerPlayer pPlayer, LevelChunk pChunk) private void
markChunkPendingToSend
(ServerPlayer pPlayer, ChunkPos pChunkPos) private byte
markPosition
(ChunkPos pChunkPos, ChunkType pChunkType) private void
markPositionReplaceable
(ChunkPos pChunkPos) void
move
(ServerPlayer pPlayer) private void
onChunkReadyToSend
(LevelChunk pChunk) (package private) void
onFullChunkStatusChange
(ChunkPos pChunkPos, FullChunkStatus pFullChunkStatus) private boolean
playerIsCloseEnoughForSpawning
(ServerPlayer pPlayer, ChunkPos pChunkPos) prepareAccessibleChunk
(ChunkHolder pHolder) prepareEntityTickingChunk
(ChunkHolder pChunk) prepareTickingChunk
(ChunkHolder pHolder) private static String
printFuture
(CompletableFuture<ChunkResult<LevelChunk>> pFuture) private void
processUnloads
(BooleanSupplier pHasMoreTime) protected boolean
protected RandomState
private CompletableFuture
<Optional<CompoundTag>> void
protected void
removeEntity
(Entity pEntity) void
resendBiomesForChunks
(List<ChunkAccess> pChunks) private void
runGenerationTask
(ChunkGenerationTask p_347721_) void
private boolean
save
(ChunkAccess p_140259_) protected void
saveAllChunks
(boolean pFlush) private boolean
saveChunkIfNeeded
(ChunkHolder p_198875_) private CompletableFuture
<ChunkAccess> scheduleChunkLoad
(ChunkPos pChunkPos) scheduleGenerationTask
(ChunkStatus pTargetStatus, ChunkPos pPos) void
Neo: PR #937 This is for mainly pre-generation usage such as Neoforge's generate command.private void
scheduleUnload
(long pChunkPos, ChunkHolder pChunkHolder) protected void
setServerViewDistance
(int pViewDistance) int
size()
private boolean
skipPlayer
(ServerPlayer pPlayer) protected void
tick()
protected void
tick
(BooleanSupplier pHasMoreTime) (package private) ChunkHolder
updateChunkScheduling
(long pChunkPos, int pNewLevel, ChunkHolder pHolder, int pOldLevel) Sets level and loads/unloads chunk.private void
updateChunkTracking
(ServerPlayer pPlayer) private void
updatePlayerPos
(ServerPlayer pPlayer) (package private) void
updatePlayerStatus
(ServerPlayer pPlayer, boolean pTrack) private CompoundTag
upgradeChunkTag
(CompoundTag p_214948_) void
waitForLightBeforeSending
(ChunkPos pChunkPos, int pRange) Methods inherited from class net.minecraft.world.level.chunk.storage.ChunkStorage
chunkScanner, flushWorker, getVersion, handleLegacyStructureIndex, injectDatafixingContext, isOldChunkAround, read, storageInfo, upgradeChunkTag, write
-
Field Details
-
UNLOADED_CHUNK_LIST_RESULT
-
UNLOADED_CHUNK_LIST_FUTURE
-
CHUNK_TYPE_REPLACEABLE
private static final byte CHUNK_TYPE_REPLACEABLE- See Also:
-
CHUNK_TYPE_UNKNOWN
private static final byte CHUNK_TYPE_UNKNOWN- See Also:
-
CHUNK_TYPE_FULL
private static final byte CHUNK_TYPE_FULL- See Also:
-
LOGGER
private static final org.slf4j.Logger LOGGER -
CHUNK_SAVED_PER_TICK
private static final int CHUNK_SAVED_PER_TICK- See Also:
-
CHUNK_SAVED_EAGERLY_PER_TICK
private static final int CHUNK_SAVED_EAGERLY_PER_TICK- See Also:
-
EAGER_CHUNK_SAVE_COOLDOWN_IN_MILLIS
private static final int EAGER_CHUNK_SAVE_COOLDOWN_IN_MILLIS- See Also:
-
MIN_VIEW_DISTANCE
public static final int MIN_VIEW_DISTANCE- See Also:
-
MAX_VIEW_DISTANCE
public static final int MAX_VIEW_DISTANCE- See Also:
-
FORCED_TICKET_LEVEL
public static final int FORCED_TICKET_LEVEL -
updatingChunkMap
private final it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap<ChunkHolder> updatingChunkMapChunks in memory. This should only ever be manipulated by the main thread. -
visibleChunkMap
private volatile it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap<ChunkHolder> visibleChunkMapSame asinvalid reference
#loadedChunks
-
pendingUnloads
-
pendingGenerationTasks
-
level
-
lightEngine
-
mainThreadExecutor
-
randomState
-
chunkGeneratorState
-
overworldDataStorage
-
poiManager
-
toDrop
final it.unimi.dsi.fastutil.longs.LongSet toDropChunks that have been requested to be unloaded, but haven't been unloaded yet. -
modified
private boolean modifiedTrue if changes have been made toinvalid reference
#loadedChunks
invalid reference
#immutableLoadedChunks
-
queueSorter
-
worldgenMailbox
-
mainThreadMailbox
-
progressListener
-
chunkStatusListener
-
distanceManager
-
tickingGenerated
-
storageName
-
playerMap
-
entityMap
-
chunkTypeCache
private final it.unimi.dsi.fastutil.longs.Long2ByteMap chunkTypeCache -
chunkSaveCooldowns
private final it.unimi.dsi.fastutil.longs.Long2LongMap chunkSaveCooldowns -
unloadQueue
-
serverViewDistance
private int serverViewDistance -
worldGenContext
-
-
Constructor Details
-
ChunkMap
public ChunkMap(ServerLevel p_214836_, LevelStorageSource.LevelStorageAccess p_214837_, com.mojang.datafixers.DataFixer p_214838_, StructureTemplateManager p_214839_, Executor p_214840_, BlockableEventLoop<Runnable> p_214841_, LightChunkGetter p_214842_, ChunkGenerator p_214843_, ChunkProgressListener p_214844_, ChunkStatusUpdateListener p_214845_, Supplier<DimensionDataStorage> p_214846_, int p_214847_, boolean p_214848_)
-
-
Method Details
-
generator
-
generatorState
-
randomState
-
euclideanDistanceSquared
Returns the squared distance to the center of the chunk. -
isChunkTracked
Checks if a chunk is within a player's view distance. -
isChunkOnTrackedBorder
Checks if a chunk is on the edge of the player's view distance. -
getLightEngine
-
getUpdatingChunkIfPresent
-
getVisibleChunkIfPresent
-
getChunkQueueLevel
-
getChunkDebugData
-
getChunkRangeFuture
private CompletableFuture<ChunkResult<List<ChunkAccess>>> getChunkRangeFuture(ChunkHolder pChunkHolder, int pRange, IntFunction<ChunkStatus> pStatusGetter) -
debugFuturesAndCreateReportedException
public ReportedException debugFuturesAndCreateReportedException(IllegalStateException pException, String pDetails) -
prepareEntityTickingChunk
-
updateChunkScheduling
@Nullable ChunkHolder updateChunkScheduling(long pChunkPos, int pNewLevel, @Nullable ChunkHolder pHolder, int pOldLevel) Sets level and loads/unloads chunk.- Parameters:
pHolder
- TheChunkHolder
of the chunk if it is loaded, and null otherwise.
-
close
- Specified by:
close
in interfaceAutoCloseable
- Overrides:
close
in classChunkStorage
- Throws:
IOException
-
saveAllChunks
protected void saveAllChunks(boolean pFlush) -
tick
-
hasWork
public boolean hasWork() -
processUnloads
-
scheduleUnload
-
promoteChunkMap
protected boolean promoteChunkMap() -
scheduleChunkLoad
-
isChunkDataValid
-
handleChunkLoadFailure
-
createEmptyChunk
-
markPositionReplaceable
-
markPosition
-
acquireGeneration
- Specified by:
acquireGeneration
in interfaceGeneratingChunkMap
-
releaseGeneration
- Specified by:
releaseGeneration
in interfaceGeneratingChunkMap
-
applyStep
public CompletableFuture<ChunkAccess> applyStep(GenerationChunkHolder pChunk, ChunkStep pStep, StaticCache2D<GenerationChunkHolder> pCache) - Specified by:
applyStep
in interfaceGeneratingChunkMap
-
scheduleGenerationTask
- Specified by:
scheduleGenerationTask
in interfaceGeneratingChunkMap
-
runGenerationTask
-
runGenerationTasks
public void runGenerationTasks()- Specified by:
runGenerationTasks
in interfaceGeneratingChunkMap
-
prepareTickingChunk
-
onChunkReadyToSend
-
prepareAccessibleChunk
-
getTickingGenerated
public int getTickingGenerated() -
saveChunkIfNeeded
-
save
-
isExistingChunkFull
-
setServerViewDistance
protected void setServerViewDistance(int pViewDistance) -
getPlayerViewDistance
-
markChunkPendingToSend
-
markChunkPendingToSend
-
dropChunk
-
getChunkToSend
-
size
public int size() -
getDistanceManager
-
getChunks
-
dumpChunks
- Throws:
IOException
-
printFuture
-
readChunk
-
upgradeChunkTag
-
anyPlayerCloseEnoughForSpawning
-
getPlayersCloseForSpawning
-
playerIsCloseEnoughForSpawning
-
skipPlayer
-
updatePlayerStatus
-
updatePlayerPos
-
move
-
updateChunkTracking
-
applyChunkTrackingView
-
getPlayers
Returns the players tracking the given chunk.- Specified by:
getPlayers
in interfaceChunkHolder.PlayerProvider
-
addEntity
-
removeEntity
-
tick
protected void tick() -
broadcast
-
broadcastAndSend
-
resendBiomesForChunks
-
getPoiManager
-
getStorageName
-
onFullChunkStatusChange
-
waitForLightBeforeSending
-
scheduleOnMainThreadMailbox
Neo: PR #937 This is for mainly pre-generation usage such as Neoforge's generate command. Use this to schedule chunk load tasks into ChunkTaskPriorityQueueSorter so a chunk is fully finished all of their tasks before scheduling more chunks to load. Reason for this is when scheduling a huge ton of Full Status chunk tasks to the server (to load chunks), you could cause the server to only process those loading tasks and never reach the two chunk tasks that are automatically scheduled to run after the chunk is loaded to Full. As a result of flooding the system with Full Status chunk tasks, the queue for the two kind of successor chunk tasks will grow and become a memory leak of lambdas and chunk references. Use this method to schedule tasks for loading chunks in your whenCompleteAsync method call so the tasks gets processed properly over time and not leak. SeeGenerationTask.enqueueChunks(it.unimi.dsi.fastutil.longs.LongList)
as an example usage of this method.
-