11package dev .ryanhcode .sable .mixin .climbing_sub_levels ;
22
3+ import com .llamalad7 .mixinextras .injector .wrapoperation .Operation ;
4+ import com .llamalad7 .mixinextras .injector .wrapoperation .WrapOperation ;
5+ import com .llamalad7 .mixinextras .sugar .Share ;
6+ import com .llamalad7 .mixinextras .sugar .ref .LocalRef ;
37import dev .ryanhcode .sable .Sable ;
4- import dev .ryanhcode .sable .api .SubLevelHelper ;
58import dev .ryanhcode .sable .companion .math .BoundingBox3d ;
69import dev .ryanhcode .sable .companion .math .JOMLConversion ;
10+ import dev .ryanhcode .sable .mixinterface .entity .entity_sublevel_collision .EntityMovementExtension ;
711import dev .ryanhcode .sable .platform .SablePlatform ;
812import dev .ryanhcode .sable .sublevel .SubLevel ;
913import net .minecraft .core .BlockPos ;
@@ -30,12 +34,13 @@ public LivingEntityMixin(final EntityType<?> entityType, final Level level) {
3034 }
3135
3236 @ Redirect (method = "onClimbable" , at = @ At (value = "INVOKE" , target = "Lnet/minecraft/world/entity/LivingEntity;blockPosition()Lnet/minecraft/core/BlockPos;" ))
33- private BlockPos sable$redirectPos (final LivingEntity instance ) {
37+ private BlockPos sable$redirectPos (final LivingEntity instance , @ Share ( "subLevelBlockState" ) final LocalRef < BlockState > subLevelBlockState ) {
3438 final Level level = this .level ();
35- final BlockPos defaultPos = instance .blockPosition ();
36-
3739 final LivingEntity self = (LivingEntity ) (Object ) this ;
38- final BlockState defaultState = level .getBlockState (defaultPos );
40+
41+ final BlockPos defaultPos = ((EntityMovementExtension ) this ).sable$getInBlockStatePos ();
42+ final BlockState defaultState = this .getInBlockState ();
43+
3944 if (defaultState .is (BlockTags .CLIMBABLE ) && SablePlatform .INSTANCE .isBlockstateLadder (defaultState , level , defaultPos , self )) {
4045 return defaultPos ;
4146 }
@@ -48,10 +53,18 @@ public LivingEntityMixin(final EntityType<?> entityType, final Level level) {
4853 final BlockState state = level .getBlockState (pos );
4954
5055 if (state .is (BlockTags .CLIMBABLE ) && SablePlatform .INSTANCE .isBlockstateLadder (state , level , pos , self )) {
56+ subLevelBlockState .set (state );
5157 return pos .immutable ();
5258 }
5359 }
5460
5561 return defaultPos ;
5662 }
63+
64+
65+ @ WrapOperation (method = "onClimbable" , at = @ At (value = "INVOKE" , target = "Lnet/minecraft/world/entity/LivingEntity;getInBlockState()Lnet/minecraft/world/level/block/state/BlockState;" ))
66+ private BlockState getInBlockState (final LivingEntity instance , final Operation <BlockState > original , @ Share ("subLevelBlockState" ) final LocalRef <BlockState > subLevelBlockState ) {
67+ final BlockState state = subLevelBlockState .get ();
68+ return state != null ? state : original .call (instance );
69+ }
5770}
0 commit comments