Skip to content

Commit 5fea434

Browse files
committed
Count fluids by their type to avoid unnecessary reads in Entity#updateFluidHeightAndDoFluidPushing
We can take fluid counts in a chunk section into account to avoid unnecessary searches as we were only checking for non empty blocks.
1 parent c22538c commit 5fea434

4 files changed

Lines changed: 102 additions & 1 deletion

File tree

fabric/src/main/java/ca/spottedleaf/moonrise/fabric/mixin/collisions/EntityMixin.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package ca.spottedleaf.moonrise.fabric.mixin.collisions;
22

3+
import ca.spottedleaf.moonrise.patches.block_counting.BlockCountingChunkSection;
34
import ca.spottedleaf.moonrise.patches.getblock.GetBlockLevel;
45
import it.unimi.dsi.fastutil.objects.Object2DoubleMap;
56
import net.minecraft.core.BlockPos;
7+
import net.minecraft.tags.FluidTags;
68
import net.minecraft.tags.TagKey;
79
import net.minecraft.util.Mth;
810
import net.minecraft.world.entity.Entity;
@@ -107,6 +109,20 @@ public boolean updateFluidHeightAndDoFluidPushing(final TagKey<Fluid> fluid, fin
107109
continue;
108110
}
109111

112+
final BlockCountingChunkSection blockCountingSection = (BlockCountingChunkSection)section;
113+
final boolean hasFluids;
114+
if (fluid == FluidTags.WATER) {
115+
hasFluids = blockCountingSection.moonrise$hasWaterFluids();
116+
} else if (fluid == FluidTags.LAVA) {
117+
hasFluids = blockCountingSection.moonrise$hasLavaFluids();
118+
} else {
119+
hasFluids = blockCountingSection.moonrise$hasFluids();
120+
}
121+
122+
if (!hasFluids) {
123+
// also empty
124+
continue;
125+
}
110126
final PalettedContainer<BlockState> blocks = section.states;
111127

112128
final int minXIterate = currChunkX == minChunkX ? (minBlockX & 15) : 0;

neoforge/src/main/java/ca/spottedleaf/moonrise/neoforge/mixin/collisions/EntityMixin.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ca.spottedleaf.moonrise.neoforge.mixin.collisions;
22

33
import ca.spottedleaf.moonrise.neoforge.patches.collisions.FluidPushCalculation;
4+
import ca.spottedleaf.moonrise.patches.block_counting.BlockCountingChunkSection;
45
import ca.spottedleaf.moonrise.patches.getblock.GetBlockLevel;
56
import it.unimi.dsi.fastutil.objects.Reference2ReferenceArrayMap;
67
import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap;
@@ -101,6 +102,11 @@ public void updateFluidHeightAndDoFluidPushing() {
101102
continue;
102103
}
103104

105+
if (!((BlockCountingChunkSection)section).moonrise$hasFluids()) {
106+
// also empty
107+
continue;
108+
}
109+
104110
final PalettedContainer<BlockState> blocks = section.states;
105111

106112
final int minXIterate = currChunkX == minChunkX ? (minBlockX & 15) : 0;

