Search in sources :

Example 1 with BlueprintCraftingInventory

use of com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintCraftingInventory in project Create by Creators-of-Create.

the class BlueprintOverlayRenderer method rebuild.

public static void rebuild(BlueprintSection sectionAt, boolean sneak) {
    cachedRenderedFilters.clear();
    ItemStackHandler items = sectionAt.getItems();
    boolean empty = true;
    for (int i = 0; i < 9; i++) {
        if (!items.getStackInSlot(i).isEmpty()) {
            empty = false;
            break;
        }
    }
    BlueprintOverlayRenderer.empty = empty;
    BlueprintOverlayRenderer.result = ItemStack.EMPTY;
    if (empty)
        return;
    boolean firstPass = true;
    boolean success = true;
    Minecraft mc = Minecraft.getInstance();
    ItemStackHandler playerInv = new ItemStackHandler(mc.player.getInventory().getContainerSize());
    for (int i = 0; i < playerInv.getSlots(); i++) playerInv.setStackInSlot(i, mc.player.getInventory().getItem(i).copy());
    int amountCrafted = 0;
    Optional<CraftingRecipe> recipe = Optional.empty();
    Map<Integer, ItemStack> craftingGrid = new HashMap<>();
    ingredients.clear();
    ItemStackHandler missingItems = new ItemStackHandler(64);
    ItemStackHandler availableItems = new ItemStackHandler(64);
    List<ItemStack> newlyAdded = new ArrayList<>();
    List<ItemStack> newlyMissing = new ArrayList<>();
    boolean invalid = false;
    do {
        craftingGrid.clear();
        newlyAdded.clear();
        newlyMissing.clear();
        Search: for (int i = 0; i < 9; i++) {
            ItemStack requestedItem = items.getStackInSlot(i);
            if (requestedItem.isEmpty()) {
                craftingGrid.put(i, ItemStack.EMPTY);
                continue;
            }
            for (int slot = 0; slot < playerInv.getSlots(); slot++) {
                if (!FilterItem.test(mc.level, playerInv.getStackInSlot(slot), requestedItem))
                    continue;
                ItemStack currentItem = playerInv.extractItem(slot, 1, false);
                craftingGrid.put(i, currentItem);
                newlyAdded.add(currentItem);
                continue Search;
            }
            success = false;
            newlyMissing.add(requestedItem);
        }
        if (success) {
            CraftingContainer craftingInventory = new BlueprintCraftingInventory(craftingGrid);
            if (!recipe.isPresent())
                recipe = mc.level.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftingInventory, mc.level);
            ItemStack resultFromRecipe = recipe.filter(r -> r.matches(craftingInventory, mc.level)).map(r -> r.assemble(craftingInventory)).orElse(ItemStack.EMPTY);
            if (resultFromRecipe.isEmpty()) {
                if (!recipe.isPresent())
                    invalid = true;
                success = false;
            } else if (resultFromRecipe.getCount() + amountCrafted > 64) {
                success = false;
            } else {
                amountCrafted += resultFromRecipe.getCount();
                if (result.isEmpty())
                    result = resultFromRecipe.copy();
                else
                    result.grow(resultFromRecipe.getCount());
                resultCraftable = true;
                firstPass = false;
            }
        }
        if (success || firstPass) {
            newlyAdded.forEach(s -> ItemHandlerHelper.insertItemStacked(availableItems, s, false));
            newlyMissing.forEach(s -> ItemHandlerHelper.insertItemStacked(missingItems, s, false));
        }
        if (!success) {
            if (firstPass) {
                result = invalid ? ItemStack.EMPTY : items.getStackInSlot(9);
                resultCraftable = false;
            }
            break;
        }
        if (!sneak)
            break;
    } while (success);
    for (int i = 0; i < 9; i++) {
        ItemStack available = availableItems.getStackInSlot(i);
        if (available.isEmpty())
            continue;
        ingredients.add(Pair.of(available, true));
    }
    for (int i = 0; i < 9; i++) {
        ItemStack missing = missingItems.getStackInSlot(i);
        if (missing.isEmpty())
            continue;
        ingredients.add(Pair.of(missing, false));
    }
}
Also used : Items(net.minecraft.world.item.Items) BlueprintSection(com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection) FilterItem(com.simibubi.create.content.logistics.item.filter.FilterItem) Item(net.minecraft.world.item.Item) HashMap(java.util.HashMap) AllItems(com.simibubi.create.AllItems) BlueprintCraftingInventory(com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintCraftingInventory) IIngameOverlay(net.minecraftforge.client.gui.IIngameOverlay) ArrayList(java.util.ArrayList) PoseStack(com.mojang.blaze3d.vertex.PoseStack) Ingredient(net.minecraft.world.item.crafting.Ingredient) ItemHandlerHelper(net.minecraftforge.items.ItemHandlerHelper) Minecraft(net.minecraft.client.Minecraft) ChatFormatting(net.minecraft.ChatFormatting) Map(java.util.Map) GuiGameElement(com.simibubi.create.foundation.gui.element.GuiGameElement) WhitelistMode(com.simibubi.create.content.logistics.item.filter.AttributeFilterContainer.WhitelistMode) AnimationTickHolder(com.simibubi.create.foundation.utility.AnimationTickHolder) RecipeType(net.minecraft.world.item.crafting.RecipeType) IdentityHashMap(java.util.IdentityHashMap) CraftingRecipe(net.minecraft.world.item.crafting.CraftingRecipe) ItemTags(net.minecraft.tags.ItemTags) EntityHitResult(net.minecraft.world.phys.EntityHitResult) ItemAttribute(com.simibubi.create.content.logistics.item.filter.ItemAttribute) Tag(net.minecraft.tags.Tag) Pair(com.simibubi.create.foundation.utility.Pair) AllGuiTextures(com.simibubi.create.foundation.gui.AllGuiTextures) HitResult(net.minecraft.world.phys.HitResult) List(java.util.List) CompoundTag(net.minecraft.nbt.CompoundTag) CraftingContainer(net.minecraft.world.inventory.CraftingContainer) ItemStackHandler(net.minecraftforge.items.ItemStackHandler) RenderSystem(com.mojang.blaze3d.systems.RenderSystem) ForgeIngameGui(net.minecraftforge.client.gui.ForgeIngameGui) Optional(java.util.Optional) ItemStack(net.minecraft.world.item.ItemStack) Type(net.minecraft.world.phys.HitResult.Type) ListTag(net.minecraft.nbt.ListTag) ItemStackHandler(net.minecraftforge.items.ItemStackHandler) HashMap(java.util.HashMap) IdentityHashMap(java.util.IdentityHashMap) ArrayList(java.util.ArrayList) CraftingRecipe(net.minecraft.world.item.crafting.CraftingRecipe) Minecraft(net.minecraft.client.Minecraft) CraftingContainer(net.minecraft.world.inventory.CraftingContainer) ItemStack(net.minecraft.world.item.ItemStack) BlueprintCraftingInventory(com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintCraftingInventory)

Aggregations

RenderSystem (com.mojang.blaze3d.systems.RenderSystem)1 PoseStack (com.mojang.blaze3d.vertex.PoseStack)1 AllItems (com.simibubi.create.AllItems)1 BlueprintCraftingInventory (com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintCraftingInventory)1 BlueprintSection (com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection)1 WhitelistMode (com.simibubi.create.content.logistics.item.filter.AttributeFilterContainer.WhitelistMode)1 FilterItem (com.simibubi.create.content.logistics.item.filter.FilterItem)1 ItemAttribute (com.simibubi.create.content.logistics.item.filter.ItemAttribute)1 AllGuiTextures (com.simibubi.create.foundation.gui.AllGuiTextures)1 GuiGameElement (com.simibubi.create.foundation.gui.element.GuiGameElement)1 AnimationTickHolder (com.simibubi.create.foundation.utility.AnimationTickHolder)1 Pair (com.simibubi.create.foundation.utility.Pair)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 IdentityHashMap (java.util.IdentityHashMap)1 List (java.util.List)1 Map (java.util.Map)1 Optional (java.util.Optional)1 ChatFormatting (net.minecraft.ChatFormatting)1 Minecraft (net.minecraft.client.Minecraft)1