From e7624537592b01854275c52c84b62ae42c83c96a Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Sun, 11 Jan 2026 11:36:21 +0800 Subject: [PATCH 1/2] fix: entity collision box --- .../mod/entity/boundingbox/BBVoxelShape.java | 91 +++++++++++++++++++ .../mixin/fix/collision/MixinVoxelShapes.java | 26 ++++++ .../resources/META-INF/accesstransformer.cfg | 5 +- .../mixins.fix.universalmodcore.json | 1 + 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cam72cam/mod/entity/boundingbox/BBVoxelShape.java create mode 100644 src/main/java/cam72cam/mod/mixin/fix/collision/MixinVoxelShapes.java diff --git a/src/main/java/cam72cam/mod/entity/boundingbox/BBVoxelShape.java b/src/main/java/cam72cam/mod/entity/boundingbox/BBVoxelShape.java new file mode 100644 index 00000000..f8a9045a --- /dev/null +++ b/src/main/java/cam72cam/mod/entity/boundingbox/BBVoxelShape.java @@ -0,0 +1,91 @@ +package cam72cam.mod.entity.boundingbox; + +import it.unimi.dsi.fastutil.doubles.DoubleArrayList; +import it.unimi.dsi.fastutil.doubles.DoubleList; +import net.minecraft.util.AxisRotation; +import net.minecraft.util.Direction; +import net.minecraft.util.Util; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.shapes.BitSetVoxelShapePart; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.VoxelShapeCube; +import net.minecraft.util.math.shapes.VoxelShapePart; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class BBVoxelShape extends VoxelShape { + private static final VoxelShape FULL_CUBE1 = Util.make(() -> { + VoxelShapePart lvt_0_1_ = new BitSetVoxelShapePart(200, 200, 200, -100, -100, -100, 99, 99, 99); + for (int i = -100; i <= 99; i++) { + for (int i1 = -100; i1 <= 99; i1++) { + for (int i2 = -100; i2 <= 99; i2++) { + lvt_0_1_.setFilled(1, i1, i2, false, true); + } + } + } + return new VoxelShapeCube(lvt_0_1_); + }); + + private BoundingBox bb; + + public BBVoxelShape(BoundingBox boundingBox) { + super(FULL_CUBE1.part); + this.bb = boundingBox; + } + + @Override + public AxisAlignedBB getBoundingBox() { + return this.bb; + } + + @Override + public List toBoundingBoxList() { + return Collections.singletonList(bb); + } + + @Override + protected boolean contains(double p_211542_1_, double p_211542_3_, double p_211542_5_) { + return bb.contains(p_211542_1_, p_211542_3_, p_211542_5_); + } + + @Override + protected double getAllowedOffset(AxisRotation movementAxis, AxisAlignedBB collisionBox, double desiredOffset) { + if (this.isEmpty()) { + return desiredOffset; + } else if (Math.abs(desiredOffset) < 1.0E-7D) { + return 0.0D; + } else { +// if (bb.intersects(collisionBox.minX, collisionBox.minY, collisionBox.minZ, collisionBox.maxX, collisionBox.maxY, collisionBox.maxZ)) { + switch (movementAxis) { + case FORWARD: +// return bb.internal.calculateZOffset(IBoundingBox.from(collisionBox), desiredOffset); + case NONE: +// return bb.internal.calculateXOffset(IBoundingBox.from(collisionBox), desiredOffset); + return desiredOffset; + case BACKWARD: + default: + double v = bb.internal.calculateYOffset(IBoundingBox.from(collisionBox), desiredOffset); + return v + 0.05; + } +// } else { +// return 0; +// } + } + } + + @Override + protected DoubleList getValues(Direction.Axis axis) { + switch(axis) { + case X: + return DoubleArrayList.wrap(Arrays.copyOf(new double[]{bb.minX, bb.maxX}, part.getXSize() + 1)); + case Y: + return DoubleArrayList.wrap(Arrays.copyOf(new double[]{bb.minY, bb.maxY}, part.getYSize() + 1)); + case Z: + return DoubleArrayList.wrap(Arrays.copyOf(new double[]{bb.minZ, bb.maxZ}, part.getZSize() + 1)); + default: + throw new IllegalArgumentException(); + } + } +} diff --git a/src/main/java/cam72cam/mod/mixin/fix/collision/MixinVoxelShapes.java b/src/main/java/cam72cam/mod/mixin/fix/collision/MixinVoxelShapes.java new file mode 100644 index 00000000..92c2561e --- /dev/null +++ b/src/main/java/cam72cam/mod/mixin/fix/collision/MixinVoxelShapes.java @@ -0,0 +1,26 @@ +package cam72cam.mod.mixin.fix.collision; + +import cam72cam.mod.entity.boundingbox.BBVoxelShape; +import cam72cam.mod.entity.boundingbox.BoundingBox; +import net.minecraft.util.Direction; +import net.minecraft.util.Util; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.shapes.*; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(VoxelShapes.class) +public class MixinVoxelShapes { + @Inject(method = "create(Lnet/minecraft/util/math/AxisAlignedBB;)Lnet/minecraft/util/math/shapes/VoxelShape;", + at = @At("HEAD"), cancellable = true) + private static void inj(AxisAlignedBB aabb, CallbackInfoReturnable cir) { + if (aabb instanceof BoundingBox) { + cir.setReturnValue(new BBVoxelShape((BoundingBox) aabb)); + cir.cancel(); + } + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index ad00aafd..421e5f77 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -15,4 +15,7 @@ public net.minecraft.resources.FolderPack func_195768_c(Ljava/lang/String;)Z # n public net.minecraft.resources.FolderPack func_195766_a(Ljava/lang/String;)Ljava/io/InputStream; # net/minecraft/resources/ResourcePack/getInputStream (Ljava/lang/String;)Ljava/io/InputStream; public net.minecraft.world.server.ChunkManager func_223491_f()Ljava/lang/Iterable; # net/minecraft/world/server/ChunkManager/getLoadedChunksIterable ()Ljava/lang/Iterable; public net.minecraft.client.world.ClientWorld field_73035_a #connection -public net.minecraft.client.gui.widget.button.CheckboxButton field_212943_a # checked \ No newline at end of file +public net.minecraft.client.gui.widget.button.CheckboxButton field_212943_a # checked +public net.minecraft.util.math.shapes.VoxelShape (Lnet/minecraft/util/math/shapes/VoxelShapePart;)V +public net.minecraft.util.math.shapes.VoxelShape field_197768_g # part +public net.minecraft.util.math.shapes.VoxelShapeCube (Lnet/minecraft/util/math/shapes/VoxelShapePart;)V \ No newline at end of file diff --git a/src/main/resources/mixins.fix.universalmodcore.json b/src/main/resources/mixins.fix.universalmodcore.json index 36a5e3a0..06515b88 100644 --- a/src/main/resources/mixins.fix.universalmodcore.json +++ b/src/main/resources/mixins.fix.universalmodcore.json @@ -7,6 +7,7 @@ "compatibilityLevel": "JAVA_8", "mixinPriority": 1301, "mixins": [ + "collision.MixinVoxelShapes" ], "client": [ ] From 873d7b4c605d188f8ef1e41e361dc79db0abc547 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Sun, 11 Jan 2026 14:24:18 +0800 Subject: [PATCH 2/2] fix movement --- .../mod/entity/boundingbox/BBVoxelShape.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/cam72cam/mod/entity/boundingbox/BBVoxelShape.java b/src/main/java/cam72cam/mod/entity/boundingbox/BBVoxelShape.java index f8a9045a..3b67cd15 100644 --- a/src/main/java/cam72cam/mod/entity/boundingbox/BBVoxelShape.java +++ b/src/main/java/cam72cam/mod/entity/boundingbox/BBVoxelShape.java @@ -16,6 +16,7 @@ import java.util.List; public class BBVoxelShape extends VoxelShape { + //Though I don't understand what doe this mean... private static final VoxelShape FULL_CUBE1 = Util.make(() -> { VoxelShapePart lvt_0_1_ = new BitSetVoxelShapePart(200, 200, 200, -100, -100, -100, 99, 99, 99); for (int i = -100; i <= 99; i++) { @@ -57,21 +58,24 @@ protected double getAllowedOffset(AxisRotation movementAxis, AxisAlignedBB colli } else if (Math.abs(desiredOffset) < 1.0E-7D) { return 0.0D; } else { -// if (bb.intersects(collisionBox.minX, collisionBox.minY, collisionBox.minZ, collisionBox.maxX, collisionBox.maxY, collisionBox.maxZ)) { - switch (movementAxis) { - case FORWARD: -// return bb.internal.calculateZOffset(IBoundingBox.from(collisionBox), desiredOffset); - case NONE: -// return bb.internal.calculateXOffset(IBoundingBox.from(collisionBox), desiredOffset); + boolean colliding = bb.intersects(collisionBox.minX, collisionBox.minY, collisionBox.minZ, collisionBox.maxX, collisionBox.maxY, collisionBox.maxZ); + boolean willZCollide = !colliding + && bb.intersects(collisionBox.minX, collisionBox.minY, collisionBox.minZ + desiredOffset, collisionBox.maxX, collisionBox.maxY, collisionBox.maxZ + desiredOffset); + boolean willXCollide = !colliding + && bb.intersects(collisionBox.minX + desiredOffset, collisionBox.minY, collisionBox.minZ, collisionBox.maxX + desiredOffset, collisionBox.maxY, collisionBox.maxZ); + switch (movementAxis) { + case FORWARD: //Z + case NONE: //X + if (willXCollide || willZCollide) { + return 0; + } else { return desiredOffset; - case BACKWARD: - default: - double v = bb.internal.calculateYOffset(IBoundingBox.from(collisionBox), desiredOffset); - return v + 0.05; - } -// } else { -// return 0; -// } + } + case BACKWARD: //Y + default: + //Add a small offset so jump won't get blocked + return bb.internal.calculateYOffset(IBoundingBox.from(collisionBox), desiredOffset) + 0.01; + } } }