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 intprivate static final intprivate static final byteprivate static final byteprivate static final byteprivate final ChunkGeneratorStructureStateprivate final it.unimi.dsi.fastutil.longs.Long2LongMapprivate final ChunkStatusUpdateListenerprivate final it.unimi.dsi.fastutil.longs.Long2ByteMapprivate final ChunkMap.DistanceManagerprivate static final intprivate final it.unimi.dsi.fastutil.ints.Int2ObjectMap<ChunkMap.TrackedEntity> static final int(package private) final ServerLevelprivate final ThreadedLevelLightEngineprivate static final org.slf4j.Loggerprivate final BlockableEventLoop<Runnable> private final ProcessorHandle<ChunkTaskPriorityQueueSorter.Message<Runnable>> static final intstatic final intprivate booleanprivate final Supplier<DimensionDataStorage> private final List<ChunkGenerationTask> private final it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap<ChunkHolder> private final PlayerMapprivate final PoiManagerprivate final ChunkProgressListenerprivate final ChunkTaskPriorityQueueSorterprivate final RandomStateprivate intprivate final Stringprivate final AtomicInteger(package private) final it.unimi.dsi.fastutil.longs.LongSetprivate static final CompletableFuture<ChunkResult<List<ChunkAccess>>> private static final ChunkResult<List<ChunkAccess>> private final it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap<ChunkHolder> private it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap<ChunkHolder> private final WorldGenContextprivate 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 p_347661_) protected void(package private) booleananyPlayerCloseEnoughForSpawning(ChunkPos p_183880_) private voidapplyChunkTrackingView(ServerPlayer p_294188_, ChunkTrackingView p_294174_) applyStep(GenerationChunkHolder p_347627_, ChunkStep p_347638_, StaticCache2D<GenerationChunkHolder> p_347552_) voidprotected voidbroadcastAndSend(Entity p_140334_, Packet<?> p_140335_) voidclose()private ChunkAccesscreateEmptyChunk(ChunkPos p_214962_) debugFuturesAndCreateReportedException(IllegalStateException p_203752_, String p_203753_) private static voiddropChunk(ServerPlayer p_294215_, ChunkPos p_294758_) (package private) voiddumpChunks(Writer p_140275_) private static doubleeuclideanDistanceSquared(ChunkPos p_140227_, Entity p_140228_) protected ChunkGeneratorprotected ChunkGeneratorStructureStategetChunkDebugData(ChunkPos p_140205_) protected IntSuppliergetChunkQueueLevel(long p_140372_) private CompletableFuture<ChunkResult<List<ChunkAccess>>> getChunkRangeFuture(ChunkHolder p_281446_, int p_282030_, IntFunction<ChunkStatus> p_282923_) protected Iterable<ChunkHolder> getChunkToSend(long p_300929_) protected ThreadedLevelLightEnginegetPlayers(ChunkPos p_183801_, boolean p_183802_) getPlayersCloseForSpawning(ChunkPos p_183889_) (package private) intgetPlayerViewDistance(ServerPlayer p_295024_) protected PoiManagerintprotected ChunkHoldergetUpdatingChunkIfPresent(long p_140175_) getVisibleChunkIfPresent(long p_140328_) private ChunkAccesshandleChunkLoadFailure(Throwable p_214902_, ChunkPos p_214903_) booleanhasWork()private static booleanisChunkDataValid(CompoundTag p_214941_) private booleanisChunkOnTrackedBorder(ServerPlayer p_295596_, int p_294838_, int p_295212_) (package private) booleanisChunkTracked(ServerPlayer p_295366_, int p_294911_, int p_296247_) private booleanisExistingChunkFull(ChunkPos p_140426_) private static voidmarkChunkPendingToSend(ServerPlayer p_295834_, LevelChunk p_296281_) private voidmarkChunkPendingToSend(ServerPlayer p_294638_, ChunkPos p_296183_) private bytemarkPosition(ChunkPos p_140230_, ChunkType p_332120_) private voidmarkPositionReplaceable(ChunkPos p_140423_) voidmove(ServerPlayer p_140185_) private voidonChunkReadyToSend(LevelChunk p_296003_) (package private) voidonFullChunkStatusChange(ChunkPos p_287612_, FullChunkStatus p_287685_) private booleanplayerIsCloseEnoughForSpawning(ServerPlayer p_183752_, ChunkPos p_183753_) prepareAccessibleChunk(ChunkHolder p_143110_) prepareEntityTickingChunk(ChunkHolder p_281455_) prepareTickingChunk(ChunkHolder p_143054_) private static StringprintFuture(CompletableFuture<ChunkResult<LevelChunk>> p_140279_) private voidprocessUnloads(BooleanSupplier p_140354_) protected booleanprotected RandomStateprivate CompletableFuture<Optional<CompoundTag>> voidreleaseGeneration(GenerationChunkHolder p_347698_) protected voidremoveEntity(Entity p_140332_) voidresendBiomesForChunks(List<ChunkAccess> p_275577_) private voidrunGenerationTask(ChunkGenerationTask p_347721_) voidprivate booleansave(ChunkAccess p_140259_) protected voidsaveAllChunks(boolean p_140319_) private booleansaveChunkIfNeeded(ChunkHolder p_198875_) private CompletableFuture<ChunkAccess> scheduleChunkLoad(ChunkPos p_140418_) scheduleGenerationTask(ChunkStatus p_347605_, ChunkPos p_347675_) voidNeo: PR #937 This is for mainly pre-generation usage such as Neoforge's generate command.private voidscheduleUnload(long p_140182_, ChunkHolder p_140183_) protected voidsetServerViewDistance(int p_295758_) intsize()private booleanskipPlayer(ServerPlayer p_140330_) protected voidtick()protected voidtick(BooleanSupplier p_140281_) (package private) ChunkHolderupdateChunkScheduling(long p_140177_, int p_140178_, ChunkHolder p_140179_, int p_140180_) private voidupdateChunkTracking(ServerPlayer p_183755_) private voidupdatePlayerPos(ServerPlayer p_140374_) (package private) voidupdatePlayerStatus(ServerPlayer p_140193_, boolean p_140194_) private CompoundTagupgradeChunkTag(CompoundTag p_214948_) voidwaitForLightBeforeSending(ChunkPos p_301194_, int p_301130_) 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> updatingChunkMap -
visibleChunkMap
private volatile it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap<ChunkHolder> visibleChunkMap -
pendingUnloads
-
pendingGenerationTasks
-
level
-
lightEngine
-
mainThreadExecutor
-
randomState
-
chunkGeneratorState
-
overworldDataStorage
-
poiManager
-
toDrop
final it.unimi.dsi.fastutil.longs.LongSet toDrop -
modified
private boolean modified -
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
-
isChunkTracked
-
isChunkOnTrackedBorder
-
getLightEngine
-
getUpdatingChunkIfPresent
-
getVisibleChunkIfPresent
-
getChunkQueueLevel
-
getChunkDebugData
-
getChunkRangeFuture
private CompletableFuture<ChunkResult<List<ChunkAccess>>> getChunkRangeFuture(ChunkHolder p_281446_, int p_282030_, IntFunction<ChunkStatus> p_282923_) -
debugFuturesAndCreateReportedException
public ReportedException debugFuturesAndCreateReportedException(IllegalStateException p_203752_, String p_203753_) -
prepareEntityTickingChunk
-
updateChunkScheduling
@Nullable ChunkHolder updateChunkScheduling(long p_140177_, int p_140178_, @Nullable ChunkHolder p_140179_, int p_140180_) -
close
- Specified by:
closein interfaceAutoCloseable- Overrides:
closein classChunkStorage- Throws:
IOException
-
saveAllChunks
protected void saveAllChunks(boolean p_140319_) -
tick
-
hasWork
public boolean hasWork() -
processUnloads
-
scheduleUnload
-
promoteChunkMap
protected boolean promoteChunkMap() -
scheduleChunkLoad
-
isChunkDataValid
-
handleChunkLoadFailure
-
createEmptyChunk
-
markPositionReplaceable
-
markPosition
-
acquireGeneration
- Specified by:
acquireGenerationin interfaceGeneratingChunkMap
-
releaseGeneration
- Specified by:
releaseGenerationin interfaceGeneratingChunkMap
-
applyStep
public CompletableFuture<ChunkAccess> applyStep(GenerationChunkHolder p_347627_, ChunkStep p_347638_, StaticCache2D<GenerationChunkHolder> p_347552_) - Specified by:
applyStepin interfaceGeneratingChunkMap
-
scheduleGenerationTask
- Specified by:
scheduleGenerationTaskin interfaceGeneratingChunkMap
-
runGenerationTask
-
runGenerationTasks
public void runGenerationTasks()- Specified by:
runGenerationTasksin interfaceGeneratingChunkMap
-
prepareTickingChunk
-
onChunkReadyToSend
-
prepareAccessibleChunk
-
getTickingGenerated
public int getTickingGenerated() -
saveChunkIfNeeded
-
save
-
isExistingChunkFull
-
setServerViewDistance
protected void setServerViewDistance(int p_295758_) -
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
- Specified by:
getPlayersin 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.
-