diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java index e7fe83ce7..c8030e0d8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java @@ -9,11 +9,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntityType import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.core.entity.furniture.*; import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxConfig; -import net.momirealms.craftengine.core.entity.player.InteractionResult; -import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.QuaternionUtils; -import net.momirealms.craftengine.core.util.VersionHelper; -import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.WorldPosition; import net.momirealms.craftengine.core.world.collision.AABB; import org.bukkit.Location; @@ -75,7 +71,7 @@ public class BukkitFurniture extends Furniture { // 检查新位置是否可用 List aabbs = new ArrayList<>(); for (FurnitureHitBoxConfig hitBoxConfig : getCurrentVariant().hitBoxConfigs()) { - hitBoxConfig.prepareForPlacement(position, aabbs::add); + hitBoxConfig.prepareBoundingBox(position, aabbs::add, false); } if (!aabbs.isEmpty()) { if (!FastNMS.INSTANCE.checkEntityCollision(position.world.serverWorld(), aabbs.stream().map(it -> FastNMS.INSTANCE.constructor$AABB(it.minX, it.minY, it.minZ, it.maxX, it.maxY, it.maxZ)).toList())) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/CustomFurnitureHitboxConfig.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/CustomFurnitureHitboxConfig.java index d7147708c..bd53f0015 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/CustomFurnitureHitboxConfig.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/CustomFurnitureHitboxConfig.java @@ -71,8 +71,8 @@ public class CustomFurnitureHitboxConfig extends AbstractFurnitureHitBoxConfig aabbConsumer) { - if (this.blocksBuilding) { + public void prepareBoundingBox(WorldPosition targetPos, Consumer aabbConsumer, boolean ignoreBlocksBuilding) { + if (this.blocksBuilding || ignoreBlocksBuilding) { Vec3d relativePosition = Furniture.getRelativePosition(targetPos, this.position); aabbConsumer.accept(AABB.makeBoundingBox(relativePosition, this.width, this.height)); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/HappyGhastFurnitureHitboxConfig.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/HappyGhastFurnitureHitboxConfig.java index 6264b3a5f..3ee687d59 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/HappyGhastFurnitureHitboxConfig.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/HappyGhastFurnitureHitboxConfig.java @@ -56,8 +56,8 @@ public class HappyGhastFurnitureHitboxConfig extends AbstractFurnitureHitBoxConf } @Override - public void prepareForPlacement(WorldPosition targetPos, Consumer aabbConsumer) { - if (this.blocksBuilding) { + public void prepareBoundingBox(WorldPosition targetPos, Consumer aabbConsumer, boolean ignoreBlocksBuilding) { + if (this.blocksBuilding || ignoreBlocksBuilding) { Vec3d relativePosition = Furniture.getRelativePosition(targetPos, this.position); aabbConsumer.accept(AABB.makeBoundingBox(relativePosition, 4 * this.scale, 4 * this.scale)); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/InteractionFurnitureHitboxConfig.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/InteractionFurnitureHitboxConfig.java index 909335b0a..40caaf1ee 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/InteractionFurnitureHitboxConfig.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/InteractionFurnitureHitboxConfig.java @@ -70,8 +70,8 @@ public class InteractionFurnitureHitboxConfig extends AbstractFurnitureHitBoxCon } @Override - public void prepareForPlacement(WorldPosition targetPos, Consumer aabbConsumer) { - if (this.blocksBuilding) { + public void prepareBoundingBox(WorldPosition targetPos, Consumer aabbConsumer, boolean ignoreBlocksBuilding) { + if (this.blocksBuilding || ignoreBlocksBuilding) { Vec3d relativePosition = Furniture.getRelativePosition(targetPos, this.position); aabbConsumer.accept(AABB.makeBoundingBox(relativePosition, size.x, size.y)); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerFurnitureHitboxConfig.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerFurnitureHitboxConfig.java index 2b309b806..6756948bb 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerFurnitureHitboxConfig.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerFurnitureHitboxConfig.java @@ -145,8 +145,8 @@ public class ShulkerFurnitureHitboxConfig extends AbstractFurnitureHitBoxConfig< } @Override - public void prepareForPlacement(WorldPosition targetPos, Consumer aabbConsumer) { - if (this.blocksBuilding) { + public void prepareBoundingBox(WorldPosition targetPos, Consumer aabbConsumer, boolean ignoreBlocksBuilding) { + if (this.blocksBuilding || ignoreBlocksBuilding) { Quaternionf conjugated = QuaternionUtils.toQuaternionf(0f, (float) Math.toRadians(180 - targetPos.yRot()), 0f).conjugate(); Vector3f offset = conjugated.transform(new Vector3f(position())); aabbConsumer.accept(this.aabbCreator.create(targetPos.x, targetPos.y, targetPos.z, targetPos.yRot, offset)); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java index 3c3d34027..28493cd5f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java @@ -114,7 +114,7 @@ public class FurnitureItemBehavior extends ItemBehavior { List aabbs = new ArrayList<>(); // 收集阻挡的碰撞箱 for (FurnitureHitBoxConfig hitBoxConfig : variant.hitBoxConfigs()) { - hitBoxConfig.prepareForPlacement(furniturePos, aabbs::add); + hitBoxConfig.prepareBoundingBox(furniturePos, aabbs::add, false); } // 检查方块、实体阻挡 if (!aabbs.isEmpty()) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 2bc3a8635..06653a9f4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -566,7 +566,7 @@ public class BukkitServerPlayer extends Player { FurnitureVariant currentVariant = furniture.getCurrentVariant(); List aabbs = new ArrayList<>(); for (FurnitureHitBoxConfig config : currentVariant.hitBoxConfigs()) { - config.prepareForPlacement(furniture.position(), aabbs::add); + config.prepareBoundingBox(furniture.position(), aabbs::add, true); } Key endRod = Key.of("soul_fire_flame"); for (AABB aabb : aabbs) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java index d5d51596e..ec865cdff 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java @@ -130,7 +130,7 @@ public abstract class Furniture implements Cullable { if (aabb == null) { List aabbs = new ArrayList<>(); for (FurnitureHitBoxConfig hitBoxConfig : this.currentVariant.hitBoxConfigs()) { - hitBoxConfig.prepareForPlacement(position, aabbs::add); + hitBoxConfig.prepareBoundingBox(position, aabbs::add, true); } return new CullingData(getMaxAABB(aabbs), parent.maxDistance, parent.aabbExpansion, parent.rayTracing); } else { diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/hitbox/FurnitureHitBoxConfig.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/hitbox/FurnitureHitBoxConfig.java index 7c8325e00..319a0f6a1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/hitbox/FurnitureHitBoxConfig.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/hitbox/FurnitureHitBoxConfig.java @@ -22,6 +22,6 @@ public interface FurnitureHitBoxConfig { boolean canUseItemOn(); - void prepareForPlacement(WorldPosition targetPos, Consumer aabbConsumer); + void prepareBoundingBox(WorldPosition targetPos, Consumer aabbConsumer, boolean ignoreBlocksBuilding); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/entityculling/EntityCulling.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/entityculling/EntityCulling.java index 79dac8655..183558688 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/entityculling/EntityCulling.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/entityculling/EntityCulling.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.plugin.entityculling; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.world.ChunkPos; import net.momirealms.craftengine.core.world.MutableVec3d;