@@ -52,6 +52,7 @@ import com.lambda.util.BlockUtils.calcItemBlockBreakingDelta
5252import com.lambda.util.BlockUtils.hasFluid
5353import com.lambda.util.BlockUtils.instantBreakable
5454import com.lambda.util.BlockUtils.isNotEmpty
55+ import com.lambda.util.Communication.info
5556import com.lambda.util.Communication.warn
5657import com.lambda.util.math.distSq
5758import com.lambda.util.math.vec3d
@@ -67,11 +68,13 @@ import kotlinx.coroutines.runBlocking
6768import net.minecraft.block.BlockState
6869import net.minecraft.block.FallingBlock
6970import net.minecraft.block.OperatorBlock
71+ import net.minecraft.block.ShapeContext
7072import net.minecraft.block.SlabBlock
7173import net.minecraft.block.Waterloggable
7274import net.minecraft.block.enums.SlabType
7375import net.minecraft.block.pattern.CachedBlockPosition
7476import net.minecraft.enchantment.Enchantments
77+ import net.minecraft.entity.Entity
7578import net.minecraft.fluid.FlowableFluid
7679import net.minecraft.fluid.LavaFluid
7780import net.minecraft.fluid.WaterFluid
@@ -80,6 +83,7 @@ import net.minecraft.item.Item
8083import net.minecraft.item.ItemPlacementContext
8184import net.minecraft.item.ItemStack
8285import net.minecraft.item.ItemUsageContext
86+ import net.minecraft.predicate.entity.EntityPredicates
8387import net.minecraft.registry.tag.ItemTags.DIAMOND_TOOL_MATERIALS
8488import net.minecraft.registry.tag.ItemTags.GOLD_TOOL_MATERIALS
8589import net.minecraft.registry.tag.ItemTags.IRON_TOOL_MATERIALS
@@ -90,6 +94,7 @@ import net.minecraft.state.property.Properties
9094import net.minecraft.util.Hand
9195import net.minecraft.util.hit.BlockHitResult
9296import net.minecraft.util.math.BlockPos
97+ import net.minecraft.util.math.Box
9398import net.minecraft.util.math.Direction
9499import net.minecraft.util.math.Vec3d
95100import net.minecraft.util.shape.VoxelShapes
@@ -510,7 +515,26 @@ object BuildSimulator {
510515
511516 val simulatePlaceState = placeState@{
512517 resultState = blockItem.getPlacementState(context)
513- ? : return @placeState PlaceResult .BlockedByEntity (pos)
518+ ? : run {
519+ val theoreticalState = blockItem.block.getPlacementState(context)
520+ ? : return @placeState PlaceResult .BlockedBySelf (pos)
521+ val shapeContext = ShapeContext .ofPlacement(player)
522+ val collisionShape = theoreticalState.getCollisionShape(world, context.blockPos, shapeContext)
523+ .offset(context.blockPos)
524+ val collidingEntities = collisionShape.boundingBoxes.flatMap { box ->
525+ world.entities.filter { it.boundingBox.intersects(box) }
526+ }
527+ if (collidingEntities.isNotEmpty()) {
528+ collidingEntities
529+ .mapNotNull { it.supportingBlockPos.orElse(null ) }
530+ .forEach { support ->
531+ acc.addAll(checkBreakResults(support, eye, preProcessing))
532+ }
533+ return @placeState PlaceResult .BlockedByEntity (pos, collidingEntities)
534+ } else {
535+ return @placeState PlaceResult .BlockedBySelf (pos)
536+ }
537+ }
514538
515539 return @placeState if (! nextTargetState.matches(resultState, pos, world, preProcessing.ignore))
516540 PlaceResult .NoIntegrity (
0 commit comments