src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
1010
import it.unimi.dsi.fastutil.shorts.ShortArrayList;
1111
import net.minecraft.util.BitStorage;
12+
import net.minecraft.tags.FluidTags;
1213
import net.minecraft.world.level.block.state.BlockState;
1314
import net.minecraft.world.level.chunk.LevelChunkSection;
1415
import net.minecraft.world.level.chunk.Palette;
@@ -46,7 +47,6 @@ abstract class LevelChunkSectionMixin implements BlockCountingChunkSection {
4647

4748
@Shadow
4849
public abstract boolean maybeHas(Predicate<BlockState> predicate);
49-
5050
@Unique
5151
private static final ShortArrayList FULL_LIST = new ShortArrayList(16*16*16);
5252
static {
@@ -64,6 +64,15 @@ abstract class LevelChunkSectionMixin implements BlockCountingChunkSection {
6464
@Unique
6565
private short specialCollidingBlocks;
6666

67+
@Unique
68+
private short fluids;
69+
70+
@Unique
71+
private short lavaFluids;
72+
73+
@Unique
74+
private short waterFluids;
75+
6776
@Unique
6877
private final ShortList tickingBlocks = new ShortList();
6978

@@ -77,6 +86,21 @@ abstract class LevelChunkSectionMixin implements BlockCountingChunkSection {
7786
return this.tickingBlocks;
7887
}
7988

89+
@Override
90+
public final boolean moonrise$hasFluids() {
91+
return this.fluids != 0;
92+
}
93+
94+
@Override
95+
public final boolean moonrise$hasLavaFluids() {
96+
return this.lavaFluids != 0;
97+
}
98+
99+
@Override
100+
public final boolean moonrise$hasWaterFluids() {
101+
return this.waterFluids != 0;
102+
}
103+
80104
/**
81105
* @reason Callback used to update block counts on block change.
82106
* @author Spottedleaf
@@ -122,6 +146,45 @@ private void updateBlockCallback(final int x, final int y, final int z, final Bl
122146
tickingBlocks.add(position);
123147
}
124148
}
149+
150+
final FluidState oldFluid = oldState.getFluidState();
151+
final FluidState newFluid = newState.getFluidState();
152+
final boolean hasOldFluid = !oldFluid.isEmpty();
153+
final boolean hasNewFluid = !newFluid.isEmpty();
154+
if (hasOldFluid != hasNewFluid) {
155+
if (hasOldFluid) {
156+
--this.fluids;
157+
} else {
158+
++this.fluids;
159+
}
160+
}
161+
if (hasOldFluid || hasNewFluid) {
162+
boolean fluidChecked = false;
163+
final boolean isOldWater = oldFluid.is(FluidTags.WATER);
164+
final boolean isNewWater = newFluid.is(FluidTags.WATER);
165+
166+
if (isOldWater != isNewWater) {
167+
if (isOldWater) {
168+
--this.waterFluids;
169+
} else {
170+
++this.waterFluids;
171+
}
172+
fluidChecked = true;
173+
}
174+
175+
if (!fluidChecked) {
176+
final boolean isOldLava = oldFluid.is(FluidTags.LAVA);
177+
final boolean isNewLava = newFluid.is(FluidTags.LAVA);
178+
179+
if (isOldLava != isNewLava) {
180+
if (isOldLava) {
181+
--this.lavaFluids;
182+
} else {
183+
++this.lavaFluids;
184+
}
185+
}
186+
}
187+
}
125188
}
126189

127190
/**
@@ -150,6 +213,9 @@ public void recalcBlockCounts() {
150213
this.tickingBlockCount = (short)0;
151214
this.tickingFluidCount = (short)0;
152215
this.specialCollidingBlocks = (short)0;
216+
this.fluids = (short)0;
217+
this.lavaFluids = (short)0;
218+
this.waterFluids = (short)0;
153219
this.tickingBlocks.clear();
154220

155221
if (this.maybeHas((final BlockState state) -> !state.isAir())) {
@@ -204,6 +270,13 @@ public void recalcBlockCounts() {
204270
if (fluid.isRandomlyTicking()) {
205271
this.tickingFluidCount += (short)paletteCount;
206272
}
273+
this.fluids += (short)paletteCount;
274+
275+
if (fluid.is(FluidTags.WATER)) {
276+
this.waterFluids += (short)paletteCount;
277+
} else if (fluid.is(FluidTags.LAVA)) {
278+
this.lavaFluids += (short)paletteCount;
279+
}
207280
}
208281
}
209282
}

src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,10 @@ public interface BlockCountingChunkSection {
88

99
public ShortList moonrise$getTickingBlockList();
1010

11+
public boolean moonrise$hasFluids();
12+
13+
public boolean moonrise$hasLavaFluids();
14+
15+
public boolean moonrise$hasWaterFluids();
16+
1117
}

0 commit comments

Comments
 (0)