From 38458dd71d64331826f024a253570d5cd30b523e Mon Sep 17 00:00:00 2001 From: jottyfan Date: Thu, 13 Aug 2020 23:08:13 +0200 Subject: [PATCH] added backpack --- gradle.properties | 2 +- .../quickiefabric/QuickieFabric.java | 1 + .../quickiefabric/QuickieFabricClient.java | 18 +++ .../container/BackpackInventory.java | 82 ++++++++++++ .../container/BackpackScreen.java | 71 ++++++++++ .../container/BackpackScreenHandler.java | 126 ++++++++++++++++++ .../quickiefabric/init/RegistryManager.java | 14 +- .../quickiefabric/items/ItemBackpack.java | 67 ++++++++++ .../quickiefabric/items/QuickieItems.java | 1 + .../assets/quickiefabric/lang/de_de.json | 1 + .../assets/quickiefabric/lang/en_us.json | 1 + .../quickiefabric/models/item/backpack.json | 6 + .../quickiefabric/textures/gui/backpack.png | Bin 0 -> 11859 bytes .../quickiefabric/textures/gui/slot.png | Bin 0 -> 436 bytes .../quickiefabric/textures/item/backpack.png | Bin 0 -> 1898 bytes .../data/quickiefabric/recipes/backpack.json | 22 +++ 16 files changed, 410 insertions(+), 2 deletions(-) create mode 100644 src/main/java/de/jottyfan/minecraft/quickiefabric/QuickieFabricClient.java create mode 100644 src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackInventory.java create mode 100644 src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackScreen.java create mode 100644 src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackScreenHandler.java create mode 100644 src/main/java/de/jottyfan/minecraft/quickiefabric/items/ItemBackpack.java create mode 100644 src/main/resources/assets/quickiefabric/models/item/backpack.json create mode 100644 src/main/resources/assets/quickiefabric/textures/gui/backpack.png create mode 100644 src/main/resources/assets/quickiefabric/textures/gui/slot.png create mode 100644 src/main/resources/assets/quickiefabric/textures/item/backpack.png create mode 100644 src/main/resources/data/quickiefabric/recipes/backpack.json diff --git a/gradle.properties b/gradle.properties index 523b6aa..bce08db 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.8.8+build.202 # Mod Properties - mod_version = 1.16.1.3 + mod_version = 1.16.1.4 maven_group = de.jottyfan.minecraft archives_base_name = quickiefabric diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/QuickieFabric.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/QuickieFabric.java index bd4cc5e..f9956e9 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/QuickieFabric.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/QuickieFabric.java @@ -18,6 +18,7 @@ public class QuickieFabric implements ModInitializer { RegistryManager.registerEvents(); RegistryManager.registerBlocks(); RegistryManager.registerBlockEntities(); + RegistryManager.registerContainer(); Registry.BIOME.forEach(RegistryManager::handleBiome); } } diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/QuickieFabricClient.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/QuickieFabricClient.java new file mode 100644 index 0000000..2572d4c --- /dev/null +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/QuickieFabricClient.java @@ -0,0 +1,18 @@ +package de.jottyfan.minecraft.quickiefabric; + +import de.jottyfan.minecraft.quickiefabric.container.BackpackScreen; +import de.jottyfan.minecraft.quickiefabric.init.RegistryManager; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry; + +/** + * + * @author jotty + * + */ +public class QuickieFabricClient implements ClientModInitializer { + @Override + public void onInitializeClient() { + ScreenRegistry.register(RegistryManager.BACKPACK_SCREEN_HANDLER, BackpackScreen::new); + } +} diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackInventory.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackInventory.java new file mode 100644 index 0000000..4a3af1e --- /dev/null +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackInventory.java @@ -0,0 +1,82 @@ +package de.jottyfan.minecraft.quickiefabric.container; + +import de.jottyfan.minecraft.quickiefabric.items.ItemBackpack; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventories; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.collection.DefaultedList; + +public class BackpackInventory implements Inventory { + public static final int SECTION_SIZE = 9; + private final DefaultedList stacks; + public final PlayerEntity accessor; + private BackpackScreenHandler container; + + public BackpackInventory(BackpackScreenHandler container, PlayerEntity player) { + this.accessor = player; + this.stacks = DefaultedList.ofSize(SECTION_SIZE * ItemBackpack.SLOTSIZE, ItemStack.EMPTY); + this.container = container; + } + + public DefaultedList getList(DefaultedList dl) { + dl = stacks; + return dl; + } + + @Override + public void clear() { + stacks.clear(); + markDirty(); + } + + @Override + public boolean canPlayerUse(PlayerEntity player) { + return true; + } + + @Override + public ItemStack getStack(int slot) { + return slot >= stacks.size() ? ItemStack.EMPTY : stacks.get(slot); + } + + @Override + public boolean isEmpty() { + for (ItemStack stack : stacks) { + if (!stack.isEmpty()) { + return false; + } + } + return true; + } + + @Override + public ItemStack removeStack(int slot) { + return Inventories.removeStack(this.stacks, slot); + } + + @Override + public ItemStack removeStack(int slot, int amount) { + ItemStack stack = this.stacks.get(slot); + stack.decrement(amount); + this.stacks.set(slot, stack); + markDirty(); + return stack; + } + + @Override + public void setStack(int slot, ItemStack stack) { + this.stacks.set(slot, stack); + markDirty(); + } + + @Override + public int size() { + return stacks.size(); + } + + @Override + public void markDirty() { + this.container.onContentChanged(this); + } +} diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackScreen.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackScreen.java new file mode 100644 index 0000000..aa0bfb4 --- /dev/null +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackScreen.java @@ -0,0 +1,71 @@ +package de.jottyfan.minecraft.quickiefabric.container; + +import com.mojang.blaze3d.platform.GlStateManager; + +import de.jottyfan.minecraft.quickiefabric.init.RegistryManager; +import de.jottyfan.minecraft.quickiefabric.items.ItemBackpack; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.gui.screen.ingame.ScreenHandlerProvider; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.Identifier; + +@Environment(EnvType.CLIENT) +public class BackpackScreen extends HandledScreen implements ScreenHandlerProvider { + private final static Identifier TEXTURE = new Identifier(RegistryManager.QUICKIEFABRIC, "textures/gui/backpack.png"); + private final static Identifier SLOT_TEXTURE = new Identifier(RegistryManager.QUICKIEFABRIC, "textures/gui/slot.png"); + private int slots; + private Integer containerHeight; + private Integer containerWidth; + + public BackpackScreen(BackpackScreenHandler handler, PlayerInventory inventory, Text text) { + super(handler, inventory, new TranslatableText("container.quickiefabric.backpack")); + slots = ItemBackpack.SLOTSIZE; + if ((slots / 9) == 4) { + this.containerHeight = 184; + } else if ((slots / 9) > 4) { + this.containerHeight = 222; + } + } + + @Override + protected void init() { + super.init(); + this.x = (this.width - this.containerWidth) / 2; + } + + private void drawSlots(MatrixStack matrices, int guiX, int guiY) { + this.client.getTextureManager().bindTexture(SLOT_TEXTURE); + for (int y = 0; y < (slots / 9); y++) + for (int x = 0; x < 9; x++) { + this.drawTexture(matrices, guiX + 7 + (x * 18), guiY + 17 + (y * 18), 0, 0, 18, 18); + } + + if ((slots % 9) != 0) + for (int x = 0; x < (slots % 9); x++) { + this.drawTexture(matrices, guiX + 7 + (x * 18), guiY + 17 + (slots / 9 * 18), 0, 0, 18, 18); + } + } + + @Override + public void render(MatrixStack matrices, int mouseX, int mouseY, float partialTicks) { + this.renderBackground(matrices); + super.render(matrices, mouseX, mouseY, partialTicks); + this.drawMouseoverTooltip(matrices, mouseX, mouseY); + } + + @Override + protected void drawBackground(MatrixStack matrices, float delta, int mouseX, int mouseY) { + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + this.client.getTextureManager().bindTexture(TEXTURE); + int guiX = this.x; + int guiY = (this.height - this.containerHeight) / 2; + this.drawTexture(matrices, guiX, guiY, 0, 0, this.containerWidth, this.containerHeight); + + drawSlots(matrices, guiX, guiY); + } +} diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackScreenHandler.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackScreenHandler.java new file mode 100644 index 0000000..557f6cb --- /dev/null +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/container/BackpackScreenHandler.java @@ -0,0 +1,126 @@ +package de.jottyfan.minecraft.quickiefabric.container; + +import de.jottyfan.minecraft.quickiefabric.init.RegistryManager; +import de.jottyfan.minecraft.quickiefabric.items.ItemBackpack; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.slot.Slot; +import net.minecraft.screen.slot.SlotActionType; +import net.minecraft.util.Hand; +import net.minecraft.util.collection.DefaultedList; + +public class BackpackScreenHandler extends ScreenHandler { + + private final BackpackInventory inv; + private final PlayerEntity player; + private int backpackSlots; + private Hand hand; + + public BackpackScreenHandler(int syncId, PlayerInventory playerInv) { + super(RegistryManager.BACKPACK_SCREEN_HANDLER, syncId); + this.inv = new BackpackInventory(this, playerInv.player); + this.player = playerInv.player; + this.hand = player.getActiveHand(); + backpackSlots = ItemBackpack.SLOTSIZE; + + int spacing; + if(backpackSlots % 9 == 0) + spacing = 30 + (backpackSlots /9) * 18 + ((backpackSlots /9) < 5 ? 0 : 2); + else + spacing = 30 + (backpackSlots /9 + 1) * 18 + ((backpackSlots /9) < 5 ? 0 : 2); + + for(int y = 0; y < (backpackSlots /9); y++) { + for(int x = 0; x < 9; ++x) { + this.addSlot(new Slot(inv, x + y * 9, 8 + x * 18, 18 + y * 18)); + } + } + if((backpackSlots % 9) != 0) + for(int x = 0; x < (backpackSlots % 9); x++) { + this.addSlot(new Slot(inv, x + (backpackSlots /9) * 9, 8 + x * 18, 18 + (backpackSlots /9) * 18)); + } + + + for(int y = 0; y < 3; ++y) { + for(int x = 0; x < 9; ++x) { + this.addSlot(new Slot(playerInv, x + y * 9 + 9, 8 + x * 18, spacing + y * 18)); + } + } + + for(int x = 0; x < 9; ++x) { + this.addSlot(new Slot(playerInv, x, 8 + x * 18, 58 + spacing)); + } + + DefaultedList ad = DefaultedList.ofSize(backpackSlots, ItemStack.EMPTY); + ItemBackpack.getInventory(player.getStackInHand(this.hand), ad); + if(ad.size() == 0) + return; + + for(int x = 0; x < 9; x++) + for(int y = 0; y < backpackSlots /9; y++) { + this.getSlot(x + y * 9).setStack(ad.get(x+y*9)); + } + + for(int x = 0; x < (backpackSlots % 9); x++) { + this.getSlot(x + (backpackSlots /9)*9).setStack(ad.get(x+(backpackSlots /9)*9)); + } + + } + + @Override + public boolean canUse(PlayerEntity player) { + return true; + } + + public void onContentChanged(Inventory inv) { + super.onContentChanged(inv); + if (inv == this.inv) { + this.updateInv(); + } + } + + public void close(PlayerEntity player) { + super.close(player); + this.inv.onClose(player); + } + + public void updateInv() { + this.sendContentUpdates(); + } + + @Override + public ItemStack transferSlot(PlayerEntity player, int slotNum) { + ItemStack copy = ItemStack.EMPTY; + Slot clickedSlot = this.slots.get(slotNum); + if (clickedSlot != null && clickedSlot.hasStack()) { + ItemStack clickedStack = clickedSlot.getStack(); + copy = clickedStack.copy(); + if (slotNum < backpackSlots) { + if (!this.insertItem(clickedStack, backpackSlots, this.slots.size(), true)) { + return ItemStack.EMPTY; + } + } else if (!this.insertItem(clickedStack, 0, backpackSlots, false)) { + return ItemStack.EMPTY; + } + + if (clickedStack.isEmpty()) { + clickedSlot.setStack(ItemStack.EMPTY); + } else { + clickedSlot.markDirty(); + } + } + + return copy; + } + + @Override + public ItemStack onSlotClick(int int_1, int int_2, SlotActionType slotActionType_1, PlayerEntity playerEntity_1) { + if(int_1 > 0) { + if (this.getSlot(int_1).getStack().equals(playerEntity_1.getStackInHand(hand))) + return ItemStack.EMPTY; + } + return super.onSlotClick(int_1, int_2, slotActionType_1, playerEntity_1); + } +} diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/init/RegistryManager.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/init/RegistryManager.java index 50a7ece..3e67adb 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/init/RegistryManager.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/init/RegistryManager.java @@ -10,11 +10,13 @@ import de.jottyfan.minecraft.quickiefabric.blockentity.ItemHoarderBlockEntity; import de.jottyfan.minecraft.quickiefabric.blockentity.MonsterHoarderBlockEntity; import de.jottyfan.minecraft.quickiefabric.blockentity.QuickieFabricBlockEntity; import de.jottyfan.minecraft.quickiefabric.blocks.QuickieBlocks; +import de.jottyfan.minecraft.quickiefabric.container.BackpackScreenHandler; import de.jottyfan.minecraft.quickiefabric.event.BreakBlockCallback; import de.jottyfan.minecraft.quickiefabric.event.EventBlockBreak; import de.jottyfan.minecraft.quickiefabric.items.QuickieItems; import de.jottyfan.minecraft.quickiefabric.tools.QuickieTools; import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder; +import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -23,6 +25,7 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; +import net.minecraft.screen.ScreenHandlerType; import net.minecraft.util.ActionResult; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; @@ -43,7 +46,10 @@ import net.minecraft.world.gen.feature.SimpleBlockFeatureConfig; public class RegistryManager { private static final Logger LOGGER = LogManager.getLogger(RegistryManager.class); - private static final String QUICKIEFABRIC = "quickiefabric"; + public static final String QUICKIEFABRIC = "quickiefabric"; + + public static final Identifier BACKPACK_CONTAINTER = new Identifier(QUICKIEFABRIC, "backpack"); + public static final ScreenHandlerType BACKPACK_SCREEN_HANDLER = ScreenHandlerRegistry.registerSimple(RegistryManager.BACKPACK_CONTAINTER, BackpackScreenHandler::new); public static final ItemGroup QUICKIEFABRIC_GROUP = FabricItemGroupBuilder.create(new Identifier(QUICKIEFABRIC, "all")).icon(() -> new ItemStack(QuickieItems.SPEEDPOWDER)) .appendItems(stacks -> { @@ -52,6 +58,7 @@ public class RegistryManager { stacks.add(new ItemStack(QuickieItems.SPEEDPOWDER)); stacks.add(new ItemStack(QuickieItems.LEVELUP)); stacks.add(new ItemStack(QuickieItems.PENCIL)); + stacks.add(new ItemStack(QuickieItems.BACKPACK)); stacks.add(new ItemStack(QuickieTools.SPEEDPOWDERAXE)); stacks.add(new ItemStack(QuickieTools.SPEEDPOWDERPICKAXE)); stacks.add(new ItemStack(QuickieTools.SPEEDPOWDERSHOVEL)); @@ -102,6 +109,7 @@ public class RegistryManager { registerItem(QuickieItems.PENCIL, "pencil"); registerItem(QuickieItems.SALPETER, "salpeter"); registerItem(QuickieItems.SULPHOR, "sulphor"); + registerItem(QuickieItems.BACKPACK, "backpack"); } public static final void registerTools() { @@ -110,6 +118,10 @@ public class RegistryManager { registerItem(QuickieTools.SPEEDPOWDERPICKAXE, "speedpowderpickaxe"); registerItem(QuickieTools.SPEEDPOWDERSHOVEL, "speedpowdershovel"); } + + public static final void registerContainer() { +// ScreenHandlerRegistry.registerSimple(BACKPACK_CONTAINTER, (syncId, inventory) -> new BackpackScreenHandler(syncId, inventory)); + } public static final void registerEvents() { LOGGER.debug("registering quickiefabric events"); diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/items/ItemBackpack.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/items/ItemBackpack.java new file mode 100644 index 0000000..6c9c009 --- /dev/null +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/items/ItemBackpack.java @@ -0,0 +1,67 @@ +package de.jottyfan.minecraft.quickiefabric.items; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import de.jottyfan.minecraft.quickiefabric.container.BackpackScreenHandler; +import de.jottyfan.minecraft.quickiefabric.init.RegistryManager; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventories; +import net.minecraft.item.DyeableItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.screen.SimpleNamedScreenHandlerFactory; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.Identifier; +import net.minecraft.util.TypedActionResult; +import net.minecraft.util.collection.DefaultedList; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.World; + +/** + * + * @author jotty + * + */ +public class ItemBackpack extends Item implements DyeableItem { + private static final Logger LOGGER = LogManager.getLogger(ItemBackpack.class); + public final static Integer SLOTSIZE = 54; + + public ItemBackpack() { + super(new Item.Settings().group(RegistryManager.QUICKIEFABRIC_GROUP).maxCount(1)); + } + + @Override + public TypedActionResult use(World world, PlayerEntity player, Hand hand) { + if (!world.isClient) { + for (Identifier id : Registry.SCREEN_HANDLER.getIds()) { + LOGGER.info("found registered screen {}", id.toString()); + } + SimpleNamedScreenHandlerFactory factory = new SimpleNamedScreenHandlerFactory( + (id, inventory, buf) -> new BackpackScreenHandler(id, player.inventory), + Text.method_30163(RegistryManager.BACKPACK_CONTAINTER.toString())); + player.openHandledScreen(factory); + } + return new TypedActionResult(ActionResult.PASS, player.getStackInHand(hand)); + } + + public static void setInventory(ItemStack backpack, DefaultedList list) { + CompoundTag nbt = backpack.getOrCreateTag(); + Inventories.toTag(nbt, list); + backpack.setTag(nbt); + } + + public static void getInventory(ItemStack backpack, DefaultedList defaultedList) { + CompoundTag nbt; + if (backpack.hasTag()) { + nbt = backpack.getTag(); + } else { + nbt = new CompoundTag(); + } + Inventories.fromTag(nbt, defaultedList); + backpack.setTag(nbt); + } +} diff --git a/src/main/java/de/jottyfan/minecraft/quickiefabric/items/QuickieItems.java b/src/main/java/de/jottyfan/minecraft/quickiefabric/items/QuickieItems.java index ccb54e0..a2b52f3 100644 --- a/src/main/java/de/jottyfan/minecraft/quickiefabric/items/QuickieItems.java +++ b/src/main/java/de/jottyfan/minecraft/quickiefabric/items/QuickieItems.java @@ -11,4 +11,5 @@ public class QuickieItems { public static final ItemPencil PENCIL = new ItemPencil(); public static final ItemSalpeter SALPETER = new ItemSalpeter(); public static final ItemSulphor SULPHOR = new ItemSulphor(); + public static final ItemBackpack BACKPACK = new ItemBackpack(); } diff --git a/src/main/resources/assets/quickiefabric/lang/de_de.json b/src/main/resources/assets/quickiefabric/lang/de_de.json index 3de30ab..cca4e4d 100644 --- a/src/main/resources/assets/quickiefabric/lang/de_de.json +++ b/src/main/resources/assets/quickiefabric/lang/de_de.json @@ -11,6 +11,7 @@ "item.quickiefabric.construction2": "fertiger Bauplan", "item.quickiefabric.pencil": "Bleistift", "item.quickiefabric.levelup": "Aufwerter", + "item.quickiefabric.backpack": "Rucksack", "block.quickiefabric.orenethersulphor": "Nether-Schwefel", "block.quickiefabric.oresalpeter": "Salpetererz", "block.quickiefabric.oresandsalpeter": "Salpetergestein", diff --git a/src/main/resources/assets/quickiefabric/lang/en_us.json b/src/main/resources/assets/quickiefabric/lang/en_us.json index 15b7fa2..8bdb61d 100644 --- a/src/main/resources/assets/quickiefabric/lang/en_us.json +++ b/src/main/resources/assets/quickiefabric/lang/en_us.json @@ -11,6 +11,7 @@ "item.quickiefabric.construction2": "finished building plan", "item.quickiefabric.pencil": "pencil", "item.quickiefabric.levelup": "level up", + "item.quickiefabric.backpack": "backpack", "block.quickiefabric.orenethersulphor": "nether sulfur", "block.quickiefabric.oresalpeter": "salpeter ore", "block.quickiefabric.oresandsalpeter": "salpeter stone", diff --git a/src/main/resources/assets/quickiefabric/models/item/backpack.json b/src/main/resources/assets/quickiefabric/models/item/backpack.json new file mode 100644 index 0000000..a136be4 --- /dev/null +++ b/src/main/resources/assets/quickiefabric/models/item/backpack.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "quickiefabric:item/backpack" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/quickiefabric/textures/gui/backpack.png b/src/main/resources/assets/quickiefabric/textures/gui/backpack.png new file mode 100644 index 0000000000000000000000000000000000000000..345f09a41b38b7f8854d8d182363e6c8f950fb95 GIT binary patch literal 11859 zcmeHtcT|(jwtnbJk&a3e0wTo#0YV79SLsEXUfHbcN!a|AmYZ%Ykq7|+a@97rvsNCif=}OjL5nFhqd5}gZaKmg}(>gA7DLZnx%)LG_r7lQIc4hM(jd*9L0f$QOr zo}NWNx|Y2@yS74VF^|3*(N^G_``_~R@DFxQw*O?;dqEtX9`7V7@yoPvqtzq%KPJ2|# znDS=Yp^T0&&g;7GOMC-5mKI4+yI*Jrsfw<{nPX?Wx1CiqZXFFhMm{2t^JK7pC4^7h z>C!(ZHF({p$a5v@+YHe)-*1yCcY{eJ?^6Wd)r$~rTtb9{3sVs)!q4Y*mB9rMb-OuC zSbD$2<-O(lVoIDrm(1(av>BmOQe5A-Y*$oOm~Mx9ritlmcxRyoY8X;)$lBb?3YB^B%!+P>*gnq}ZypYB)n!K3u+u&o8SLGrSHS!WM; zCixxi4Kw@D*HOcU;*kVSHf+LT3GV&j3$Lt{gz-b5hU)jg8siq=n@gd>e#=d3emD0= z9p5&!RcAb}&ZHVX)il(I_^Q#<@_sFN)Z6IlYhFARnn(?DF`RmB+Zy*J@z}+lTO7hM zQi(Y+n0cxuG9pdcq5{$Ur4v^ATGZNIF(_NHoQkX0s|-#^h^W%HE^$SC6}w8^*-U^l z1~(u-kGBGll5|_Nlgl!%;~1ug*c#$cPWj`=#*w}6f^2QP21Z;||n0<;kn{mFLpwelOKxceCEcW)S!z&#HwzC0w1OesNH9|sN0XSPXzs8hsbQ`#>C70RY@;|iJ4`VqY{F;#2?0eX_HC;50oV(lpU!Bm1Prhor^Db7L%2X}OtyD9Xq5`lsyR2_rSC zfk>AZi!D8a`l-g`T>4Jel;$l#3QVPGh49w(>MY@)U6kO(CUdExQF@*CRXSn22cv3ZL=ZM6h7yym z?RLL9=N5D2dYmHL=RoKnA3+1cvI@=RMQU%YWXKr?hR&00 z2ACOa1qRSN5L0AiJKvDS<=6v`bJ6;BXp5HAw7gyMtT1ONjd$o#WBn=IvnLDcf%lY|1ou7L=h+fa#nY|vEi zPn&~|0doiLc>Y%mobaZeOnLZ>aL5wR#fVN5m|GznHl33vtZL<19OL!i1ds3_1FA1Y zic}&z#ehC8I(d)VR3s_iaofRk6pW5YjeFGYkh{#}_LG^{Cko(vdt*LTG#Iw%{j%b7 zs=8_iAd2Fi!=mEat;TfbMJcjZZWP2{#SE5JfUNC6)w!ymY989!@Yk%Xs}aJ~G-(nM z)ykpk-EXpapHRd*^{VcPSqwg+<4R!Tgl=#QeZ0m7A@O8CaA*EOLwpS zsdj-}8p)*<@wfTX+QJ#ZQI7Uw7GEwtiU*G4=BbtKSoRq9FMp%ZYCB|a<9Bx7g!#J{e*h)=~G1K@3GrEVb$J$4*<>FUDQR^ZI z5;5ar(A%9fu~7-H^^xZUqxZGe2;?(HKMi&VZN$HQgEIvR?ihTQ2N4iBc-5^)c*1uI zQ6W4{l`fVx?=X_+!YB^m%v}*3DJ%|&NQzQ~+0Ny^%uNq&2gh81wYP=W)jc%8fxOtZ zHJQ=P7mMUGA;B@hAN2Ph(TWbudSc7r!97D-`!XM=_PQ?}y(m+FRQU=0GlWt7!|V}B z-!9~*s!7#J&TJ-5uG6=s`bT+pUk-Z=px0CFhP`7h$>qj)puF$J^>sSYUMZ$50qno* zeV4E3%j3?^(;2qPm1eC3^G}j(P-D^ggg8JoePowyY=kP|vtdx>+u4`w#Cmz7!-D%v zg@Y`ql}ef;Z#6bu98KXL&<1&FHZsRlvGv#sTLmh)ce5pPbLo2fVCGU+ST96Xkuy-? zL^dl;k!Bq!$U;f-((9iJeE7sC$UAT9Jvxh$b~Aq8NG;M3x2*K`25TK>opoH)=w0yB z4$@0_?6K2ZGP%!T#rZ5ePBe9UCb%skTirP3b&c+cEx@}~7J$A(ep+!h_NL3YwfQz3 z-{0A-vLABiAz0p8soW++e^CyUMsb=UYz0z5gS50}27bnd=%M{~+zm!8enCCE>*ieM zmK}JNf<$hV$J%3nXzM+IkT#WjRnU#g2DjM3yRZl4n~KtUm&&;Tm*3;)W-Y4^-Mclo zhzhzzYM7mrw0V>BQg}ke2={$E!Iz0ds=4k;YM-FW(*quWKyBblB6lWOHqhHWJKwSEm0fXUz5Cf#7QYbt>GW>#HlB zEgFk;BJJHRvK_;UK%vZDilRQc%7|um6M+uZE(-W2C+)%TmCakKHojNx6FyB;Cp5}v z6|7*`AhsRmokUYsJn6gesU_>ci*`0Cp|BR%_0|gJCGeQ-%Q2fXkUGSREJi%h!8nuK z-t&WDCHLiG6L;^;4E&bJC!Ik%ATvRyal)^n_st0%ZrFt2nWROqr)fw7s$Xy0Uuu8e z9*rqSjp3~|IzO$zZ7+$k{EVbmGIMz8>Pqw3#B6UQ=%JEn^b(hY?voaH;s9?C&OOO| zF?^>lNXY8oigAuYTNZ&?WhI;K*U$ic$i<+*hD3@8MQ&kO+?>fXSZ6dSI!~>R{psGz zVaZPqy>Ym|7|w*X?gNuQHHaE+**GCDJfFiPXgORo$EPWD`*u^WDs7B< zV8|!U6+c;L*=R{wKVClWHYp6oqc?-}jCZ8%lUzM;?jXw7$$3N^64Kg?mmF;Rvfbs; z=%orHI0;5%m0msw+`e6!+ne6byRdmNozA1;^X-IPt2?`QXI@uNH1MV?&_DKew;!(= zxP+N)j7jHsSiStA-lr#Zy~^)4I6HIqO{odptODDb9HLyDf*qpiU0W-!QF4LUVj|kQ z5`UvgI6H^jxeD(Z^`1Pc(RG5nttR*J{g&rxQ9(J!=CRX!%GI$=9D~lm{*`-HZN-}h z#62BMrj;a;Ou2UWBlyq1#4-1=GSY0CpR!D@WW6g*9DK6hA(=U|()2SpsFExSI5sxcZ7IGOs~?&QmwjhZbkuG%na>$6RMR{dT(-XXy_VQ`FH6m%Po%+ zulv_*3~v|MD~DLw8;`Yu0jx4?bn#heVpGE-l6(_xMYcPa0S+(C#5mX;36`kki@q;B}cx4A<=8ulkP}KE?IR` zNJ|nrF77V3eZ!_{Oz|K z4-6K#$x$J=v-k%0WyW~p3ZKq-g>3imOILSIO2r2P{M_uyiW~Z;LItNSz9E@;>u`G! zM%@C+6I|qvYr#9cs|uthTr@4D;WqP9L6h{`7W5k6F zUnd`*@W--t+%$cc=L9jq8Bi{v3C|yA<;pl}V#0OF15K9w=pE`OZP`l{-U$Oi$LZ+O zJA|@Q9pSRn;k)b66UhmQWwHcoCdvB`vm_{LRCL~6SZMU19l)`$Z7E9!+V^RH+<3sl zna*jI_w|u_6%G07hkUaaL&dj&q>JxVLyWpm3{g3o&n}(>qc>OY(5XJ)T?B1Fof~4f zYVSR1jv3Z_Z(C%bU9>dB$_e8jW_5V;nr+-RMO&itVZ;pTFk?E_;ZUJ>*6;S6=05K2 z^yj0q=4Dc&=&{QxIXg{tO&8Q_OYMz)Z|%;!F=hB3y^!*Gw7NN|vq~sYCT*mj*SYG( zJzBucio`SwKi=jW8b6NR2KP29eFvlWDU-dyjvveYppD)&-Y2%J3)DFW8Aq&6E_Zs> z^@nQB-%gbz#H1&(ma_5*=^}&(ML&nd2JHsqX_ubd^f&bz8zcCZl~~FtPht#|w&*+5 zV|l?JI^&>OV>BMZl-LlgR&V5L9C?>9(?R4bO6P$^>P*4ouIzjKrSqE^f=ZLsy%x%^ z8U{c;u{BZgoPhlmjgqM{hW~rRKw*HbA_+*Ux zbqc9qL&-e-t7#yEnTz$>%Z%jkOPUuyw#R)6po;%-30Ecvp>fq-q}@e$Uc0_lYB-V^ zLU+}hoV?r0tBC2j6cs7!a+&h0q=QuD+uP}c&Dkd3DmR+=O^H%Kq5fXxExytQ>D4+u zHNDV|BIH$+ax7~(Jw<09^+*Ghbi%EVZ1^tmBp4FUf&9zJuxB zLvQ(#y&$~xfLe&`fy})`$#l|gB^wlCY<9%+q+t2AC zMt1j^4%t(}3rAQv8dE~(cA1z)a$HL#A*J|72`QN*bI_*O+|!>GNQ&KSn2nyUdtU93 zxKxziIc>UB1ua>Z%XF1+XjUgxG2IaCz*rW|ScjHgIh>-C>Qetwsgen0ue)02d*#OI zYavvMX{l6+WRy!Qu@^)`=h~vmzVi^Bj{mcI>%rq2l%wjMy00+#JC~^oYFc&8JDa{N z*+53Gg(}^czXf`7rXkLdqxNO5&{BLDe}K#j#DNVXTjj$eLR(c;v7WA zjJSxHFB5a}>l|6C1dGA3-!4h6ck(P(a;8WCK)E>VS|he4-JpmWfi{0*?PU{^m{Dv;YA%0vDW0}%%f9MQz*raYLI1K?beH5i)s3Nxq80FjEc7XT z$U@FBqJuW zn1PO6dXYnl+LWG>PWW*so6+-)uD5IKx1EcJxJq2* zQYr@$A~PQo6@Lp0+=s>2Lf-P&E2=8&W*i2~F(!7%Foqfh`H@Vj$&9whu$tQY&#F*1 zZ3XSp>51-79=t9_caDD?WsLbgcV)SNghw5;z2A9xu$4eoqCE+5GfsNM!6$M~3i^Fn zOYtkZ!Ki&vfwHj5+4QCL8pMK6<;R1=;S&Wt{{{Nxhok;bDOg23u}rGGj0P&)peRQu z$tZ5+TlXmrRfbwxTU5sV8}nNQFSr#Q61Bq7L&{?`eRO5c zrX%L$uiI)sTFq5@v?(Mzlq_2zF9ut~)!(8r| z($vxY{eCkaLct5OzY}Q|eZpyAH@r$Y3V*w96W=b_+N?q7tgO(k_Wch2^PF^J*%6uu z+-JNurPpN`nbqS!1Ht9dqsRS63-9=>TSZchza+>#caRtYyW^8Xn$;b>!+i64Miwri zedN|{ar46`I;7||Ti!3_9WqDn&ksVw44|>~6*KNfQ;ko^KC}q88-yG^eP9rlJ)IOD zOjUP4RF%^4@c1edsp*P9bK(j(Dfu`c7on$jxI7`{%;}rXBxh&u8w*U6QQS6(x(Jwz zfK{Iy6H>{$A7m3RNHbP8-`~riA0ZpLbjOMdKl1|)Y9{(#je~>kdP{g!cZkl|fKy{aIDt-#fv)k(WUN{2nG+P+;y2}6nxgH98jAW>O zOB8{2;DuYFEs(sP4o=uG0040*PbWCS4(ZBbfwV?BN&q*S+JG!5O9|j@h&sQzlN{0p zrR?p3)b-ZTLwMUEV3t5BNn&wNQ7nN2(iP6)>0s}O5%rV+p7V-g+h^T;K$dfetDOYU zP+f~f4()>$a?g?_lu$@u-V5H48lP-sV%Gfub#+Rar02*i%F z{31V7R>2e7`OCrC^*KGp)sjyIdm)6K4;H{Dz|SuN;uio3!1#W*$BwG2|6%Qj`K2OO zPd-n$6CaqDpU=VJ?<_E`3hsaU`%4Rq9`-bkPX~!XySX5c3hqcpSGM1sI@!Bne)s8y zL7sJ;$8B$E#fJ^*-1F}?N-FAFf7qPKXpM4kI=47O|Bkdo{DE_FbFn|iSR(k4_DBb8 zAQ&t&`0wyo`#%i+aysYa=R%3fqY-XrEGqI6z_S2EEzt;+rRaGR3gx#H5frfm2}1>} zKtf=!CCEY;DTGy=--;g!7PPdmg8W9M;)rpDJ0g&0R9JFe6qZL2ZUq$)5`luCA_5j5 zAqy)j5ZnSP2!bQ5tb~N2a0EmE{2PU)3ksXsaQok*I-|10QXxf<0s>GGB*@YVE&vj; z60!hUh@AaG2p|L?A}~u4xX?M(nXsZVS}GDi0bc$;d$jD~u2yIl2W-8d94*lvm_LW~ zP!334SNNH1U4k!oP&{;XO;4+R%GGU zeCLoKeJDxwGf3V27xMFu{J53i&3tJ?@^<9kd8v%GMZ0+Y=3f`-{PXJPR$`Ajmx_huynIFBh%*%>fEc(t((-%>usZ%6 zLfF6^t&!M$@>h}ktsnIl`3gtCVHQGQD-e_)4hIQ|SiwMWArS-!As}D@!`1?nU)bXB z*)eD`_RUzt`z+dGk+jzuEuF(f`T( zci2yBIkb}(wpeXkH9Z{vrTf1C{$#j?LLeP6=zkUZ?~tFe{B{Gu#{9Dndt<`h=lK4( z(f!JjvqJhmeErJ4|3eR0>i;p{l-%{Y;0{sTO zxvHou5X})V6N-`2meyA{qj5?qbZ&*G#_mFTF(b9>(U zjNVENBsGjMD8sa-qdduITd46)8zb5Z1AJ|UE_cm=?-{+mwrw}LrUt><`h!^ zRO$kN1rPuL-~#@8WAz36YsQ^%e|u`&eqa`|0) zUq$&QbN0)`g`Hfn09PEB2~UK^IwM1%INq-b{9*Td1IG!U1t1;r)4e^`BQ_cY+qXsgfNS2CSP6B8|ctr1W8GE3N*ME%&% z1b^4^ADJisN?4`z-ux1S4vH%ifptsyPu!lbN=ePZ%8TB68E31!C5Z-T;xZx4~_vR)7}`>)DHLb@YF(7WcY#gR#3F`;zNGx zR!W;Iq2b|Iy1*@=le7OnSI63!jp89zqiZ)opW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/quickiefabric/textures/gui/slot.png b/src/main/resources/assets/quickiefabric/textures/gui/slot.png new file mode 100644 index 0000000000000000000000000000000000000000..32b0bfa5f270f58c4d0c546f6715f43e148dfa7c GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%U;1OBOz@VoL!i*J5?aP3I z>?NMQuI!IlWrex4>z1641!@ZRba4!+xb^mmq2K`n9u`Nvl z$H#TYQe^fmUSb?%n-v$0R1sWMY_J8Nxv(7=F$@gX{U?O#@ZCZN?L b2F$5ol)dCvJ5f2{Gsw@Lu6{1-oD!M zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1YwvaB`?{P!xd1WWRBImVBw>>$fe8!XQpxN~xn zTqv-Sjnq<00@MHcbC^GHFo`qH#}sl17Kh6&bHOCp>nP`)tUK@P!Rq9T-0TI0NHEIv zn8K2G$Qk>2$?MWnAop*Ia$gI_*M+haaasn{;xZ(38L&&SDNB*?vh1$s<8sS}oZ`C+ zb?qN({R{&xGjC2J2OlUp+#TB(L&iL@brErE6X>X%=X?HGif+$Fw=yts7ZQtmnh52( z3a)hB=N=Kv-6>(=3n|!QVG(s2T_p$jDqlFp6)UG&o9@29jAS z(m^2QjfGCL`7~E4!EmEwkUa!tG_&IWoaQH+#+U^~WYdlnaPdq>pqR`N8B5p(Mrf>{ z`ZK_K-jB(vfI)wTIl;kVkEsFlAD&*xB`48>jUMAwz!ck3fDi$J2N)7CU;~M#KsGX) zNQ6Kp5L5u2#qj}J$a`)8$xbAI98>{pi-(Iw>Z-4y#+qubrE!ynI&PuGmRfG5Q%5Rw*L@E? z_SADP1F1G-xZy__aio#WD4VrK>*M?vtkGhPPp0O^xLJcVMpZ$xo%qQa7-L5uJWd8k z4D;m7CUTA^bCWZhXCw3skbaWWXfg%{T_^T~Hg_-PypiyGcrze^e+P4BQuhPqp1l2v zwN}m#otzBKGMquRg6bQ2^i(*N`KA1JH2<{Wr{jNDG+Zv{+_J~rl=;ET&XeScLIP4S0l~PXQk`oG0xio7Hg?175 zqUjZ(rilDfzS)f;Yi3BD{4mCFsX-4(c>&pc_WX#E?0^i_kVm`cfvj2TVZjabPl%%1 z8fD8`R8NA_$PMmOWWLM9;j3=Xsv*`RZ(G~zoXyScXIe+qr6oeu-F@y!%*`WFs*>hh zr*JFRm7th~wqs`QL3^^M#O$CwCQQwlb0+p{g3SLX&AE+#PrQOn8)GQuL$~S2$25jW z6N)q+h|N82v`bBUYU35aM{WI)td1**mgYw=$-+`J7X?(PWR~{`1Yhci@HI9eh z8D;KC#!vdnSNfci1^RUjh?WzS+O>#MS^=qVNp*w3%G)cu(EPK;FRR5{;RRk_82s$7 zWQJ%(&(@1d^ZqqlbkPQ7D}T(ctRCkxbIqH`vA(`yfIka$fF7ZHmEKnL>KKpo{`qKr z%df~&5&o6nkog;|aM&q+Yg+XH000JJOGiWiV*q0SW4ZhDc>n+a32;bRa{vG?BLDy{ zBLR4&KXw2B00(qQO+^Rf2nZE07KOTUBLDyZ8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kW zXdp*PO;A^X4i^9b0nz03$LYOuIOlQB5n}|Pl!6+? zOu5W2pSFkW7Z(@QTB&uQFFiSDa^54gB15ItIuTTwrkUxQWA5wqXI@^u18{$T4?wL# z&Y7pDZvdP%4cpD;odml2xKcnLA0PGM;X$XMvmN72b9TUgYLFI*^?J?i?JWQ|H#aDX zic(6M@zrWY6?s=iy}G(0r3EQPVoEqW$|F)KWuWgma@Von@9Dda&2|f5ETHG-p9nq> zf+MBGB1V?WCClZKm=eKzd_IXDs kh3#gng87dT=5M3@1EMeZ>ip+N;s5{u07*qoM6N<$g6R{GGXMYp literal 0 HcmV?d00001 diff --git a/src/main/resources/data/quickiefabric/recipes/backpack.json b/src/main/resources/data/quickiefabric/recipes/backpack.json new file mode 100644 index 0000000..e81551e --- /dev/null +++ b/src/main/resources/data/quickiefabric/recipes/backpack.json @@ -0,0 +1,22 @@ +{ + "type": "crafting_shaped", + "pattern": [ + "wlw", + "lsl", + "wlw" + ], + "key": { + "s": { + "item": "minecraft:string" + }, + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:white_wool" + } + }, + "result": { + "item": "quickiefabric:backpack" + } +} \ No newline at end of file