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.chunk.LevelChunk;
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.material.FluidState;
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++) {
final int offsetY = (sectionIndex + minSection) << 4;
final LevelChunkSection section = sections[sectionIndex];
final PalettedContainer<BlockState> states = section.states;
if (section == null || !section.isRandomlyTickingBlocks()) {
continue;
}
@@ -86,14 +88,14 @@ public abstract class ServerLevelMixin extends Level implements WorldGenLevel {
}
final long raw = tickList.getRaw(index);
final BlockState state = IBlockDataList.getBlockDataFromRaw(raw);
final int location = IBlockDataList.getLocationFromRaw(raw);
final int randomX = (location & 15) | offsetX;
final int randomY = ((location >>> (4 + 4)) & 255) | offsetY;
final int randomZ = ((location >>> 4) & 15) | offsetZ;
final int randomX = (location & 15);
final int randomY = ((location >>> (4 + 4)) & 255);
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()!
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);
if (tickFluids) {