Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,17 @@ abstract class LevelChunkSectionMixin implements BlockCountingChunkSection {
private short specialCollidingBlocks;

@Unique
private final ShortList tickingBlocks = new ShortList();
private ShortList tickingBlocks = null;

@Override
public boolean moonrise$anyTickingBlocks() {
return tickingBlocks != null;
}

@Unique
private void createTickingBlocks() {
if (tickingBlocks == null) tickingBlocks = new ShortList();
}

@Override
public final boolean moonrise$hasSpecialCollidingBlocks() {
Expand All @@ -74,6 +84,7 @@ abstract class LevelChunkSectionMixin implements BlockCountingChunkSection {

@Override
public final ShortList moonrise$getTickingBlockList() {
this.createTickingBlocks();
return this.tickingBlocks;
}

Expand Down Expand Up @@ -113,6 +124,7 @@ private void updateBlockCallback(final int x, final int y, final int z, final Bl
final boolean oldTicking = oldState.isRandomlyTicking();
final boolean newTicking = newState.isRandomlyTicking();
if (oldTicking != newTicking) {
this.createTickingBlocks();
final ShortList tickingBlocks = this.tickingBlocks;
final short position = (short)(x | (z << 4) | (y << (4+4)));

Expand Down Expand Up @@ -150,7 +162,7 @@ public void recalcBlockCounts() {
this.tickingBlockCount = (short)0;
this.tickingFluidCount = (short)0;
this.specialCollidingBlocks = (short)0;
this.tickingBlocks.clear();
this.tickingBlocks = null;

if (this.maybeHas((final BlockState state) -> !state.isAir())) {
final PalettedContainer.Data<BlockState> data = this.states.data;
Expand Down Expand Up @@ -187,6 +199,7 @@ public void recalcBlockCounts() {
final short[] raw = coordinates.elements();
final int rawLen = raw.length;

this.createTickingBlocks();
final ShortList tickingBlocks = this.tickingBlocks;

tickingBlocks.setMinCapacity(Math.min((rawLen + tickingBlocks.size()) * 3 / 2, 16*16*16));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ private LevelChunkSection[] optimiseRandomTick(final LevelChunk chunk,
final LevelChunkSection section = sections[sectionIndex];
final PalettedContainer<BlockState> states = section.states;
if (!section.isRandomlyTickingBlocks()) {
continue;
}

if (!((BlockCountingChunkSection)section).moonrise$anyTickingBlocks()) {
continue;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

public interface BlockCountingChunkSection {

public boolean moonrise$anyTickingBlocks();

public boolean moonrise$hasSpecialCollidingBlocks();

public ShortList moonrise$getTickingBlockList();
Expand Down