Skip to content

Commit 636e70d

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 636e70d

File tree

4 files changed

+103
-0
lines changed

4 files changed

+103
-0
lines changed

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

Lines changed: 17 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,21 @@ 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+
}
126+
110127
final PalettedContainer<BlockState> blocks = section.states;
111128

112129
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 & 0 deletions
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;
@@ -64,6 +65,15 @@ abstract class LevelChunkSectionMixin implements BlockCountingChunkSection {
6465
@Unique
6566
private short specialCollidingBlocks;
6667

68+
@Unique
69+
private short fluids;
70+
71+
@Unique
72+
private short lavaFluids;
73+
74+
@Unique
75+
private short waterFluids;
76+
6777
@Unique
6878
private final ShortList tickingBlocks = new ShortList();
6979

@@ -77,6 +87,21 @@ abstract class LevelChunkSectionMixin implements BlockCountingChunkSection {
7787
return this.tickingBlocks;
7888
}
7989

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

127191
/**
@@ -150,6 +214,9 @@ public void recalcBlockCounts() {
150214
this.tickingBlockCount = (short)0;
151215
this.tickingFluidCount = (short)0;
152216
this.specialCollidingBlocks = (short)0;
217+
this.fluids = (short)0;
218+
this.lavaFluids = (short)0;
219+
this.waterFluids = (short)0;
153220
this.tickingBlocks.clear();
154221

155222
if (this.maybeHas((final BlockState state) -> !state.isAir())) {
@@ -204,6 +271,13 @@ public void recalcBlockCounts() {
204271
if (fluid.isRandomlyTicking()) {
205272
this.tickingFluidCount += (short)paletteCount;
206273
}
274+
this.fluids += (short)paletteCount;
275+
276+
if (fluid.is(FluidTags.WATER)) {
277+
this.waterFluids += (short)paletteCount;
278+
} else if (fluid.is(FluidTags.LAVA)) {
279+
this.lavaFluids += (short)paletteCount;
280+
}
207281
}
208282
}
209283
}

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)