From ba95c9a3d7ccbb299cef3460a407a53fd145ff6e Mon Sep 17 00:00:00 2001 From: Flemmli97 Date: Tue, 25 Aug 2020 05:29:45 +0200 Subject: [PATCH] water protection and piston protection (that was hell) --- .../com/flemmli97/flan/event/WorldEvents.java | 42 +++++++++++++++++++ .../com/flemmli97/flan/mixin/FluidMixin.java | 27 ++++++++++++ .../com/flemmli97/flan/mixin/PistonMixin.java | 25 +++++++++++ src/main/resources/flan.mixins.json | 4 +- 4 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/flemmli97/flan/mixin/FluidMixin.java create mode 100644 src/main/java/com/flemmli97/flan/mixin/PistonMixin.java diff --git a/src/main/java/com/flemmli97/flan/event/WorldEvents.java b/src/main/java/com/flemmli97/flan/event/WorldEvents.java index 25b1ab5..3590eb1 100644 --- a/src/main/java/com/flemmli97/flan/event/WorldEvents.java +++ b/src/main/java/com/flemmli97/flan/event/WorldEvents.java @@ -3,8 +3,13 @@ package com.flemmli97.flan.event; import com.flemmli97.flan.claim.Claim; import com.flemmli97.flan.claim.ClaimStorage; import com.flemmli97.flan.claim.EnumPermission; +import net.minecraft.block.BlockState; +import net.minecraft.block.piston.PistonBehavior; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.BlockView; import net.minecraft.world.World; import java.util.List; @@ -22,4 +27,41 @@ public class WorldEvents { return false; }); } + + public static boolean pistonCanPush(BlockState state, World world, BlockPos blockPos, Direction direction, Direction pistonDir){ + if(world.isClient||direction == Direction.UP || direction == Direction.DOWN) + return true; + boolean empty = state.isAir() || state.getPistonBehavior() == PistonBehavior.DESTROY; + BlockPos dirPos = blockPos.offset(direction); + ClaimStorage storage = ClaimStorage.get((ServerWorld) world); + Claim from = storage.getClaimAt(blockPos); + Claim to = storage.getClaimAt(dirPos); + boolean flag = true; + if(!empty){ + if((from!=null && !from.equals(to)) || (from==null && to!=null)) + flag = false; + } + if(from!=null && from.equals(to)){ + Claim opp = storage.getClaimAt(blockPos.offset(direction.getOpposite())); + flag = from.equals(opp); + } + if(!flag) { + world.updateListeners(blockPos, state, state, 20); + BlockState toState = world.getBlockState(dirPos); + world.updateListeners(dirPos, toState, toState, 20); + } + return flag; + } + + public static boolean canFlow(BlockState fluidBlockState, BlockView world, BlockPos blockPos, Direction direction){ + if(!(world instanceof ServerWorld)||direction == Direction.UP || direction == Direction.DOWN) + return true; + ClaimStorage storage = ClaimStorage.get((ServerWorld) world); + Claim from = storage.getClaimAt(blockPos); + Claim to = storage.getClaimAt(blockPos.offset(direction)); + boolean fl = from == null && to == null; + if(from!=null) + fl = from.equals(to); + return fl; + } } diff --git a/src/main/java/com/flemmli97/flan/mixin/FluidMixin.java b/src/main/java/com/flemmli97/flan/mixin/FluidMixin.java new file mode 100644 index 0000000..91433db --- /dev/null +++ b/src/main/java/com/flemmli97/flan/mixin/FluidMixin.java @@ -0,0 +1,27 @@ +package com.flemmli97.flan.mixin; + +import com.flemmli97.flan.event.WorldEvents; +import net.minecraft.block.BlockState; +import net.minecraft.fluid.FlowableFluid; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.FluidState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +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; + +@Mixin(FlowableFluid.class) +public abstract class FluidMixin { + + @Inject(method = "canFlow", at = @At(value = "HEAD"), cancellable = true) + public void crossClaimFlow(BlockView world, BlockPos fluidPos, BlockState fluidBlockState, Direction flowDirection, BlockPos flowTo, + BlockState flowToBlockState, FluidState fluidState, Fluid fluid, CallbackInfoReturnable info){ + if(!WorldEvents.canFlow(fluidBlockState, world, fluidPos, flowDirection)){ + info.setReturnValue(false); + info.cancel(); + } + } +} diff --git a/src/main/java/com/flemmli97/flan/mixin/PistonMixin.java b/src/main/java/com/flemmli97/flan/mixin/PistonMixin.java new file mode 100644 index 0000000..38a629f --- /dev/null +++ b/src/main/java/com/flemmli97/flan/mixin/PistonMixin.java @@ -0,0 +1,25 @@ +package com.flemmli97.flan.mixin; + +import com.flemmli97.flan.event.WorldEvents; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.PistonBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; +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; + +@Mixin(PistonBlock.class) +public class PistonMixin { + + @Inject(method = "isMovable", at = @At(value = "HEAD"), cancellable = true) + private static void checkMovable(BlockState blockState, World world, BlockPos blockPos, Direction direction, boolean canBreak, Direction pistonDir, CallbackInfoReturnable info){ + if(!WorldEvents.pistonCanPush(blockState, world, blockPos, direction, pistonDir)) { + info.setReturnValue(false); + info.cancel(); + } + } +} diff --git a/src/main/resources/flan.mixins.json b/src/main/resources/flan.mixins.json index 82d6dcc..aecde33 100644 --- a/src/main/resources/flan.mixins.json +++ b/src/main/resources/flan.mixins.json @@ -18,7 +18,9 @@ "IPersistentProjectileVars", "LivingEntityMixin", "ItemStackMixin", - "ILecternBlockValues" + "ILecternBlockValues", + "FluidMixin", + "PistonMixin" ], "server": [ ],