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 7cfa5db..635ebdc 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackInventory.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackInventory.java @@ -25,6 +25,14 @@ public class BackpackInventory extends SimpleInventory { public static final BackpackInventory getInventory(BackpackScreenHandler handler, PlayerEntity player, ItemStack stack) { + return new BackpackInventory(init(stack).getTag().getCompound("backpack"), handler); + } + + public BackpackInventory(ItemStack stack) { + this(init(stack).getTag().getCompound("backpack"), null); + } + + private final static ItemStack init(ItemStack stack) { if (stack != null) { if (!stack.hasTag()) { stack.setTag(new CompoundTag()); @@ -33,7 +41,7 @@ public class BackpackInventory extends SimpleInventory { stack.getTag().put("backpack", new CompoundTag()); } } - return new BackpackInventory(stack.getTag().getCompound("backpack"), handler); + return stack; } @Override 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 560862d..6772cfc 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,6 @@ package de.jottyfan.minecraft.quickiefabric.items; +import de.jottyfan.minecraft.quickiefabric.container.BackpackInventory; import de.jottyfan.minecraft.quickiefabric.container.BackpackScreenHandler; import de.jottyfan.minecraft.quickiefabric.init.RegistryManager; import io.netty.buffer.Unpooled; @@ -9,6 +10,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.block.entity.ChestBlockEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.Item; @@ -19,6 +21,7 @@ import net.minecraft.screen.ScreenHandler; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; @@ -36,7 +39,7 @@ public class ItemBackpack extends Item { public ItemBackpack() { super(new Item.Settings().group(RegistryManager.QUICKIEFABRIC_GROUP).maxCount(1)); } - + @Override public TypedActionResult use(World world, PlayerEntity player, Hand hand) { ItemStack itemStack = player.getStackInHand(hand); @@ -64,19 +67,52 @@ public class ItemBackpack extends Item { } return new TypedActionResult(ActionResult.SUCCESS, itemStack); } - + @Override public ActionResult useOnBlock(ItemUsageContext context) { BlockPos pos = context.getBlockPos(); World world = context.getWorld(); + PlayerEntity player = context.getPlayer(); BlockState blockState = world.getBlockState(pos); Block block = blockState.getBlock(); if (Blocks.CHEST.equals(block)) { BlockEntity entity = world.getBlockEntity(pos); BlockEntityType type = entity.getType(); if (BlockEntityType.CHEST.equals(type)) { - // 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) + ChestBlockEntity cbe = (ChestBlockEntity) entity; + BackpackInventory bi = new BackpackInventory(context.getStack()); + bi.setHand(context.getHand()); + if (cbe.isEmpty()) { + for (int slot = 0; slot < ItemBackpack.SLOTSIZE; slot++) { + if (slot < cbe.size()) { + cbe.setStack(slot, bi.getStack(slot)); + bi.removeStack(slot); + } + } + bi.onClose(player); + if (!world.isClient) { + player.sendMessage(new TranslatableText("msg.backpack.transfer.cleared"), false); + } + } else if (bi.isEmpty()) { + for (int slot = 0; slot < ItemBackpack.SLOTSIZE; slot++) { + if (slot < cbe.size()) { + bi.setStack(slot, cbe.getStack(slot)); + cbe.setStack(slot, ItemStack.EMPTY); + } + } + bi.onClose(player); + if (!world.isClient) { + player.sendMessage(new TranslatableText("msg.backpack.transfer.filled"), false); + } + } else { + if (!world.isClient) { + 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); diff --git a/src/main/resources/assets/quickiefabric/lang/de_de.json b/src/main/resources/assets/quickiefabric/lang/de_de.json index 6dc831d..0ced1c2 100644 --- a/src/main/resources/assets/quickiefabric/lang/de_de.json +++ b/src/main/resources/assets/quickiefabric/lang/de_de.json @@ -66,5 +66,8 @@ "msg.buildingplan.failonplayer": "Der Bau wurde abgelehnt, um Spieler %s nicht zu gefährden.", "msg.itemhoarder.summary": "Der Itemsauger enthält: %s", "msg.notyetimplemented": "leider noch nicht verfügbar", + "msg.backpack.transfer.filled": "Der Rucksack wurde aus der Kiste befüllt.", + "msg.backpack.transfer.cleared": "Der Rucksackinhalt wurde in die Kiste geschüttet.", + "msg.backpack.transfer.cancel": "Entweder der Rucksack oder die Kiste sind nicht komplett leer.", "error.unleveling.inventory.full": "Es ist kein Platz mehr frei, um die Aufwertungen abzulegen." } diff --git a/src/main/resources/assets/quickiefabric/lang/en_us.json b/src/main/resources/assets/quickiefabric/lang/en_us.json index f6c898f..cf2b4b5 100644 --- a/src/main/resources/assets/quickiefabric/lang/en_us.json +++ b/src/main/resources/assets/quickiefabric/lang/en_us.json @@ -66,5 +66,8 @@ "msg.buildingplan.failonplayer": "The building execution was rejected because of %s who could be injured.", "msg.itemhoarder.summary": "The item hoarder contains: %s", "msg.notyetimplemented": "not yet implemented", + "msg.backpack.transfer.filled": "Filled the backpack from the chest.", + "msg.backpack.transfer.cleared": "Filled the chest from the backpack.", + "msg.backpack.transfer.cancel": "Eigther backpack or chest are not completely empty.", "error.unleveling.inventory.full": "There is no free stack in your inventory for the level ups." }