From 08e2d6ae16f998239bc44aa5e94b7b0b8345c003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E9=9B=A8=E8=90=BD?= Date: Wed, 12 Feb 2025 19:16:35 +0800 Subject: [PATCH] Fix the mis-patching of HangingEntity. (Closes #1651) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 秋雨落 --- .../entity/decoration/ItemFrameMixin.java | 17 ++++++---- .../entity/decoration/PaintingMixin.java | 20 ++++++++++-- .../entity/item/BlockAttachedEntityMixin.java | 31 ------------------- 3 files changed, 28 insertions(+), 40 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/decoration/ItemFrameMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/decoration/ItemFrameMixin.java index 723f3a92f..75a32b8f8 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/decoration/ItemFrameMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/decoration/ItemFrameMixin.java @@ -52,14 +52,19 @@ public void setItem(ItemStack itemstack, final boolean flag, final boolean playS } } + @Inject(method = "calculateBoundingBox", at = @At("HEAD"), cancellable = true) + private void arclight$calculateBoundingBox(BlockPos blockPos, Direction direction, CallbackInfoReturnable cir) { + cir.setReturnValue(calculateBoundingBoxStatic(blockPos, direction)); + } + @TransformAccess(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC) - private static AABB calculateBoundingBox(Entity entity, BlockPos blockPosition, Direction direction, int width, int height) { + private static AABB calculateBoundingBoxStatic(BlockPos blockPos, Direction direction) { float f = 0.46875F; - Vec3 vec3d = Vec3.atCenterOf(blockPosition).relative(direction, -0.46875D); - Direction.Axis enumdirection_enumaxis = direction.getAxis(); - double d0 = enumdirection_enumaxis == Direction.Axis.X ? 0.0625D : 0.75D; - double d1 = enumdirection_enumaxis == Direction.Axis.Y ? 0.0625D : 0.75D; - double d2 = enumdirection_enumaxis == Direction.Axis.Z ? 0.0625D : 0.75D; + Vec3 vec3d = Vec3.atCenterOf(blockPos).relative(direction, -0.46875D); + Direction.Axis axis = direction.getAxis(); + double d0 = axis == Direction.Axis.X ? 0.0625D : 0.75D; + double d1 = axis == Direction.Axis.Y ? 0.0625D : 0.75D; + double d2 = axis == Direction.Axis.Z ? 0.0625D : 0.75D; return AABB.ofSize(vec3d, d0, d1, d2); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/decoration/PaintingMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/decoration/PaintingMixin.java index 083e5318f..dee9b996e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/decoration/PaintingMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/decoration/PaintingMixin.java @@ -4,20 +4,34 @@ import io.izzel.arclight.common.mod.mixins.annotation.TransformAccess; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.Holder; import net.minecraft.world.entity.decoration.Painting; +import net.minecraft.world.entity.decoration.PaintingVariant; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.objectweb.asm.Opcodes; 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(Painting.class) public abstract class PaintingMixin extends BlockAttachedEntityMixin { + @Shadow + public abstract Holder getVariant(); + + @Inject(method = "calculateBoundingBox", at = @At("HEAD"), cancellable = true) + private void arclight$calculateBoundingBox(BlockPos blockPos, Direction direction, CallbackInfoReturnable cir) { + var variant = getVariant().value(); + cir.setReturnValue(calculateBoundingBoxStatic(blockPos, direction, variant.width(), variant.height())); + } @TransformAccess(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC) - private static AABB calculateBoundingBoxStatic(BlockPos blockposition, Direction enumdirection, int width, int height) { + private static AABB calculateBoundingBoxStatic(BlockPos blockPos, Direction enumdirection, int width, int height) { // CraftBukkit end float f = 0.46875F; - Vec3 vec3d = Vec3.atCenterOf(blockposition).relative(enumdirection, -0.46875D); + Vec3 vec3d = Vec3.atCenterOf(blockPos).relative(enumdirection, -0.46875D); // CraftBukkit start double d0 = offsetForPaintingSize0(width); double d1 = offsetForPaintingSize0(height); @@ -27,7 +41,7 @@ private static AABB calculateBoundingBoxStatic(BlockPos blockposition, Direction Direction.Axis enumdirection_enumaxis = enumdirection.getAxis(); // CraftBukkit start double d2 = enumdirection_enumaxis == Direction.Axis.X ? 0.0625D : (double) width; - double d3 = (double) height; + double d3 = height; double d4 = enumdirection_enumaxis == Direction.Axis.Z ? 0.0625D : (double) width; // CraftBukkit end diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/item/BlockAttachedEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/item/BlockAttachedEntityMixin.java index 3dbf23c3b..4805919dc 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/item/BlockAttachedEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/item/BlockAttachedEntityMixin.java @@ -94,35 +94,4 @@ public abstract class BlockAttachedEntityMixin extends EntityMixin { private static double a(int i) { return i % 32 == 0 ? 0.5D : 0.0D; } - - @TransformAccess(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC) - private static AABB calculateBoundingBox(Entity entity, BlockPos blockPosition, Direction direction, int width, int height) { - double d0 = blockPosition.getX() + 0.5; - double d2 = blockPosition.getY() + 0.5; - double d3 = blockPosition.getZ() + 0.5; - double d4 = 0.46875; - double d5 = a(width); - double d6 = a(height); - d0 -= direction.getStepX() * 0.46875; - d3 -= direction.getStepZ() * 0.46875; - d2 += d6; - Direction enumdirection = direction.getCounterClockWise(); - d0 += d5 * enumdirection.getStepX(); - d3 += d5 * enumdirection.getStepZ(); - if (entity != null) { - entity.setPosRaw(d0, d2, d3); - } - double d7 = width; - double d8 = height; - double d9 = width; - if (direction.getAxis() == Direction.Axis.Z) { - d9 = 1.0; - } else { - d7 = 1.0; - } - d7 /= 32.0; - d8 /= 32.0; - d9 /= 32.0; - return new AABB(d0 - d7, d2 - d8, d3 - d9, d0 + d7, d2 + d8, d3 + d9); - } }