From 492b0f3afc85ec07ee2043f2a55b575fd87bcb0b Mon Sep 17 00:00:00 2001 From: jottyfan Date: Mon, 23 Aug 2021 11:58:47 +0200 Subject: [PATCH] added sorting by sneeking backpack --- gradle.properties | 2 +- .../container/BackpackInventory.java | 62 ++++++++++++++++++- .../container/BackpackScreenHandler.java | 2 +- .../quickiefabric/items/ItemBackpack.java | 39 ++++++++++-- 4 files changed, 96 insertions(+), 9 deletions(-) diff --git a/gradle.properties b/gradle.properties index d01f528..7cf0673 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.11.6 # Mod Properties - mod_version = 1.17.1.2 + mod_version = 1.17.1.3 maven_group = de.jottyfan.minecraft archives_base_name = quickiefabric diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackInventory.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackInventory.java index 6d7a56f..430544d 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackInventory.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackInventory.java @@ -1,5 +1,12 @@ package de.jottyfan.minecraft.quickiefabric.container; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import de.jottyfan.minecraft.quickiefabric.items.ItemBackpack; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.SimpleInventory; @@ -17,6 +24,8 @@ import net.minecraft.util.Hand; * */ public class BackpackInventory extends SimpleInventory { + private static final Logger LOGGER = LogManager.getLogger(BackpackInventory.class); + private static final String NBT_BACKPACK = "backpack"; private static final String NBT_SLOT = "slot"; private static final String NBT_ITEMS = "items"; @@ -87,7 +96,7 @@ public class BackpackInventory extends SimpleInventory { return tag; } - private NbtCompound prepareCompoundTag(Integer slot, ItemStack stack) { + private static final NbtCompound prepareCompoundTag(Integer slot, ItemStack stack) { NbtCompound compoundTag = new NbtCompound(); compoundTag.putInt(NBT_SLOT, slot); stack.writeNbt(compoundTag); @@ -97,4 +106,55 @@ public class BackpackInventory extends SimpleInventory { public void setHand(Hand hand) { this.hand = hand; } + + /** + * get the items from the itemStack that contains the backpack + * + * @param itemStack the itemStack of the backpack + * @return the list of found itemStacks in the backpack + */ + public static List getItemsFromBackpack(ItemStack itemStack) { + NbtCompound backpackNbt = init(itemStack).getOrCreateNbt().getCompound(NBT_BACKPACK); + NbtList listTag = backpackNbt.getList(NBT_ITEMS, NbtElement.COMPOUND_TYPE); + List items = new ArrayList<>(); + for (int i = 0; i < listTag.size(); ++i) { + NbtCompound compoundTag = listTag.getCompound(i); + int slot = compoundTag.getInt(NBT_SLOT); + if (slot >= 0 && slot < ItemBackpack.SLOTSIZE) { + ItemStack stack = ItemStack.fromNbt(compoundTag); + items.add(stack); + } + } + return items; + } + + /** + * set the items in the itemStack that contains the backpack + * + * @param itemStack the backpack's itemStack + * @param itemStacks the collection of itemStacks for the backpack + */ + public static void setItemsToBackpack(ItemStack itemStack, Collection itemStacks) { + NbtList listTag = new NbtList(); + Integer slot = 0; + for (ItemStack stack : itemStacks) { + if (!(stack == null) && !stack.isEmpty()) { + Integer leftCount = stack.getCount(); + while (leftCount > 0) { + LOGGER.info("add {}x{} to backpack", stack.getCount(), stack.getTranslationKey()); + if (stack.getCount() > stack.getMaxCount()) { + leftCount = stack.getCount() - stack.getMaxCount(); + stack.setCount(leftCount); + } else { + leftCount = 0; + } + listTag.add(prepareCompoundTag(slot, stack)); + slot++; + } + } + } + NbtCompound tag = new NbtCompound(); + tag.put(NBT_ITEMS, listTag); + itemStack.getOrCreateNbt().put(NBT_BACKPACK, tag); + } } diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackScreenHandler.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackScreenHandler.java index 55a9b79..0439504 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackScreenHandler.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackScreenHandler.java @@ -83,7 +83,7 @@ public class BackpackScreenHandler extends ScreenHandler { // do not throw but pickup super.onSlotClick(slotId, quickCraftData, SlotActionType.PICKUP, playerEntity); } - } else if (actionType.equals(SlotActionType.QUICK_CRAFT)) { // drag - but does not drag the right slot content + } else if (actionType.equals(SlotActionType.QUICK_CRAFT)) { // drag - but does not drag the right slot content, stack is empty if (slotId < 0) { return; // do not execute anything if slotId is < 0 as sometimes -999 } diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/items/ItemBackpack.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/items/ItemBackpack.java index 6772cfc..e229507 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/items/ItemBackpack.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/items/ItemBackpack.java @@ -1,5 +1,9 @@ package de.jottyfan.minecraft.quickiefabric.items; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import de.jottyfan.minecraft.quickiefabric.container.BackpackInventory; import de.jottyfan.minecraft.quickiefabric.container.BackpackScreenHandler; import de.jottyfan.minecraft.quickiefabric.init.RegistryManager; @@ -42,8 +46,11 @@ public class ItemBackpack extends Item { @Override public TypedActionResult use(World world, PlayerEntity player, Hand hand) { - ItemStack itemStack = player.getStackInHand(hand); + if (player.isSneaking()) { + player.setStackInHand(hand, sortBackpackContent(player.getStackInHand(hand))); + } if (!world.isClient) { + final ItemStack itemStack = player.getStackInHand(hand); player.openHandledScreen(new ExtendedScreenHandlerFactory() { @Override public void writeScreenOpeningData(ServerPlayerEntity serverPlayerEntity, PacketByteBuf packetByteBuf) { @@ -65,7 +72,31 @@ public class ItemBackpack extends Item { } }); } - return new TypedActionResult(ActionResult.SUCCESS, itemStack); + return new TypedActionResult(ActionResult.SUCCESS, player.getStackInHand(hand)); + } + + /** + * sort the content of the backpack; for spreaded items, combine them until the itemstack size is reached + * + * @param itemStack the itemStack of the backpack + * @return the itemStack of the sorted backpack + */ + private ItemStack sortBackpackContent(ItemStack itemStack) { + if (!itemStack.isEmpty()) { + List stacks = BackpackInventory.getItemsFromBackpack(itemStack); + Map map = new HashMap<>(); + for (ItemStack stack : stacks) { + String id = stack.getItem().getTranslationKey(); + ItemStack foundStack = map.get(id); + if (foundStack == null) { + map.put(id, stack); + } else { + foundStack.setCount(foundStack.getCount() + stack.getCount()); + } + } + BackpackInventory.setItemsToBackpack(itemStack, map.values()); + } + return itemStack; } @Override @@ -109,10 +140,6 @@ public class ItemBackpack extends Item { player.sendMessage(new TranslatableText("msg.backpack.transfer.cancel"), false); } } - // alternative: - // TODO: create a new dialog for transferring items from backpack to chest and - // back - // with the help of some buttons (such as all or so) } } return super.useOnBlock(context);