diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java index 12311505..0607e212 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java @@ -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() { @@ -74,6 +84,7 @@ abstract class LevelChunkSectionMixin implements BlockCountingChunkSection { @Override public final ShortList moonrise$getTickingBlockList() { + this.createTickingBlocks(); return this.tickingBlocks; } @@ -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))); @@ -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 data = this.states.data; @@ -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)); diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/random_ticking/ServerLevelMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/random_ticking/ServerLevelMixin.java index b861d52b..8f68a112 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/random_ticking/ServerLevelMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/random_ticking/ServerLevelMixin.java @@ -85,6 +85,10 @@ private LevelChunkSection[] optimiseRandomTick(final LevelChunk chunk, final LevelChunkSection section = sections[sectionIndex]; final PalettedContainer states = section.states; if (!section.isRandomlyTickingBlocks()) { + continue; + } + + if (!((BlockCountingChunkSection)section).moonrise$anyTickingBlocks()) { continue; } diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java b/src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java index 0d1443a1..5de55a3e 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java @@ -4,6 +4,8 @@ public interface BlockCountingChunkSection { + public boolean moonrise$anyTickingBlocks(); + public boolean moonrise$hasSpecialCollidingBlocks(); public ShortList moonrise$getTickingBlockList();