70 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.server.level;
 | |
| 
 | |
| import net.minecraft.world.level.chunk.status.ChunkPyramid;
 | |
| import net.minecraft.world.level.chunk.status.ChunkStatus;
 | |
| import net.minecraft.world.level.chunk.status.ChunkStep;
 | |
| import org.jetbrains.annotations.Contract;
 | |
| import org.jetbrains.annotations.Nullable;
 | |
| 
 | |
| public class ChunkLevel {
 | |
| 	private static final int FULL_CHUNK_LEVEL = 33;
 | |
| 	private static final int BLOCK_TICKING_LEVEL = 32;
 | |
| 	private static final int ENTITY_TICKING_LEVEL = 31;
 | |
| 	private static final ChunkStep FULL_CHUNK_STEP = ChunkPyramid.GENERATION_PYRAMID.getStepTo(ChunkStatus.FULL);
 | |
| 	public static final int RADIUS_AROUND_FULL_CHUNK = FULL_CHUNK_STEP.accumulatedDependencies().getRadius();
 | |
| 	public static final int MAX_LEVEL = 33 + RADIUS_AROUND_FULL_CHUNK;
 | |
| 
 | |
| 	@Nullable
 | |
| 	public static ChunkStatus generationStatus(int level) {
 | |
| 		return getStatusAroundFullChunk(level - 33, null);
 | |
| 	}
 | |
| 
 | |
| 	@Nullable
 | |
| 	@Contract("_,!null->!null;_,_->_")
 | |
| 	public static ChunkStatus getStatusAroundFullChunk(int distance, @Nullable ChunkStatus chunkStatus) {
 | |
| 		if (distance > RADIUS_AROUND_FULL_CHUNK) {
 | |
| 			return chunkStatus;
 | |
| 		} else {
 | |
| 			return distance <= 0 ? ChunkStatus.FULL : FULL_CHUNK_STEP.accumulatedDependencies().get(distance);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public static ChunkStatus getStatusAroundFullChunk(int distance) {
 | |
| 		return getStatusAroundFullChunk(distance, ChunkStatus.EMPTY);
 | |
| 	}
 | |
| 
 | |
| 	public static int byStatus(ChunkStatus status) {
 | |
| 		return 33 + FULL_CHUNK_STEP.getAccumulatedRadiusOf(status);
 | |
| 	}
 | |
| 
 | |
| 	public static FullChunkStatus fullStatus(int level) {
 | |
| 		if (level <= 31) {
 | |
| 			return FullChunkStatus.ENTITY_TICKING;
 | |
| 		} else if (level <= 32) {
 | |
| 			return FullChunkStatus.BLOCK_TICKING;
 | |
| 		} else {
 | |
| 			return level <= 33 ? FullChunkStatus.FULL : FullChunkStatus.INACCESSIBLE;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public static int byStatus(FullChunkStatus status) {
 | |
| 		return switch (status) {
 | |
| 			case INACCESSIBLE -> MAX_LEVEL;
 | |
| 			case FULL -> 33;
 | |
| 			case BLOCK_TICKING -> 32;
 | |
| 			case ENTITY_TICKING -> 31;
 | |
| 		};
 | |
| 	}
 | |
| 
 | |
| 	public static boolean isEntityTicking(int level) {
 | |
| 		return level <= 31;
 | |
| 	}
 | |
| 
 | |
| 	public static boolean isBlockTicking(int level) {
 | |
| 		return level <= 32;
 | |
| 	}
 | |
| 
 | |
| 	public static boolean isLoaded(int level) {
 | |
| 		return level <= MAX_LEVEL;
 | |
| 	}
 | |
| }
 |