11package dev .ryanhcode .sable .neoforge .mixin .compatibility .create .ejector ;
22
3+ import com .llamalad7 .mixinextras .injector .wrapoperation .Operation ;
4+ import com .llamalad7 .mixinextras .injector .wrapoperation .WrapOperation ;
35import com .simibubi .create .content .logistics .depot .EjectorBlockEntity ;
46import com .simibubi .create .content .logistics .depot .EntityLauncher ;
57import com .simibubi .create .foundation .blockEntity .SmartBlockEntity ;
68import dev .ryanhcode .sable .ActiveSableCompanion ;
79import dev .ryanhcode .sable .Sable ;
810import dev .ryanhcode .sable .api .physics .handle .RigidBodyHandle ;
911import dev .ryanhcode .sable .api .sublevel .SubLevelContainer ;
12+ import dev .ryanhcode .sable .companion .math .JOMLConversion ;
1013import dev .ryanhcode .sable .mixinterface .clip_overwrite .ClipContextExtension ;
1114import dev .ryanhcode .sable .neoforge .mixinhelper .compatibility .create .ejector .SubLevelScanResult ;
1215import dev .ryanhcode .sable .physics .config .dimension_physics .DimensionPhysicsData ;
1619import net .minecraft .core .BlockPos ;
1720import net .minecraft .core .Direction ;
1821import net .minecraft .server .level .ServerLevel ;
22+ import net .minecraft .world .entity .Entity ;
1923import net .minecraft .world .level .ClipContext ;
2024import net .minecraft .world .level .block .entity .BlockEntityType ;
2125import net .minecraft .world .level .block .state .BlockState ;
2428import net .minecraft .world .phys .Vec3 ;
2529import net .minecraft .world .phys .shapes .CollisionContext ;
2630import org .jetbrains .annotations .Nullable ;
31+ import org .joml .Vector3d ;
2732import org .spongepowered .asm .mixin .Mixin ;
2833import org .spongepowered .asm .mixin .Shadow ;
2934import org .spongepowered .asm .mixin .Unique ;
@@ -79,8 +84,7 @@ public EjectorBlockEntityMixin(final BlockEntityType<?> type, final BlockPos pos
7984 final double px = this .launcher .getHorizontalDistance ();
8085 final double py = this .launcher .getVerticalDistance ();
8186
82- // TODO: Make this use gravity at the ejector position
83- final double g = -DimensionPhysicsData .getGravity (this .level ).y ;
87+ final double g = -DimensionPhysicsData .getGravity (this .level , JOMLConversion .atCenterOf (blockPos )).y ;
8488
8589 double vx = c ;
8690 if (py > 0 ) {
@@ -107,6 +111,12 @@ public EjectorBlockEntityMixin(final BlockEntityType<?> type, final BlockPos pos
107111 }
108112 }
109113
114+ @ WrapOperation (method = "activateDeferred" , at = @ At (value = "INVOKE" , target = "Lnet/minecraft/world/entity/Entity;setPos(DDD)V" ))
115+ public void setPos (final Entity instance , final double x , final double y , final double z , final Operation <Void > original ) {
116+ final Vector3d projected = Sable .HELPER .projectOutOfSubLevel (instance .level (), new Vector3d (x , y , z ));
117+ original .call (instance , projected .x , projected .y , projected .z );
118+ }
119+
110120 private @ Nullable SubLevelScanResult sable$lookForLaunchableSubLevels () {
111121 final ActiveSableCompanion helper = Sable .HELPER ;
112122 final SubLevel containingSubLevel = helper .getContaining (this );
0 commit comments