diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 4956cb2c..372b0986 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -205,13 +205,46 @@ public class CarpetSettings @Rule( desc = "Players absorb XP instantly, without delay", category = CREATIVE ) public static boolean xpNoCooldown = false; + public static class StackableShulkerBoxValidator extends Validator + { + @Override + public String validate(ServerCommandSource source, ParsedRule currentRule, String newValue, String string) + { + if (newValue.matches("^[0-9]+$")) { + int value = Integer.parseInt(newValue); + if (value <= 64 && value >= 2) { + shulkerBoxStackSize = value; + return newValue; + } + } + if (newValue.equalsIgnoreCase("false")) { + shulkerBoxStackSize = 1; + return newValue; + } + if (newValue.equalsIgnoreCase("true")) { + shulkerBoxStackSize = 64; + return newValue; + } + return null; + } + + @Override + public String description() + { + return "Value must either be true, false, or a number between 2-64"; + } + } + @Rule( - desc = "Empty shulker boxes can stack to 64 when dropped on the ground", + desc = "Empty shulker boxes can stack when thrown on the ground.", extra = ".. or when manipulated inside the inventories", + validate = StackableShulkerBoxValidator.class, + options = {"false", "true", "16"}, + strict = false, category = {SURVIVAL, FEATURE} ) - public static boolean stackableShulkerBoxes = false; - public static final int SHULKER_STACK_SIZE = 64; + public static String stackableShulkerBoxes = "false"; + public static int shulkerBoxStackSize = 1; @Rule( desc = "Explosions won't destroy blocks", category = {CREATIVE, TNT} ) public static boolean explosionNoBlockDamage = false; diff --git a/src/main/java/carpet/mixins/AbstractCauldronBlock_stackableSBoxesMixin.java b/src/main/java/carpet/mixins/AbstractCauldronBlock_stackableSBoxesMixin.java index 003d8773..66c1e68d 100644 --- a/src/main/java/carpet/mixins/AbstractCauldronBlock_stackableSBoxesMixin.java +++ b/src/main/java/carpet/mixins/AbstractCauldronBlock_stackableSBoxesMixin.java @@ -23,7 +23,7 @@ public class AbstractCauldronBlock_stackableSBoxesMixin private ActionResult wrapInteractor(CauldronBehavior cauldronBehavior, BlockState blockState, World world, BlockPos blockPos, PlayerEntity playerEntity, Hand hand, ItemStack itemStack) { int count = -1; - if (CarpetSettings.stackableShulkerBoxes && itemStack.getItem() instanceof BlockItem && ((BlockItem)itemStack.getItem()).getBlock() instanceof ShulkerBoxBlock) + if (CarpetSettings.shulkerBoxStackSize > 1 && itemStack.getItem() instanceof BlockItem && ((BlockItem)itemStack.getItem()).getBlock() instanceof ShulkerBoxBlock) count = itemStack.getCount(); ActionResult result = cauldronBehavior.interact(blockState, world, blockPos, playerEntity, hand, itemStack); if (count > 0 && result.isAccepted()) diff --git a/src/main/java/carpet/mixins/ItemEntityMixin.java b/src/main/java/carpet/mixins/ItemEntityMixin.java index 56204178..ad4cd807 100644 --- a/src/main/java/carpet/mixins/ItemEntityMixin.java +++ b/src/main/java/carpet/mixins/ItemEntityMixin.java @@ -50,7 +50,7 @@ public abstract class ItemEntityMixin extends Entity implements ItemEntityInterf @Inject(method="(Lnet/minecraft/world/World;DDDLnet/minecraft/item/ItemStack;)V", at = @At("RETURN")) private void removeEmptyShulkerBoxTags(World worldIn, double x, double y, double z, ItemStack stack, CallbackInfo ci) { - if (CarpetSettings.stackableShulkerBoxes + if (CarpetSettings.shulkerBoxStackSize > 1 && stack.getItem() instanceof BlockItem && ((BlockItem)stack.getItem()).getBlock() instanceof ShulkerBoxBlock) { @@ -68,8 +68,8 @@ public abstract class ItemEntityMixin extends Entity implements ItemEntityInterf ) ) private int getItemStackMaxAmount(ItemStack stack) { - if (CarpetSettings.stackableShulkerBoxes && stack.getItem() instanceof BlockItem && ((BlockItem)stack.getItem()).getBlock() instanceof ShulkerBoxBlock) - return SHULKERBOX_MAX_STACK_AMOUNT; + if (CarpetSettings.shulkerBoxStackSize > 1 && stack.getItem() instanceof BlockItem && ((BlockItem)stack.getItem()).getBlock() instanceof ShulkerBoxBlock) + return CarpetSettings.shulkerBoxStackSize; return stack.getMaxCount(); } @@ -83,7 +83,7 @@ public abstract class ItemEntityMixin extends Entity implements ItemEntityInterf { ItemEntity self = (ItemEntity)(Object)this; ItemStack selfStack = self.getStack(); - if (!CarpetSettings.stackableShulkerBoxes || !(selfStack.getItem() instanceof BlockItem) || !(((BlockItem)selfStack.getItem()).getBlock() instanceof ShulkerBoxBlock)) { + if (CarpetSettings.shulkerBoxStackSize == 1 || !(selfStack.getItem() instanceof BlockItem) || !(((BlockItem)selfStack.getItem()).getBlock() instanceof ShulkerBoxBlock)) { return; } @@ -92,9 +92,9 @@ public abstract class ItemEntityMixin extends Entity implements ItemEntityInterf && !InventoryHelper.shulkerBoxHasItems(selfStack) && !InventoryHelper.shulkerBoxHasItems(otherStack) && selfStack.hasNbt() == otherStack.hasNbt() - && selfStack.getCount() + otherStack.getCount() <= SHULKERBOX_MAX_STACK_AMOUNT) + && selfStack.getCount() + otherStack.getCount() <= CarpetSettings.shulkerBoxStackSize) { - int amount = Math.min(otherStack.getCount(), SHULKERBOX_MAX_STACK_AMOUNT - selfStack.getCount()); + int amount = Math.min(otherStack.getCount(), CarpetSettings.shulkerBoxStackSize - selfStack.getCount()); selfStack.increment(amount); self.setStack(selfStack); diff --git a/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java b/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java index ad3035c6..9f6136dc 100644 --- a/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java +++ b/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java @@ -62,7 +62,7 @@ public abstract class PlayerManager_fakePlayersMixin @Inject(method = "createPlayer", at = @At(value = "INVOKE", shift = At.Shift.BEFORE, target = "Ljava/util/Iterator;hasNext()Z"), locals = LocalCapture.CAPTURE_FAILHARD) private void newWhileLoop(GameProfile gameProfile_1, CallbackInfoReturnable cir, UUID uUID_1, - List list_1, ServerPlayerEntity player, Iterator var5) + List list_1, ServerPlayerEntity serverPlayerEntity, Iterator var5) { while (var5.hasNext()) { diff --git a/src/main/java/carpet/mixins/ScreenHandler_stackableSBoxesMixin.java b/src/main/java/carpet/mixins/ScreenHandler_stackableSBoxesMixin.java index 6c8ff20e..87e55966 100644 --- a/src/main/java/carpet/mixins/ScreenHandler_stackableSBoxesMixin.java +++ b/src/main/java/carpet/mixins/ScreenHandler_stackableSBoxesMixin.java @@ -20,13 +20,13 @@ public class ScreenHandler_stackableSBoxesMixin )) private int getMaxCountForSboxesInScreenHander(Slot slot, ItemStack stack) { - if (CarpetSettings.stackableShulkerBoxes && + if (CarpetSettings.shulkerBoxStackSize > 1 && stack.getItem() instanceof BlockItem && ((BlockItem)stack.getItem()).getBlock() instanceof ShulkerBoxBlock && !InventoryHelper.shulkerBoxHasItems(stack) ) { - return CarpetSettings.SHULKER_STACK_SIZE; + return CarpetSettings.shulkerBoxStackSize; } return slot.getMaxItemCount(stack); } diff --git a/src/main/java/carpet/mixins/Slot_stackableSBoxesMixin.java b/src/main/java/carpet/mixins/Slot_stackableSBoxesMixin.java index 317ca1b6..c4257c3c 100644 --- a/src/main/java/carpet/mixins/Slot_stackableSBoxesMixin.java +++ b/src/main/java/carpet/mixins/Slot_stackableSBoxesMixin.java @@ -18,13 +18,13 @@ public class Slot_stackableSBoxesMixin { )) private int getMaxCountForSboxesInSlot(Slot slot, ItemStack stack) { - if (CarpetSettings.stackableShulkerBoxes && + if (CarpetSettings.shulkerBoxStackSize > 1 && stack.getItem() instanceof BlockItem && ((BlockItem)stack.getItem()).getBlock() instanceof ShulkerBoxBlock && !InventoryHelper.shulkerBoxHasItems(stack) ) { - return CarpetSettings.SHULKER_STACK_SIZE; + return CarpetSettings.shulkerBoxStackSize; } return slot.getMaxItemCount(stack); }