diff --git a/common/src/main/java/io/github/flemmli97/flan/event/WorldEvents.java b/common/src/main/java/io/github/flemmli97/flan/event/WorldEvents.java index 6473914..c009a6c 100644 --- a/common/src/main/java/io/github/flemmli97/flan/event/WorldEvents.java +++ b/common/src/main/java/io/github/flemmli97/flan/event/WorldEvents.java @@ -30,7 +30,7 @@ public class WorldEvents { } public static boolean pistonCanPush(BlockState state, Level world, BlockPos blockPos, Direction direction, Direction pistonDir) { - if (world.isClientSide || state.isAir()) + if (world.isClientSide) return true; BlockPos dirPos = blockPos.relative(direction); ClaimStorage storage = ClaimStorage.get((ServerLevel) world); @@ -42,7 +42,7 @@ public class WorldEvents { IPermissionContainer opp = storage.getForPermissionCheck(oppPoos); if (!from.equals(opp)) flag = from.canInteract(null, PermissionRegistry.PISTONBORDER, oppPoos); - } else + } else if (!state.isAir()) flag = from.canInteract(null, PermissionRegistry.PISTONBORDER, blockPos) && to.canInteract(null, PermissionRegistry.PISTONBORDER, dirPos); if (!flag) { //Idk enough about piston behaviour to update more blocks when slime is involved. diff --git a/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/PistonMixin.java b/common/src/main/java/io/github/flemmli97/flan/mixin/PistonMixin.java similarity index 78% rename from fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/PistonMixin.java rename to common/src/main/java/io/github/flemmli97/flan/mixin/PistonMixin.java index affcbe9..dfd3bc4 100644 --- a/fabric/src/main/java/io/github/flemmli97/flan/fabric/mixin/PistonMixin.java +++ b/common/src/main/java/io/github/flemmli97/flan/mixin/PistonMixin.java @@ -1,4 +1,4 @@ -package io.github.flemmli97.flan.fabric.mixin; +package io.github.flemmli97.flan.mixin; import io.github.flemmli97.flan.event.WorldEvents; import net.minecraft.core.BlockPos; @@ -14,6 +14,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(PistonBaseBlock.class) public abstract class PistonMixin { + /** + * Forge does have an event for piston interaction but the location of the event makes it not really applicable + * for this usecase. Would need to calculate all the affected blocks (specially in case of slime contraptions) + */ @Inject(method = "isPushable", at = @At(value = "HEAD"), cancellable = true) private static void checkMovable(BlockState blockState, Level world, BlockPos blockPos, Direction direction, boolean canBreak, Direction pistonDir, CallbackInfoReturnable info) { if (!WorldEvents.pistonCanPush(blockState, world, blockPos, direction, pistonDir)) { diff --git a/common/src/main/resources/flan.mixins.json b/common/src/main/resources/flan.mixins.json index 679d777..dcd7634 100644 --- a/common/src/main/resources/flan.mixins.json +++ b/common/src/main/resources/flan.mixins.json @@ -24,7 +24,8 @@ "LightningFireEntityMixin", "BannedEntryAccessor", "MinecraftServerMixin", - "AbstractContainerAccessor" + "AbstractContainerAccessor", + "PistonMixin" ], "server": [ ], diff --git a/fabric/src/main/resources/flan.fabric.mixins.json b/fabric/src/main/resources/flan.fabric.mixins.json index 3c72e6f..d538ba2 100644 --- a/fabric/src/main/resources/flan.fabric.mixins.json +++ b/fabric/src/main/resources/flan.fabric.mixins.json @@ -5,7 +5,6 @@ "compatibilityLevel": "JAVA_16", "mixins": [ "ServerWorldMixin", - "PistonMixin", "SpawnHelperMixin", "PlayerInteractEntityMixin", "ProjectileMixin", diff --git a/forge/src/main/java/io/github/flemmli97/flan/forge/FlanForge.java b/forge/src/main/java/io/github/flemmli97/flan/forge/FlanForge.java index 7623d52..9143bfc 100644 --- a/forge/src/main/java/io/github/flemmli97/flan/forge/FlanForge.java +++ b/forge/src/main/java/io/github/flemmli97/flan/forge/FlanForge.java @@ -25,7 +25,6 @@ public class FlanForge { IEventBus forge = MinecraftForge.EVENT_BUS; forge.addListener(WorldEventsForge::modifyExplosion); - forge.addListener(WorldEventsForge::pistonCanPush); forge.addListener(WorldEventsForge::preventMobSpawn); forge.addListener(ItemInteractEventsForge::useItem); forge.addListener(BlockInteractEventsForge::startBreakBlocks); diff --git a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/WorldEventsForge.java b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/WorldEventsForge.java index 42917c7..ab99471 100644 --- a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/WorldEventsForge.java +++ b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/WorldEventsForge.java @@ -3,10 +3,8 @@ package io.github.flemmli97.flan.forgeevent; import io.github.flemmli97.flan.event.WorldEvents; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Mob; -import net.minecraft.world.level.Level; import net.minecraftforge.event.entity.living.LivingSpawnEvent; import net.minecraftforge.event.world.ExplosionEvent; -import net.minecraftforge.event.world.PistonEvent; import net.minecraftforge.eventbus.api.Event; public class WorldEventsForge { @@ -16,13 +14,6 @@ public class WorldEventsForge { WorldEvents.modifyExplosion(event.getExplosion(), (ServerLevel) event.getWorld()); } - public static void pistonCanPush(PistonEvent.Pre event) { - if (!(event.getWorld() instanceof Level)) - return; - if (!WorldEvents.pistonCanPush(event.getState(), (Level) event.getWorld(), event.getPos(), event.getDirection(), event.getDirection())) - event.setCanceled(true); - } - public static void preventMobSpawn(LivingSpawnEvent.CheckSpawn event) { if (!(event.getWorld() instanceof ServerLevel) || !(event.getEntityLiving() instanceof Mob)) return;