diff --git a/common/src/main/java/dev/ryanhcode/sable/api/physics/callback/BlockSubLevelCollisionCallback.java b/common/src/main/java/dev/ryanhcode/sable/api/physics/callback/BlockSubLevelCollisionCallback.java index cc2c88c4..4f1bfda6 100644 --- a/common/src/main/java/dev/ryanhcode/sable/api/physics/callback/BlockSubLevelCollisionCallback.java +++ b/common/src/main/java/dev/ryanhcode/sable/api/physics/callback/BlockSubLevelCollisionCallback.java @@ -18,18 +18,42 @@ public interface BlockSubLevelCollisionCallback { default double[] onCollision(final int x, final int y, final int z, - final double x1, - final double y1, - final double z1, + final double xWorld, + final double yWorld, + final double zWorld, + final int xOther, + final int yOther, + final int zOther, + final double xWorldOther, + final double yWorldOther, + final double zWorldOther, final double impactVelocity) { - final CollisionResult result = this.sable$onCollision(new BlockPos(x, y, z), new Vector3d(x1, y1, z1), impactVelocity); + final CollisionResult result = this.sable$onCollision(new BlockPos(x, y, z), new Vector3d(xWorld, yWorld, zWorld), new BlockPos(xOther, yOther, zOther), new Vector3d(xWorldOther, yWorldOther, zWorldOther), impactVelocity); final Vector3dc motion = result.tangentMotion; // TODO: this is stupid and moronic to pass through the removal as a double lmao, let's not do that in the future return new double[]{motion.x(), motion.y(), motion.z(), result.removeCollision ? 1.0 : 0.0}; } - CollisionResult sable$onCollision(BlockPos blockPos, Vector3d pos, double impactVelocity); + /** + * Called when a collision occurs between two blocks, from JNI / pipeline implementations. + *
+ * Legacy onCollision method for back-compatibility with older pipeline implementations. + * It is preferred you implement the fully qualified version {@link #sable$onCollision(BlockPos, Vector3d, BlockPos, Vector3d, double)} for new implementations. + *
+ * Ignored if the fully qualified version is implemented.
+ * */
+ @Deprecated
+ default CollisionResult sable$onCollision(final BlockPos blockPos, final Vector3d pos, final double impactVelocity) {
+ return CollisionResult.NONE;
+ }
+
+ /**
+ * Called when a collision occurs between two blocks, from JNI / pipeline implementations.
+ * */
+ default CollisionResult sable$onCollision(final BlockPos blockPos, final Vector3d pos, final BlockPos otherBlockPos, final Vector3d otherPos, final double impactVelocity) {
+ return this.sable$onCollision(blockPos, pos, impactVelocity);
+ }
record CollisionResult(Vector3dc tangentMotion, boolean removeCollision) {
public static final CollisionResult NONE = new CollisionResult(JOMLConversion.ZERO, false);
diff --git a/common/src/main/resources/natives/sable_rapier/sable_rapier_binaries.zip.l4z b/common/src/main/resources/natives/sable_rapier/sable_rapier_binaries.zip.l4z
index 022e3039..f75c094e 100644
Binary files a/common/src/main/resources/natives/sable_rapier/sable_rapier_binaries.zip.l4z and b/common/src/main/resources/natives/sable_rapier/sable_rapier_binaries.zip.l4z differ
diff --git a/common/src/main/resources/sable.mixins.json b/common/src/main/resources/sable.mixins.json
index ad2263af..03322c02 100644
--- a/common/src/main/resources/sable.mixins.json
+++ b/common/src/main/resources/sable.mixins.json
@@ -169,6 +169,7 @@
"game_test.TestCommandMixin",
"impact.BeehiveBlockMixin",
"impact.BellBlockMixin",
+ "impact.StainedGlassBlockMixin",
"impact.TntBlockMixin",
"interaction_distance.EntityMixin",
"interaction_distance.PlayerMixin",
diff --git a/common/src/main/rust/rapier/src/hooks.rs b/common/src/main/rust/rapier/src/hooks.rs
index 0ab3fbdb..1119ca35 100644
--- a/common/src/main/rust/rapier/src/hooks.rs
+++ b/common/src/main/rust/rapier/src/hooks.rs
@@ -73,6 +73,8 @@ impl PhysicsHooks for SablePhysicsHooks {
collider_a,
Some(level_collider_a),
&contact.point,
+ collider_b.position(),
+ level_collider_b,
velocity,
manifold_index,
true,
@@ -89,6 +91,8 @@ impl PhysicsHooks for SablePhysicsHooks {
collider_b,
Some(level_collider_b),
&contact.point,
+ collider_a.position(),
+ level_collider_a,
velocity,
manifold_index,
false,
@@ -144,6 +148,8 @@ fn handle_block_params(
_collider: &Collider,
level_collider: Option<&LevelCollider>,
global_point: &Vector,
+ other_isometry: &Pose,
+ other_level_collider: Option<&LevelCollider>,
velocity: Real,
manifold_index: usize,
body_a: bool,
@@ -152,6 +158,7 @@ fn handle_block_params(
let scene = get_scene_mut(level_collider.unwrap().scene_id);
let collider_info = level_collider.and_then(|lc| lc.id.map(|id| &scene.level_colliders[&(id)]));
+ let other_collider_info = other_level_collider.and_then(|lc| lc.id.map(|id| &scene.level_colliders[&(id)]));
let mut tangent_velo: Vector = Vector::ZERO;
@@ -175,6 +182,12 @@ fn handle_block_params(
manifold_info.pos_b
};
+ let other_block_coord = if body_a {
+ manifold_info.pos_b
+ } else {
+ manifold_info.pos_a
+ };
+
let block_id = if body_a {
manifold_info.col_a as u32
} else {
@@ -186,6 +199,11 @@ fn handle_block_params(
let block_coord_d: Vector3