Retrieve BlockState directly from chunk section for random tick

This appears to be faster than going directly to the global
palette, even though the global palette should be a simple list
get call.
This commit is contained in:
Spottedleaf
2024-07-14 18:19:41 -07:00
parent 225d5f937d
commit b160a14068

View File

@@ -20,6 +20,7 @@ import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.chunk.LevelChunkSection;
import net.minecraft.world.level.chunk.PalettedContainer;
import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.storage.WritableLevelData; import net.minecraft.world.level.storage.WritableLevelData;
@@ -67,6 +68,7 @@ public abstract class ServerLevelMixin extends Level implements WorldGenLevel {
for (int sectionIndex = 0, sectionsLen = sections.length; sectionIndex < sectionsLen; sectionIndex++) { for (int sectionIndex = 0, sectionsLen = sections.length; sectionIndex < sectionsLen; sectionIndex++) {
final int offsetY = (sectionIndex + minSection) << 4; final int offsetY = (sectionIndex + minSection) << 4;
final LevelChunkSection section = sections[sectionIndex]; final LevelChunkSection section = sections[sectionIndex];
final PalettedContainer<BlockState> states = section.states;
if (section == null || !section.isRandomlyTickingBlocks()) { if (section == null || !section.isRandomlyTickingBlocks()) {
continue; continue;
} }
@@ -86,14 +88,14 @@ public abstract class ServerLevelMixin extends Level implements WorldGenLevel {
} }
final long raw = tickList.getRaw(index); final long raw = tickList.getRaw(index);
final BlockState state = IBlockDataList.getBlockDataFromRaw(raw);
final int location = IBlockDataList.getLocationFromRaw(raw); final int location = IBlockDataList.getLocationFromRaw(raw);
final int randomX = (location & 15) | offsetX; final int randomX = (location & 15);
final int randomY = ((location >>> (4 + 4)) & 255) | offsetY; final int randomY = ((location >>> (4 + 4)) & 255);
final int randomZ = ((location >>> 4) & 15) | offsetZ; final int randomZ = ((location >>> 4) & 15);
final BlockState state = states.get(randomX | (randomZ << 4) | (randomZ << 8));
// do not use a mutable pos, as some random tick implementations store the input without calling immutable()! // do not use a mutable pos, as some random tick implementations store the input without calling immutable()!
final BlockPos pos = new BlockPos(randomX, randomY, randomZ); final BlockPos pos = new BlockPos(randomX | offsetX, randomY | offsetY, randomZ | offsetZ);
state.randomTick((ServerLevel)(Object)this, pos, random); state.randomTick((ServerLevel)(Object)this, pos, random);
if (tickFluids) { if (tickFluids) {