diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 9024c8ef..eb2a8a8e 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -16,10 +16,11 @@ import net.minecraft.util.math.Box; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.Locale; + import static carpet.settings.RuleCategory.BUGFIX; import static carpet.settings.RuleCategory.COMMAND; import static carpet.settings.RuleCategory.CREATIVE; @@ -35,13 +36,15 @@ import static carpet.settings.RuleCategory.CLIENT; @SuppressWarnings("CanBeFinal") public class CarpetSettings { - public static final String carpetVersion = "1.4.12+v201001"; + public static final String carpetVersion = "1.4.13+v201015"; public static final Logger LOG = LogManager.getLogger(); public static boolean skipGenerationChecks = false; public static boolean impendingFillSkipUpdates = false; public static Box currentTelepotingEntityBox = null; public static Vec3d fixedPosition = null; public static int runPermissionLevel = 2; + public static boolean doChainStone = false; + public static boolean chainStoneStickToAll = false; private static class LanguageValidator extends Validator { @Override public String validate(ServerCommandSource source, ParsedRule currentRule, String newValue, String string) { @@ -259,12 +262,23 @@ public class CarpetSettings @Rule( desc = "Pistons can push block entities, like hoppers, chests etc.", category = {EXPERIMENTAL, FEATURE} ) public static boolean movableBlockEntities = false; + + private static class ChainStoneSetting extends Validator { + @Override public String validate(ServerCommandSource source, ParsedRule currentRule, String newValue, String string) { + CarpetSettings.doChainStone = !newValue.toLowerCase(Locale.ROOT).equals("false"); + CarpetSettings.chainStoneStickToAll = newValue.toLowerCase(Locale.ROOT).equals("all"); + + return newValue; + } + } @Rule( desc = "Chains will stick to each other on the long end", extra = "and stick to other blocks that connect to them at the ends", - category = {EXPERIMENTAL, FEATURE} + category = {EXPERIMENTAL, FEATURE}, + options = {"true", "false", "all"}, + validate = ChainStoneSetting.class ) - public static boolean chainStone = false; + public static String chainStone = "false"; @Rule( desc = "Saplings turn into dead shrubs in hot climates and no water access", category = FEATURE ) public static boolean desertShrubs = false; diff --git a/src/main/java/carpet/mixins/PistonHandler_customStickyMixin.java b/src/main/java/carpet/mixins/PistonHandler_customStickyMixin.java index 48f7fae0..b262f9cc 100644 --- a/src/main/java/carpet/mixins/PistonHandler_customStickyMixin.java +++ b/src/main/java/carpet/mixins/PistonHandler_customStickyMixin.java @@ -90,7 +90,7 @@ public abstract class PistonHandler_customStickyMixin //if(block == Blocks.STICKY_PISTON) // return blockState.get(FacingBlock.FACING) == motionDirection; } - if (CarpetSettings.chainStone && blockState.getBlock() == Blocks.CHAIN) + if (CarpetSettings.doChainStone && blockState.getBlock() == Blocks.CHAIN) { return isChainOnAxis(currentState, motionDirection); } @@ -111,11 +111,12 @@ public abstract class PistonHandler_customStickyMixin ) private boolean isDraggingPreviousBlockBehind(Block previous, Block next) { - if (CarpetSettings.chainStone) + if (CarpetSettings.doChainStone) { if (previousState.getBlock() == Blocks.CHAIN && isChainOnAxis(previousState, motionDirection)) { if ( (currentState.getBlock() == Blocks.CHAIN && isChainOnAxis(currentState, motionDirection)) + || CarpetSettings.chainStoneStickToAll || isEndRodOnAxis(currentState, motionDirection.getAxis()) || Block.sideCoversSmallSquare(world, currentPos, motionDirection)) { @@ -164,7 +165,7 @@ public abstract class PistonHandler_customStickyMixin } } - if (CarpetSettings.chainStone) + if (CarpetSettings.doChainStone) { BlockPos pos = this.movedBlocks.get(int_1); BlockState chainState = world.getBlockState(pos); @@ -215,7 +216,7 @@ public abstract class PistonHandler_customStickyMixin private void redirectIsStickyBlock(BlockPos pos, Direction dir, CallbackInfoReturnable cir, BlockState blockState, Block block, int i, int j, int l, BlockPos blockPos2, int m, int n, BlockPos blockPos3) { - if (CarpetSettings.chainStone) + if (CarpetSettings.doChainStone) { BlockState chainState = world.getBlockState(blockPos3); if (chainState.getBlock() == Blocks.CHAIN && !isChainOnAxis(chainState, motionDirection) && !canMoveAdjacentBlock(blockPos3)) @@ -237,12 +238,13 @@ public abstract class PistonHandler_customStickyMixin private void otherSideStickyCases(BlockPos pos, CallbackInfoReturnable cir, BlockState blockState, Direction var3[], int var4, int var5, Direction direction, BlockPos blockPos, BlockState blockState2) { - if (CarpetSettings.chainStone) + if (CarpetSettings.doChainStone) { if (blockState.getBlock() == Blocks.CHAIN && isChainOnAxis(blockState, direction) && !blockState2.isAir()) { Block otherBlock = blockState2.getBlock(); if ((otherBlock == Blocks.CHAIN && (blockState.get(ChainBlock.AXIS) == blockState2.get(ChainBlock.AXIS))) + || CarpetSettings.chainStoneStickToAll || isEndRodOnAxis(blockState2, blockState.get(ChainBlock.AXIS)) || otherBlock == Blocks.HONEY_BLOCK || Block.sideCoversSmallSquare(world, blockPos, direction.getOpposite()))