Skip to content

Commit 16a5faa

Browse files
committed
Add sublevel ejector support
Depends on Creators-of-Create/Create#10395 upstream
1 parent 5bd656c commit 16a5faa

3 files changed

Lines changed: 41 additions & 2 deletions

File tree

neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/ejector/EjectorBlockEntityMixin.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package 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;
35
import com.simibubi.create.content.logistics.depot.EjectorBlockEntity;
46
import com.simibubi.create.content.logistics.depot.EntityLauncher;
57
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
68
import dev.ryanhcode.sable.ActiveSableCompanion;
79
import dev.ryanhcode.sable.Sable;
810
import dev.ryanhcode.sable.api.physics.handle.RigidBodyHandle;
911
import dev.ryanhcode.sable.api.sublevel.SubLevelContainer;
12+
import dev.ryanhcode.sable.companion.math.JOMLConversion;
1013
import dev.ryanhcode.sable.mixinterface.clip_overwrite.ClipContextExtension;
1114
import dev.ryanhcode.sable.neoforge.mixinhelper.compatibility.create.ejector.SubLevelScanResult;
1215
import dev.ryanhcode.sable.physics.config.dimension_physics.DimensionPhysicsData;
@@ -16,6 +19,7 @@
1619
import net.minecraft.core.BlockPos;
1720
import net.minecraft.core.Direction;
1821
import net.minecraft.server.level.ServerLevel;
22+
import net.minecraft.world.entity.Entity;
1923
import net.minecraft.world.level.ClipContext;
2024
import net.minecraft.world.level.block.entity.BlockEntityType;
2125
import net.minecraft.world.level.block.state.BlockState;
@@ -24,6 +28,7 @@
2428
import net.minecraft.world.phys.Vec3;
2529
import net.minecraft.world.phys.shapes.CollisionContext;
2630
import org.jetbrains.annotations.Nullable;
31+
import org.joml.Vector3d;
2732
import org.spongepowered.asm.mixin.Mixin;
2833
import org.spongepowered.asm.mixin.Shadow;
2934
import 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);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package dev.ryanhcode.sable.neoforge.mixin.compatibility.create.ejector;
2+
3+
import com.llamalad7.mixinextras.sugar.Local;
4+
import com.simibubi.create.content.logistics.depot.EjectorBlock;
5+
import dev.ryanhcode.sable.Sable;
6+
import dev.ryanhcode.sable.companion.math.JOMLConversion;
7+
import net.minecraft.core.BlockPos;
8+
import net.minecraft.world.entity.Entity;
9+
import net.minecraft.world.phys.Vec3;
10+
import org.joml.Vector3d;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.Redirect;
14+
15+
@Mixin(EjectorBlock.class)
16+
public class EjectorBlockMixin {
17+
18+
@Redirect(method = "updateEntityAfterFallOn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/Vec3;distanceTo(Lnet/minecraft/world/phys/Vec3;)D"))
19+
public double distanceTo(final Vec3 instance, final Vec3 vec, @Local(argsOnly = true) final Entity entity) {
20+
return Math.sqrt(Sable.HELPER.distanceSquaredWithSubLevels(entity.level(), instance, vec));
21+
}
22+
23+
@Redirect(method = "updateEntityAfterFallOn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/Vec3;add(Lnet/minecraft/world/phys/Vec3;)Lnet/minecraft/world/phys/Vec3;"))
24+
public Vec3 setPos(final Vec3 instance, final Vec3 vec, @Local(argsOnly = true) final Entity entity) {
25+
final Vector3d projected = Sable.HELPER.projectOutOfSubLevel(entity.level(), JOMLConversion.toJOML(instance)).add(vec.x, vec.y, vec.z);
26+
return JOMLConversion.toMojang(projected);
27+
}
28+
}

neoforge/src/main/resources/sable-neoforge.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
"compatibility.create.display_link.DisplayLinkBlockEntityMixin",
9898
"compatibility.create.display_link.DisplayLinkBlockMixin",
9999
"compatibility.create.ejector.EjectorBlockEntityMixin",
100+
"compatibility.create.ejector.EjectorBlockMixin",
100101
"compatibility.create.elevator_controls.ElevatorControlsHandlerMixin",
101102
"compatibility.create.entity_falls_on_block.BasinBlockMixin",
102103
"compatibility.create.entity_falls_on_block.BeltMillstoneBlocksMixin",

0 commit comments

Comments
 (0)