added sorting by sneeking backpack

This commit is contained in:
Jörg Henke 2021-08-23 11:58:47 +02:00
parent 1b494e0668
commit 492b0f3afc
4 changed files with 96 additions and 9 deletions

View File

@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G
loader_version=0.11.6 loader_version=0.11.6
# Mod Properties # Mod Properties
mod_version = 1.17.1.2 mod_version = 1.17.1.3
maven_group = de.jottyfan.minecraft maven_group = de.jottyfan.minecraft
archives_base_name = quickiefabric archives_base_name = quickiefabric

View File

@ -1,5 +1,12 @@
package de.jottyfan.minecraft.quickiefabric.container; 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 de.jottyfan.minecraft.quickiefabric.items.ItemBackpack;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.SimpleInventory; import net.minecraft.inventory.SimpleInventory;
@ -17,6 +24,8 @@ import net.minecraft.util.Hand;
* *
*/ */
public class BackpackInventory extends SimpleInventory { 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_BACKPACK = "backpack";
private static final String NBT_SLOT = "slot"; private static final String NBT_SLOT = "slot";
private static final String NBT_ITEMS = "items"; private static final String NBT_ITEMS = "items";
@ -87,7 +96,7 @@ public class BackpackInventory extends SimpleInventory {
return tag; return tag;
} }
private NbtCompound prepareCompoundTag(Integer slot, ItemStack stack) { private static final NbtCompound prepareCompoundTag(Integer slot, ItemStack stack) {
NbtCompound compoundTag = new NbtCompound(); NbtCompound compoundTag = new NbtCompound();
compoundTag.putInt(NBT_SLOT, slot); compoundTag.putInt(NBT_SLOT, slot);
stack.writeNbt(compoundTag); stack.writeNbt(compoundTag);
@ -97,4 +106,55 @@ public class BackpackInventory extends SimpleInventory {
public void setHand(Hand hand) { public void setHand(Hand hand) {
this.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<ItemStack> getItemsFromBackpack(ItemStack itemStack) {
NbtCompound backpackNbt = init(itemStack).getOrCreateNbt().getCompound(NBT_BACKPACK);
NbtList listTag = backpackNbt.getList(NBT_ITEMS, NbtElement.COMPOUND_TYPE);
List<ItemStack> 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<ItemStack> 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);
}
} }

View File

@ -83,7 +83,7 @@ public class BackpackScreenHandler extends ScreenHandler {
// do not throw but pickup // do not throw but pickup
super.onSlotClick(slotId, quickCraftData, SlotActionType.PICKUP, playerEntity); 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) { if (slotId < 0) {
return; // do not execute anything if slotId is < 0 as sometimes -999 return; // do not execute anything if slotId is < 0 as sometimes -999
} }

View File

@ -1,5 +1,9 @@
package de.jottyfan.minecraft.quickiefabric.items; 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.BackpackInventory;
import de.jottyfan.minecraft.quickiefabric.container.BackpackScreenHandler; import de.jottyfan.minecraft.quickiefabric.container.BackpackScreenHandler;
import de.jottyfan.minecraft.quickiefabric.init.RegistryManager; import de.jottyfan.minecraft.quickiefabric.init.RegistryManager;
@ -42,8 +46,11 @@ public class ItemBackpack extends Item {
@Override @Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) { public TypedActionResult<ItemStack> 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) { if (!world.isClient) {
final ItemStack itemStack = player.getStackInHand(hand);
player.openHandledScreen(new ExtendedScreenHandlerFactory() { player.openHandledScreen(new ExtendedScreenHandlerFactory() {
@Override @Override
public void writeScreenOpeningData(ServerPlayerEntity serverPlayerEntity, PacketByteBuf packetByteBuf) { public void writeScreenOpeningData(ServerPlayerEntity serverPlayerEntity, PacketByteBuf packetByteBuf) {
@ -65,7 +72,31 @@ public class ItemBackpack extends Item {
} }
}); });
} }
return new TypedActionResult<ItemStack>(ActionResult.SUCCESS, itemStack); return new TypedActionResult<ItemStack>(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<ItemStack> stacks = BackpackInventory.getItemsFromBackpack(itemStack);
Map<String, ItemStack> 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 @Override
@ -109,10 +140,6 @@ public class ItemBackpack extends Item {
player.sendMessage(new TranslatableText("msg.backpack.transfer.cancel"), false); 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); return super.useOnBlock(context);