From 068a42292fa874cdad2d992c7dd5fe71f0149228 Mon Sep 17 00:00:00 2001 From: Thomas Baum Date: Thu, 13 Jan 2022 09:10:14 +1100 Subject: [PATCH 1/2] Shulker box stack size is now configurable (#1254) --- src/main/java/carpet/CarpetSettings.java | 39 +++++++++++++++++-- ...actCauldronBlock_stackableSBoxesMixin.java | 2 +- .../java/carpet/mixins/ItemEntityMixin.java | 12 +++--- .../ScreenHandler_stackableSBoxesMixin.java | 4 +- .../mixins/Slot_stackableSBoxesMixin.java | 4 +- 5 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 4956cb2c..88e8619a 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.equals("false")) { + shulkerBoxStackSize = 1; + return newValue; + } + if (newValue.equals("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 to 64 or a custom value 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/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); } From b46a4d9668d7d38677f2507e2d90d73769077b18 Mon Sep 17 00:00:00 2001 From: gnembon Date: Wed, 12 Jan 2022 23:24:23 +0100 Subject: [PATCH 2/2] update new loader issues --- src/main/java/carpet/CarpetSettings.java | 6 +++--- .../java/carpet/mixins/PlayerManager_fakePlayersMixin.java | 2 +- src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 88e8619a..372b0986 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -217,11 +217,11 @@ public class CarpetSettings return newValue; } } - if (newValue.equals("false")) { + if (newValue.equalsIgnoreCase("false")) { shulkerBoxStackSize = 1; return newValue; } - if (newValue.equals("true")) { + if (newValue.equalsIgnoreCase("true")) { shulkerBoxStackSize = 64; return newValue; } @@ -236,7 +236,7 @@ public class CarpetSettings } @Rule( - desc = "Empty shulker boxes can stack to 64 or a custom value when thrown 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"}, diff --git a/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java b/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java index bd1f3733..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, Iterator var5) + List list_1, ServerPlayerEntity serverPlayerEntity, Iterator var5) { while (var5.hasNext()) { diff --git a/src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java b/src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java index cb5277ed..7a5ad342 100644 --- a/src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java +++ b/src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java @@ -4,6 +4,7 @@ import carpet.CarpetSettings; import carpet.fakes.ServerWorldInterface; import carpet.script.CarpetEventServer; import net.minecraft.entity.Entity; +import net.minecraft.world.LocalDifficulty; import net.minecraft.world.entity.EntityLike; import net.minecraft.entity.LightningEntity; import net.minecraft.entity.damage.DamageSource; @@ -41,7 +42,7 @@ public class ServerWorld_scarpetMixin implements ServerWorldInterface )) private void onNaturalLightinig(WorldChunk chunk, int randomTickSpeed, CallbackInfo ci, //ChunkPos chunkPos, boolean bl, int i, int j, Profiler profiler, BlockPos blockPos, boolean bl2) - ChunkPos chunkPos, boolean bl, int i, int j, Profiler profiler, BlockPos blockPos, boolean bl2, LightningEntity lightningEntity) + ChunkPos chunkPos, boolean bl, int i, int j, Profiler profiler, BlockPos blockPos, LocalDifficulty localDifficulty, boolean bl2, LightningEntity lightningEntity) { if (LIGHTNING.isNeeded()) LIGHTNING.onWorldEventFlag((ServerWorld) (Object)this, blockPos, bl2?1:0); }