88import org .spongepowered .asm .mixin .Mixin ;
99import org .spongepowered .asm .mixin .Overwrite ;
1010import org .spongepowered .asm .mixin .Shadow ;
11+ import org .spongepowered .asm .mixin .Unique ;
1112
1213import java .util .function .Function ;
13- import java .util .function .Supplier ;
1414
1515@ Mixin (targets = {"net/minecraft/world/level/levelgen/SurfaceRules$Context" }, priority = 100 )
1616public class SurfaceRulesContextMixin {
1717 @ Shadow private long lastUpdateY ;
1818
19+ @ Shadow private int blockX ;
20+
21+ @ Shadow private int blockZ ;
22+
1923 @ Shadow private int blockY ;
2024
2125 @ Shadow private int waterHeight ;
@@ -24,27 +28,53 @@ public class SurfaceRulesContextMixin {
2428
2529 @ Shadow private int stoneDepthAbove ;
2630
27- @ Shadow private Supplier < Holder <Biome > > biome ;
31+ @ Shadow private Holder <Biome > biome ;
2832
2933 @ Shadow @ Final private Function <BlockPos , Holder <Biome >> biomeGetter ;
3034
3135 @ Shadow @ Final private BlockPos .MutableBlockPos pos ;
3236
37+ @ Unique
38+ private PositionalBiomeGetter modernfix$biomeCache ;
39+
3340 /**
3441 * @author embeddedt
3542 * @reason Reuse supplier object instead of creating new ones every time
3643 */
3744 @ Overwrite
38- public void updateY (int stoneDepthAbove , int stoneDepthBelow , int waterHeight , int blockX , int blockY , int blockZ ) {
45+ protected void updateY (int stoneDepthAbove , int stoneDepthBelow , int waterHeight , int blockY ) {
3946 ++this .lastUpdateY ;
40- var getter = this .biome ;
47+
48+ var getter = this .modernfix$biomeCache ;
4149 if (getter == null ) {
42- this .biome = getter = new PositionalBiomeGetter (this .biomeGetter , this .pos );
50+ this .modernfix$biomeCache = getter = new PositionalBiomeGetter (this .biomeGetter , this .pos );
4351 }
44- ((PositionalBiomeGetter )getter ).update (blockX , blockY , blockZ );
52+
53+ getter .update (this .blockX , blockY , this .blockZ );
54+ this .biome = null ;
4555 this .blockY = blockY ;
4656 this .waterHeight = waterHeight ;
4757 this .stoneDepthBelow = stoneDepthBelow ;
4858 this .stoneDepthAbove = stoneDepthAbove ;
4959 }
50- }
60+
61+ /**
62+ * @author coredex-source
63+ * @reason Reuse a single positional getter object for biome lookups
64+ */
65+ @ Overwrite
66+ protected Holder <Biome > getBiome () {
67+ var biome = this .biome ;
68+ if (biome == null ) {
69+ var getter = this .modernfix$biomeCache ;
70+ if (getter == null ) {
71+ this .modernfix$biomeCache = getter = new PositionalBiomeGetter (this .biomeGetter , this .pos );
72+ }
73+
74+ getter .update (this .blockX , this .blockY , this .blockZ );
75+ this .biome = biome = getter .get ();
76+ }
77+
78+ return biome ;
79+ }
80+ }
0 commit comments