Java源码示例:net.minecraft.world.chunk.ChunkSection
示例1
@Inject(method = "loadChunkFromPacket", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/WorldChunk;getSectionArray()[Lnet/minecraft/world/chunk/ChunkSection;"))
private void recalculateHeightmaps(int x, int z, BiomeArray biomeArray, PacketByteBuf buf, CompoundTag tag, int verticalStripMask, boolean bl, CallbackInfoReturnable<WorldChunk> ci) {
if (ConnectionInfo.protocolVersion <= Protocols.V1_13_2) {
WorldChunk chunk = this.chunk.get();
for (ChunkSection section : chunk.getSectionArray()) {
if (section != null) {
section.calculateCounts();
}
}
Heightmap.populateHeightmaps(chunk, CLIENT_HEIGHTMAPS);
}
this.chunk.set(null);
}
示例2
@Redirect(method = "deserialize", at = @At(value = "NEW", target = "net/minecraft/world/chunk/WorldChunk"))
private static WorldChunk newWorldChunk(
World newWorld, ChunkPos newChunkPos, Biome[] newBiomes, UpgradeData newUpgradeData, TickScheduler<Block> newTickScheduler, TickScheduler<Fluid> newTickScheduler2, long newL, @Nullable ChunkSection[] newChunkSections, @Nullable Consumer<WorldChunk> newConsumer,
ServerWorld serverWorld, StructureManager structureManager, PointOfInterestStorage pointOfInterestStorage, ChunkPos chunkPos, CompoundTag compoundTag) {
WorldChunk chunk = new WorldChunk(newWorld, newChunkPos, newBiomes, newUpgradeData, newTickScheduler, newTickScheduler2, newL, newChunkSections, newConsumer);
CompoundTag level = compoundTag.getCompound("Level");
if (level.contains("ForgeCaps")) {
((CapabilityProviderHolder) chunk).deserializeCaps(level.getCompound("ForgeCaps"));
}
return chunk;
}
示例3
/**
* Use Controller.requestBlockFinder() to trigger a scan.
*/
private void blockFinder() {
HashMap<UUID, BlockData> blocks = Controller.getBlockStore().getStore();
if ( blocks.isEmpty() ) {
if( !Render.syncRenderList.isEmpty() )
Render.syncRenderList.clear();
return; // no need to scan the region if there's nothing to find
}
final World world = XRay.mc.world;
final PlayerEntity player = XRay.mc.player;
if( world == null || player == null )
return;
final List<RenderBlockProps> renderQueue = new ArrayList<>();
int lowBoundX, highBoundX, lowBoundY, highBoundY, lowBoundZ, highBoundZ;
// Used for cleaning up the searching process
BlockState currentState;
FluidState currentFluid;
ResourceLocation block;
Pair<BlockData, UUID> dataWithUUID;
// Loop on chunks (x, z)
for ( int chunkX = box.minChunkX; chunkX <= box.maxChunkX; chunkX++ )
{
// Pre-compute the extend bounds on X
int x = chunkX << 4; // lowest x coord of the chunk in block/world coordinates
lowBoundX = (x < box.minX) ? box.minX - x : 0; // lower bound for x within the extend
highBoundX = (x + 15 > box.maxX) ? box.maxX - x : 15;// and higher bound. Basically, we clamp it to fit the radius.
for ( int chunkZ = box.minChunkZ; chunkZ <= box.maxChunkZ; chunkZ++ )
{
// Time to getStore the chunk (16x256x16) and split it into 16 vertical extends (16x16x16)
if (!world.chunkExists(chunkX, chunkZ)) {
continue; // We won't find anything interesting in unloaded chunks
}
Chunk chunk = world.getChunk( chunkX, chunkZ );
ChunkSection[] extendsList = chunk.getSections();
// Pre-compute the extend bounds on Z
int z = chunkZ << 4;
lowBoundZ = (z < box.minZ) ? box.minZ - z : 0;
highBoundZ = (z + 15 > box.maxZ) ? box.maxZ - z : 15;
// Loop on the extends around the player's layer (6 down, 2 up)
for ( int curExtend = box.minChunkY; curExtend <= box.maxChunkY; curExtend++ )
{
ChunkSection ebs = extendsList[curExtend];
if (ebs == null) // happens quite often!
continue;
// Pre-compute the extend bounds on Y
int y = curExtend << 4;
lowBoundY = (y < box.minY) ? box.minY - y : 0;
highBoundY = (y + 15 > box.maxY) ? box.maxY - y : 15;
// Now that we have an extend, let's check all its blocks
for ( int i = lowBoundX; i <= highBoundX; i++ ) {
for ( int j = lowBoundY; j <= highBoundY; j++ ) {
for ( int k = lowBoundZ; k <= highBoundZ; k++ ) {
currentState = ebs.getBlockState(i, j, k);
currentFluid = currentState.getFluidState();
if( (currentFluid.getFluid() == Fluids.LAVA || currentFluid.getFluid() == Fluids.FLOWING_LAVA) && Controller.isLavaActive() ) {
renderQueue.add(new RenderBlockProps(x + i, y + j, z + k, 0xff0000));
continue;
}
// Reject blacklisted blocks
if( Controller.blackList.contains(currentState.getBlock()) )
continue;
block = currentState.getBlock().getRegistryName();
if( block == null )
continue;
dataWithUUID = Controller.getBlockStore().getStoreByReference(block.toString());
if( dataWithUUID == null )
continue;
if( dataWithUUID.getKey() == null || !dataWithUUID.getKey().isDrawing() ) // fail safe
continue;
// Push the block to the render queue
renderQueue.add(new RenderBlockProps(x + i, y + j, z + k, dataWithUUID.getKey().getColor()));
}
}
}
}
}
}
final BlockPos playerPos = player.func_233580_cy_(); // @mcp: func_233580_cy_ = getPosition (blockPos)
renderQueue.sort((t, t1) -> Double.compare(t1.distanceSq(playerPos), t.distanceSq(playerPos)));
Render.syncRenderList.clear();
Render.syncRenderList.addAll( renderQueue ); // Add all our found blocks to the Render.syncRenderList list. To be use by Render when drawing.
}