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 ;
14+
15+ // Update the file when embeddedt patches this file for 26.2 in the neoforge version to keep it conisitent with the upstream changes.
1416
1517@ Mixin (targets = {"net/minecraft/world/level/levelgen/SurfaceRules$Context" }, priority = 100 )
1618public class SurfaceRulesContextMixin {
1719 @ Shadow private long lastUpdateY ;
1820
21+ @ Shadow private int blockX ;
22+
23+ @ Shadow private int blockZ ;
24+
1925 @ Shadow private int blockY ;
2026
2127 @ Shadow private int waterHeight ;
@@ -24,27 +30,53 @@ public class SurfaceRulesContextMixin {
2430
2531 @ Shadow private int stoneDepthAbove ;
2632
27- @ Shadow private Supplier < Holder <Biome > > biome ;
33+ @ Shadow private Holder <Biome > biome ;
2834
2935 @ Shadow @ Final private Function <BlockPos , Holder <Biome >> biomeGetter ;
3036
3137 @ Shadow @ Final private BlockPos .MutableBlockPos pos ;
3238
39+ @ Unique
40+ private PositionalBiomeGetter modernfix$biomeCache ;
41+
3342 /**
3443 * @author embeddedt
35- * @reason Reuse supplier object instead of creating new ones every time
44+ * @reason Keep a reusable biome cache helper instead of rebuilding intermediate state
3645 */
3746 @ Overwrite
38- public void updateY (int stoneDepthAbove , int stoneDepthBelow , int waterHeight , int blockX , int blockY , int blockZ ) {
47+ protected void updateY (int stoneDepthAbove , int stoneDepthBelow , int waterHeight , int blockY ) {
3948 ++this .lastUpdateY ;
40- var getter = this .biome ;
49+
50+ var getter = this .modernfix$biomeCache ;
4151 if (getter == null ) {
42- this .biome = getter = new PositionalBiomeGetter (this .biomeGetter , this .pos );
52+ this .modernfix$biomeCache = getter = new PositionalBiomeGetter (this .biomeGetter , this .pos );
4353 }
44- ((PositionalBiomeGetter )getter ).update (blockX , blockY , blockZ );
54+
55+ getter .update (this .blockX , blockY , this .blockZ );
56+ this .biome = null ;
4557 this .blockY = blockY ;
4658 this .waterHeight = waterHeight ;
4759 this .stoneDepthBelow = stoneDepthBelow ;
4860 this .stoneDepthAbove = stoneDepthAbove ;
4961 }
62+
63+ /**
64+ * @author coredex
65+ * @reason Reuse a single positional getter object for biome lookups
66+ */
67+ @ Overwrite
68+ protected Holder <Biome > getBiome () {
69+ var biome = this .biome ;
70+ if (biome == null ) {
71+ var getter = this .modernfix$biomeCache ;
72+ if (getter == null ) {
73+ this .modernfix$biomeCache = getter = new PositionalBiomeGetter (this .biomeGetter , this .pos );
74+ }
75+
76+ getter .update (this .blockX , this .blockY , this .blockZ );
77+ this .biome = biome = getter .get ();
78+ }
79+
80+ return biome ;
81+ }
5082}
0 commit comments