From 165588cfa58841ea77585398abaf00c0c1ca519d Mon Sep 17 00:00:00 2001 From: haykam821 <24855774+haykam821@users.noreply.github.com> Date: Sat, 17 May 2025 18:09:38 -0400 Subject: [PATCH] Fix bridge eggs colliding with trail blocks Fixes #75 --- .../bedwars/custom/BridgeEggEntity.java | 13 +++++++--- .../bedwars/game/active/BwInteractions.java | 3 +-- .../bedwars/mixin/AbstractBlockMixin.java | 25 +++++++++++++++++++ src/main/resources/bw.mixins.json | 1 + 4 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 src/main/java/xyz/nucleoid/bedwars/mixin/AbstractBlockMixin.java diff --git a/src/main/java/xyz/nucleoid/bedwars/custom/BridgeEggEntity.java b/src/main/java/xyz/nucleoid/bedwars/custom/BridgeEggEntity.java index a9e7a45..f1e3002 100644 --- a/src/main/java/xyz/nucleoid/bedwars/custom/BridgeEggEntity.java +++ b/src/main/java/xyz/nucleoid/bedwars/custom/BridgeEggEntity.java @@ -17,8 +17,8 @@ public class BridgeEggEntity extends EggEntity { private final BlockState trailBlock; - public BridgeEggEntity(World world, LivingEntity thrower, BlockState trailBlock) { - super(world, thrower, new ItemStack(Items.EGG)); + public BridgeEggEntity(World world, LivingEntity thrower, ItemStack stack, BlockState trailBlock) { + super(world, thrower, stack); this.trailBlock = trailBlock; } @@ -56,11 +56,18 @@ private void tryPlaceAt(BlockPos pos) { protected void onCollision(HitResult hitResult) { // ignore self-collisions if (hitResult.getType() == HitResult.Type.BLOCK) { - if (this.getWorld().getBlockState(((BlockHitResult) hitResult).getBlockPos()) == this.trailBlock) { + var pos = ((BlockHitResult) hitResult).getBlockPos(); + var state = this.getWorld().getBlockState(pos); + + if (isTrailBlock(state, pos)) { return; } } super.onCollision(hitResult); } + + public boolean isTrailBlock(BlockState state, BlockPos pos) { + return state == this.trailBlock; + } } diff --git a/src/main/java/xyz/nucleoid/bedwars/game/active/BwInteractions.java b/src/main/java/xyz/nucleoid/bedwars/game/active/BwInteractions.java index 5153f56..002e8d9 100644 --- a/src/main/java/xyz/nucleoid/bedwars/game/active/BwInteractions.java +++ b/src/main/java/xyz/nucleoid/bedwars/game/active/BwInteractions.java @@ -172,8 +172,7 @@ private ActionResult onUseBridgeEgg(ServerPlayerEntity player, ItemStack stack) BlockState state = ColoredBlocks.wool(team.config().blockDyeColor()).getDefaultState(); // Spawn egg - BridgeEggEntity eggEntity = new BridgeEggEntity(this.world, player, state); - eggEntity.setItem(stack); + BridgeEggEntity eggEntity = new BridgeEggEntity(this.world, player, stack, state); eggEntity.setVelocity(player, player.getPitch(), player.getYaw(), 0.0F, 1.5F, 1.0F); this.world.spawnEntity(eggEntity); diff --git a/src/main/java/xyz/nucleoid/bedwars/mixin/AbstractBlockMixin.java b/src/main/java/xyz/nucleoid/bedwars/mixin/AbstractBlockMixin.java new file mode 100644 index 0000000..de4d2b0 --- /dev/null +++ b/src/main/java/xyz/nucleoid/bedwars/mixin/AbstractBlockMixin.java @@ -0,0 +1,25 @@ +package xyz.nucleoid.bedwars.mixin; + +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.EntityShapeContext; +import net.minecraft.block.ShapeContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import xyz.nucleoid.bedwars.custom.BridgeEggEntity; + +@Mixin(AbstractBlock.class) +public class AbstractBlockMixin { + @Inject(method = "getCollisionShape", at = @At("HEAD"), cancellable = true) + public void preventBridgeEggTrailBlockCollision(BlockState state, BlockView world, BlockPos pos, ShapeContext context, CallbackInfoReturnable ci) { + if (context instanceof EntityShapeContext entityContext && entityContext.getEntity() instanceof BridgeEggEntity egg && egg.isTrailBlock(state, pos)) { + ci.setReturnValue(VoxelShapes.empty()); + } + } +} diff --git a/src/main/resources/bw.mixins.json b/src/main/resources/bw.mixins.json index 5f3f29a..a787b76 100644 --- a/src/main/resources/bw.mixins.json +++ b/src/main/resources/bw.mixins.json @@ -4,6 +4,7 @@ "package": "xyz.nucleoid.bedwars.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ + "AbstractBlockMixin", "BedBlockMixin", "ExplosionBehaviorMixin", "LeavesBlockMixin",