forked from BRNSystems/Server_storage
		
	Fix crafting and some other bugs
This commit is contained in:
		@@ -11,7 +11,7 @@ loader_version=0.15.11
 | 
			
		||||
fabric_version=0.100.4+1.21
 | 
			
		||||
 | 
			
		||||
# Mod Properties
 | 
			
		||||
mod_version=2.6.2
 | 
			
		||||
mod_version=3.0.0
 | 
			
		||||
maven_group=systems.brn
 | 
			
		||||
archives_base_name=Server_storage
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -56,9 +56,6 @@ public class ServerStorage implements ModInitializer {
 | 
			
		||||
    public static List<Item> DRIVES;
 | 
			
		||||
    public static List<Item> HEADS;
 | 
			
		||||
 | 
			
		||||
    public static final GameRules.Key<GameRules.BooleanRule> ServerStorage_Crafting_Enable =
 | 
			
		||||
            GameRuleRegistry.register("enableServerStorageCrafting", GameRules.Category.MISC, GameRuleFactory.createBooleanRule(false));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public static Identifier id(String path) {
 | 
			
		||||
        return Identifier.of(MOD_ID, path);
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ import net.minecraft.nbt.NbtCompound;
 | 
			
		||||
import net.minecraft.registry.RegistryWrapper;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import systems.brn.server_storage.lib.StorageNetwork;
 | 
			
		||||
import systems.brn.server_storage.screens.CraftingScreen;
 | 
			
		||||
import systems.brn.server_storage.screens.StorageScreen;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
@@ -14,22 +15,19 @@ import static systems.brn.server_storage.ServerStorage.STORAGE_INTERFACE_BLOCK_E
 | 
			
		||||
 | 
			
		||||
public class StorageInterfaceBlockEntity extends BlockEntity {
 | 
			
		||||
 | 
			
		||||
    public void removeScreen(StorageScreen storageScreenToDelete) {
 | 
			
		||||
        openStorageScreens.remove(storageScreenToDelete);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Boolean sortAlphabetically = false;
 | 
			
		||||
    public String searchString = "";
 | 
			
		||||
    public int page = 0;
 | 
			
		||||
    public StorageNetwork network;
 | 
			
		||||
 | 
			
		||||
    public final ArrayList<StorageScreen> openStorageScreens = new ArrayList<>();
 | 
			
		||||
    public final ArrayList<CraftingScreen> openCraftingScreens = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    public StorageInterfaceBlockEntity(BlockPos pos, BlockState state) {
 | 
			
		||||
        super(STORAGE_INTERFACE_BLOCK_ENTITY, pos, state);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void justReindexDrives() {
 | 
			
		||||
    public void reindexDrives() {
 | 
			
		||||
        if (this.network != null) {
 | 
			
		||||
            this.network.reindexNetwork(world, this.pos, sortAlphabetically, searchString);
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -37,8 +35,8 @@ public class StorageInterfaceBlockEntity extends BlockEntity {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void reindexDrives() {
 | 
			
		||||
        justReindexDrives();
 | 
			
		||||
    public void refreshTerminals() {
 | 
			
		||||
        reindexDrives();
 | 
			
		||||
        this.network.updateDisplays();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -46,6 +44,9 @@ public class StorageInterfaceBlockEntity extends BlockEntity {
 | 
			
		||||
        for (StorageScreen screen : openStorageScreens) {
 | 
			
		||||
            screen.updateDisplay();
 | 
			
		||||
        }
 | 
			
		||||
        for (CraftingScreen screen : openCraftingScreens) {
 | 
			
		||||
            screen.updateDisplay();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Serialize the BlockEntity
 | 
			
		||||
 
 | 
			
		||||
@@ -180,7 +180,7 @@ public class StorageNetwork {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean canRemove(ItemStack stackToRemove) {
 | 
			
		||||
        return canRemoveCount(stackToRemove, itemStackMap) == 0;
 | 
			
		||||
        return canRemoveRemainingCount(stackToRemove, itemStackMap) == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ItemStack removeItemStack(ItemStack stackToRemove) {
 | 
			
		||||
 
 | 
			
		||||
@@ -159,7 +159,7 @@ public class StorageOperations {
 | 
			
		||||
        return out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static int canRemoveCount(ItemStack stackToRemove, Map<ItemStack, Integer> itemsMap) {
 | 
			
		||||
    public static int canRemoveRemainingCount(ItemStack stackToRemove, Map<ItemStack, Integer> itemsMap) {
 | 
			
		||||
        int remainingToRemove = stackToRemove.getCount();
 | 
			
		||||
 | 
			
		||||
        for (Map.Entry<ItemStack, Integer> entry : itemsMap.entrySet()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -112,95 +112,58 @@ public class Util {
 | 
			
		||||
        ArrayList<CraftingEntry> craftingEntries = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        for (RecipeEntry<CraftingRecipe> recipe : allRecipes) {
 | 
			
		||||
            int maxAmount = -1;
 | 
			
		||||
            int maxAmount = Integer.MAX_VALUE;
 | 
			
		||||
            boolean canMake = true;
 | 
			
		||||
            boolean needToAdd = true;
 | 
			
		||||
            CraftingEntry finalEntry;
 | 
			
		||||
            HashMap<ItemStack, Integer> finalInputs = new HashMap<>();
 | 
			
		||||
            Map<Item, Integer> ingredientCounts = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
            // Count the occurrences of each ingredient in the recipe
 | 
			
		||||
            for (Ingredient ingredient : recipe.value().getIngredients()) {
 | 
			
		||||
                HashMap<ItemStack, Integer> inputsTemp = new HashMap<>();
 | 
			
		||||
                for (ItemStack stack : ingredient.getMatchingStacks()) {
 | 
			
		||||
                    if (stack.isEmpty()) {
 | 
			
		||||
                        break;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        //if inventory contains stack
 | 
			
		||||
                        boolean foundUsableStack = false;
 | 
			
		||||
                        for (Map.Entry<ItemStack, Integer> entry : inputsTemp.entrySet()) {
 | 
			
		||||
                            ItemStack stackIn = entry.getKey();
 | 
			
		||||
                            Integer count = entry.getValue();
 | 
			
		||||
                            if (stackIn.getItem() == stack.getItem()) {
 | 
			
		||||
                                count += stack.getCount();
 | 
			
		||||
                                entry.setValue(count); // Update the value in the map
 | 
			
		||||
                                foundUsableStack = true;
 | 
			
		||||
                                break;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        if (!foundUsableStack) {
 | 
			
		||||
                            inputsTemp.put(stack, stack.getCount());
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                HashMap<ItemStack, Integer> inputs = new HashMap<>();
 | 
			
		||||
                for (Map.Entry<ItemStack, Integer> entry : inputsTemp.entrySet()) {
 | 
			
		||||
                    ItemStack stackIn = entry.getKey();
 | 
			
		||||
                    Integer count = entry.getValue();
 | 
			
		||||
                    stackIn.setCount(count);
 | 
			
		||||
                    inputs.put(stackIn, stackIn.getCount());
 | 
			
		||||
                }
 | 
			
		||||
                for (Map.Entry<ItemStack, Integer> entry : inputs.entrySet()) {
 | 
			
		||||
                    ItemStack stackIn = entry.getKey();
 | 
			
		||||
                    Integer count = entry.getValue();
 | 
			
		||||
                    boolean itemFound = false;
 | 
			
		||||
                    for (Map.Entry<ItemStack, Integer> itemEntry : itemStackMap.entrySet()){
 | 
			
		||||
                        Item slotItem = itemEntry.getKey().getItem();
 | 
			
		||||
                        int slotCount = itemEntry.getValue();
 | 
			
		||||
                        if (stackIn.getItem() == slotItem) {
 | 
			
		||||
                            count -= slotCount;
 | 
			
		||||
                            entry.setValue(count);
 | 
			
		||||
                            itemFound = true;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    if (!itemFound) {
 | 
			
		||||
                        maxAmount = 0;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                for (Map.Entry<ItemStack, Integer> entry : inputs.entrySet()) {
 | 
			
		||||
                    ItemStack stackIn = entry.getKey();
 | 
			
		||||
                    Integer count = entry.getValue();
 | 
			
		||||
                    if (count > 0) {
 | 
			
		||||
                        canMake = false;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        int thisMaxAmount = Math.floorDivExact(Math.abs(count), stackIn.getCount());
 | 
			
		||||
                        if (maxAmount == -1) {
 | 
			
		||||
                            maxAmount = thisMaxAmount;
 | 
			
		||||
                        } else {
 | 
			
		||||
                            maxAmount = Math.min(maxAmount, thisMaxAmount);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (maxAmount > 0 && canMake && needToAdd) {
 | 
			
		||||
                    ItemStack outputItem = recipe.value().getResult(server.getRegistryManager()).copy();
 | 
			
		||||
                    finalEntry = new CraftingEntry(outputItem, recipe, inputs, maxAmount);
 | 
			
		||||
                    finalInputs.putAll(inputs);
 | 
			
		||||
                    for (int i = 0; i < craftingEntries.size(); i++) {
 | 
			
		||||
                        CraftingEntry entryLoop = craftingEntries.get(i);
 | 
			
		||||
                        for (ItemStack outputStack : entryLoop.outputStacks) {
 | 
			
		||||
                            if (ItemStack.areItemsAndComponentsEqual(outputStack, outputItem)) {
 | 
			
		||||
                                needToAdd = false;
 | 
			
		||||
                                if (maxAmount > outputStack.getCount()) {
 | 
			
		||||
                                    craftingEntries.set(i, finalEntry);
 | 
			
		||||
                                    break;
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    break;
 | 
			
		||||
                    if (stack.isEmpty()) continue;
 | 
			
		||||
                    ingredientCounts.put(stack.getItem(), ingredientCounts.getOrDefault(stack.getItem(), 0) + 1);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (needToAdd && maxAmount > 0) {
 | 
			
		||||
 | 
			
		||||
            boolean usesAnyIngredient = false;
 | 
			
		||||
 | 
			
		||||
            for (Ingredient ingredient : recipe.value().getIngredients()) {
 | 
			
		||||
                int totalAvailable = 0;
 | 
			
		||||
                HashMap<ItemStack, Integer> inputsTemp = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
                for (ItemStack stack : ingredient.getMatchingStacks()) {
 | 
			
		||||
                    if (stack.isEmpty()) continue;
 | 
			
		||||
                    for (Map.Entry<ItemStack, Integer> entry : itemStackMap.entrySet()) {
 | 
			
		||||
                        ItemStack inventoryStack = entry.getKey();
 | 
			
		||||
                        int inventoryCount = entry.getValue();
 | 
			
		||||
 | 
			
		||||
                        if (ItemStack.areItemsEqual(stack, inventoryStack)) {
 | 
			
		||||
                            totalAvailable += inventoryCount;
 | 
			
		||||
                            inputsTemp.put(stack, inventoryCount);
 | 
			
		||||
                            usesAnyIngredient = true;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (totalAvailable == 0) {
 | 
			
		||||
                    canMake = false;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                int requiredCount = ingredient.getMatchingStacks()[0].getCount();
 | 
			
		||||
                int occurrences = ingredientCounts.get(ingredient.getMatchingStacks()[0].getItem());
 | 
			
		||||
                maxAmount = Math.min(maxAmount, totalAvailable / (requiredCount * occurrences));
 | 
			
		||||
 | 
			
		||||
                for (Map.Entry<ItemStack, Integer> entry : inputsTemp.entrySet()) {
 | 
			
		||||
                    ItemStack stackIn = entry.getKey();
 | 
			
		||||
                    int count = entry.getValue();
 | 
			
		||||
                    finalInputs.put(stackIn, count);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (canMake && maxAmount > 0 && usesAnyIngredient) {
 | 
			
		||||
                ItemStack outputItem = recipe.value().getResult(server.getRegistryManager()).copy();
 | 
			
		||||
                finalEntry = new CraftingEntry(outputItem, recipe, finalInputs, maxAmount);
 | 
			
		||||
                CraftingEntry finalEntry = new CraftingEntry(outputItem, recipe, finalInputs, maxAmount);
 | 
			
		||||
                craftingEntries.add(finalEntry);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -23,11 +23,8 @@ import static systems.brn.server_storage.lib.Util.getCraftableRecipes;
 | 
			
		||||
 | 
			
		||||
public class CraftingScreen extends PagedGui {
 | 
			
		||||
    private final StorageScreen storageScreen;
 | 
			
		||||
 | 
			
		||||
    private ArrayList<CraftingEntry> craftingEntries;
 | 
			
		||||
 | 
			
		||||
    private final StorageInterfaceBlockEntity blockEntity;
 | 
			
		||||
 | 
			
		||||
    private ArrayList<DisplayElement> recipesList;
 | 
			
		||||
 | 
			
		||||
    public CraftingScreen(StorageScreen storageScreen) {
 | 
			
		||||
@@ -39,8 +36,8 @@ public class CraftingScreen extends PagedGui {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateDisplay(){
 | 
			
		||||
        blockEntity.reindexDrives();
 | 
			
		||||
    public void updateDisplay() {
 | 
			
		||||
        blockEntity.reindexDrives(); // Use justReindexDrives to avoid looping
 | 
			
		||||
        Map<ItemStack, Integer> itemStackMap = new HashMap<>();
 | 
			
		||||
        addInventoryToMap(storageScreen.getPlayer().getInventory(), itemStackMap);
 | 
			
		||||
        itemStackMap.putAll(blockEntity.network.itemStackMap);
 | 
			
		||||
@@ -54,7 +51,7 @@ public class CraftingScreen extends PagedGui {
 | 
			
		||||
        ArrayList<DisplayElement> recipes = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        for (CraftingEntry craftingEntry : craftingEntries) {
 | 
			
		||||
            ItemStack stackWithCount = craftingEntry.outputStacks.getFirst().copy();
 | 
			
		||||
            ItemStack stackWithCount = craftingEntry.outputStacks.get(0).copy();
 | 
			
		||||
            if (stackWithCount.getCount() > stackWithCount.getMaxCount()) {
 | 
			
		||||
                stackWithCount.setCount(stackWithCount.getMaxCount());
 | 
			
		||||
            }
 | 
			
		||||
@@ -68,14 +65,14 @@ public class CraftingScreen extends PagedGui {
 | 
			
		||||
                                if (clickType.isLeft) { // put into player inventory
 | 
			
		||||
                                    if (clickType.shift) { // craft all
 | 
			
		||||
                                        craftAll(player, recipeEntry, true);
 | 
			
		||||
                                    } else { // craft one stack
 | 
			
		||||
                                        craftOneStack(player, recipeEntry, true);
 | 
			
		||||
                                    } else { // craft one
 | 
			
		||||
                                        craftOne(player, recipeEntry, true);
 | 
			
		||||
                                    }
 | 
			
		||||
                                } else if (clickType.isRight) { // put back into storage
 | 
			
		||||
                                    if (clickType.shift) { // craft all
 | 
			
		||||
                                        craftAll(player, recipeEntry, false);
 | 
			
		||||
                                    } else { // craft one stack
 | 
			
		||||
                                        craftOneStack(player, recipeEntry, false);
 | 
			
		||||
                                    } else { // craft one
 | 
			
		||||
                                        craftOne(player, recipeEntry, false);
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                                updateDisplay();
 | 
			
		||||
@@ -88,7 +85,7 @@ public class CraftingScreen extends PagedGui {
 | 
			
		||||
 | 
			
		||||
    private void craftAll(PlayerEntity player, RecipeEntry<CraftingRecipe> recipeEntry, boolean toPlayerInventory) {
 | 
			
		||||
        while (canCraft(recipeEntry)) {
 | 
			
		||||
            if (craftOneStack(player, recipeEntry, toPlayerInventory)) {
 | 
			
		||||
            if (craftOne(player, recipeEntry, toPlayerInventory)) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -96,94 +93,109 @@ public class CraftingScreen extends PagedGui {
 | 
			
		||||
 | 
			
		||||
    private boolean canCraft(RecipeEntry<CraftingRecipe> recipeEntry) {
 | 
			
		||||
        for (Ingredient ingredient : recipeEntry.value().getIngredients()) {
 | 
			
		||||
            ItemStack stackToRemove = findMatchingStack(ingredient);
 | 
			
		||||
            if (stackToRemove == null) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
            int requiredCount = canRemoveCount(stackToRemove, this.blockEntity.network.itemStackMap);
 | 
			
		||||
 | 
			
		||||
            Map<ItemStack, Integer> playerInventory = new HashMap<>();
 | 
			
		||||
            addInventoryToMap(this.storageScreen.getPlayer().getInventory(), playerInventory);
 | 
			
		||||
            if (requiredCount > 0 && canRemoveCount(stackToRemove, playerInventory) < requiredCount) {
 | 
			
		||||
            if (findMatchingStack(ingredient) == null) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean craftOneStack(PlayerEntity player, RecipeEntry<CraftingRecipe> recipeEntry, boolean toPlayerInventory) {
 | 
			
		||||
        if (!canCraft(recipeEntry)) {
 | 
			
		||||
            return true; //stop
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    private boolean craftOne(PlayerEntity player, RecipeEntry<CraftingRecipe> recipeEntry, boolean toPlayerInventory) {
 | 
			
		||||
        ArrayList<ItemStack> stacksToRemove = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        // Check and remove ingredients
 | 
			
		||||
        if (!canCraft(recipeEntry)) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        // Check and remove ingredients for one crafting operation
 | 
			
		||||
        for (Ingredient ingredient : recipeEntry.value().getIngredients()) {
 | 
			
		||||
            ItemStack stackToRemove = findMatchingStack(ingredient);
 | 
			
		||||
            if (stackToRemove == null) {
 | 
			
		||||
                return false; // Unable to find required ingredient
 | 
			
		||||
            }
 | 
			
		||||
            stacksToRemove.add(stackToRemove);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Remove ingredients from inventory and network
 | 
			
		||||
        for (ItemStack stack : stacksToRemove) {
 | 
			
		||||
            removeItems(stack);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Add the result to the appropriate inventory
 | 
			
		||||
        // Add crafted item to the appropriate inventory
 | 
			
		||||
        ItemStack outputStack = recipeEntry.value().getResult(storageScreen.getPlayer().getRegistryManager()).copy();
 | 
			
		||||
        int maxStackSize = outputStack.getMaxCount();
 | 
			
		||||
 | 
			
		||||
        if (toPlayerInventory) {
 | 
			
		||||
            PlayerInventory playerInventory = player.getInventory();
 | 
			
		||||
            if (canInsertItemIntoInventory(playerInventory, outputStack) == outputStack.getCount()) {
 | 
			
		||||
                playerInventory.insertStack(outputStack);
 | 
			
		||||
            ItemStack insertStack = outputStack.copy();
 | 
			
		||||
            if (canInsertItemIntoInventory(playerInventory, insertStack) == insertStack.getCount()) {
 | 
			
		||||
                playerInventory.insertStack(insertStack);
 | 
			
		||||
            } else {
 | 
			
		||||
                return true;
 | 
			
		||||
                return true; // Inventory full or unable to insert all items
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            if (this.blockEntity.network.canAddItemStack(outputStack)) {
 | 
			
		||||
                this.blockEntity.network.putItemStackRemainder(outputStack);
 | 
			
		||||
            ItemStack insertStack = outputStack.copy();
 | 
			
		||||
            if (this.blockEntity.network.canAddItemStack(insertStack)) {
 | 
			
		||||
                this.blockEntity.network.putItemStackRemainder(insertStack);
 | 
			
		||||
            } else {
 | 
			
		||||
                return true;
 | 
			
		||||
                return true; // Storage full or unable to insert all items
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Remove ingredients
 | 
			
		||||
        for (Ingredient ingredient : recipeEntry.value().getIngredients()) {
 | 
			
		||||
            ItemStack stackToRemove = findMatchingStack(ingredient);
 | 
			
		||||
            if (stackToRemove == null){
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
            removeItems(stackToRemove);
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
        return false; // Crafted one item successfully
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private ItemStack findMatchingStack(Ingredient ingredient) {
 | 
			
		||||
        // Check player's inventory first
 | 
			
		||||
        PlayerInventory playerInventory = storageScreen.getPlayer().getInventory();
 | 
			
		||||
        for (int i = 0; i < playerInventory.size(); i++) {
 | 
			
		||||
            ItemStack playerStack = playerInventory.getStack(i);
 | 
			
		||||
            if (ingredient.test(playerStack)) {
 | 
			
		||||
                ItemStack stackToRemove = playerStack.copy();
 | 
			
		||||
                for (ItemStack matchingStack : ingredient.getMatchingStacks()){
 | 
			
		||||
                    if (matchingStack.getItem() == stackToRemove.getItem()) {
 | 
			
		||||
                        stackToRemove.setCount(matchingStack.getCount()); // Set count to ingredient requirement
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                return stackToRemove;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Check storage network
 | 
			
		||||
        for (ItemStack stack : ingredient.getMatchingStacks()) {
 | 
			
		||||
            if (this.blockEntity.network.canRemove(stack)) {
 | 
			
		||||
                return stack;
 | 
			
		||||
                ItemStack stackToRemove = stack.copy();
 | 
			
		||||
                stackToRemove.setCount(ingredient.getMatchingStacks()[0].getCount()); // Set count to ingredient requirement
 | 
			
		||||
                return stackToRemove;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void removeItems(ItemStack stack) {
 | 
			
		||||
        // Logic to remove items from the storage
 | 
			
		||||
        ItemStack fromPlayer = this.blockEntity.network.removeItemStack(stack);
 | 
			
		||||
        if (fromPlayer != null && fromPlayer.getCount() > 0) {
 | 
			
		||||
        ItemStack removedFromStorage = this.blockEntity.network.removeItemStack(stack);
 | 
			
		||||
        ItemStack fromPlayer = stack.copy();
 | 
			
		||||
        fromPlayer.setCount(stack.getCount() - removedFromStorage.getCount());
 | 
			
		||||
        if (fromPlayer.getCount() > 0) {
 | 
			
		||||
            Inventory playerInventory = player.getInventory();
 | 
			
		||||
            for (int i = 0; i < playerInventory.size(); i++) {
 | 
			
		||||
                if (playerInventory.getStack(i).equals(fromPlayer)) {
 | 
			
		||||
                    playerInventory.removeStack(i);
 | 
			
		||||
                if (ItemStack.areItemsEqual(playerInventory.getStack(i), fromPlayer)) {
 | 
			
		||||
                    playerInventory.removeStack(i, fromPlayer.getCount());
 | 
			
		||||
                    break; // Only remove one stack per crafting iteration
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean open() {
 | 
			
		||||
        page = blockEntity.page;
 | 
			
		||||
        this.blockEntity.openCraftingScreens.add(this);
 | 
			
		||||
        blockEntity.updateDisplays();
 | 
			
		||||
        return super.open();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onClose() {
 | 
			
		||||
        super.onClose();
 | 
			
		||||
        this.blockEntity.openCraftingScreens.remove(this);
 | 
			
		||||
        storageScreen.open();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -194,10 +206,9 @@ public class CraftingScreen extends PagedGui {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected DisplayElement getElement(int id) {
 | 
			
		||||
        if (id >=0 && id < recipesList.size()) {
 | 
			
		||||
        if (id >= 0 && id < recipesList.size()) {
 | 
			
		||||
            return recipesList.get(id);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
        } else {
 | 
			
		||||
            return DisplayElement.empty();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,6 @@ import org.jetbrains.annotations.Nullable;
 | 
			
		||||
import systems.brn.server_storage.blockentities.StorageInterfaceBlockEntity;
 | 
			
		||||
import systems.brn.server_storage.lib.PagedGui;
 | 
			
		||||
 | 
			
		||||
import static systems.brn.server_storage.ServerStorage.ServerStorage_Crafting_Enable;
 | 
			
		||||
import static systems.brn.server_storage.lib.StorageOperations.*;
 | 
			
		||||
import static systems.brn.server_storage.lib.Util.addCountToLore;
 | 
			
		||||
import static systems.brn.server_storage.lib.Util.removeCountFromLore;
 | 
			
		||||
@@ -42,7 +41,7 @@ public class StorageScreen extends PagedGui {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateDisplay() {
 | 
			
		||||
        blockEntity.justReindexDrives();
 | 
			
		||||
        blockEntity.reindexDrives();
 | 
			
		||||
        String title = blockEntity.network.driveUsedSlots +
 | 
			
		||||
                "u/" +
 | 
			
		||||
                blockEntity.network.driveTotalSlots +
 | 
			
		||||
@@ -71,7 +70,7 @@ public class StorageScreen extends PagedGui {
 | 
			
		||||
            ItemStack itemStackKey = (ItemStack) blockEntity.network.itemStackMap.keySet().toArray()[id];
 | 
			
		||||
            ItemStack aestheticStack = itemStackKey.copy();
 | 
			
		||||
            int count = blockEntity.network.itemStackMap.get(itemStackKey);
 | 
			
		||||
            aestheticStack.setCount(Math.max(aestheticStack.getMaxCount(), count));
 | 
			
		||||
            aestheticStack.setCount(Math.min(aestheticStack.getMaxCount(), count));
 | 
			
		||||
            ItemStack newStack = addCountToLore(count, aestheticStack, null);
 | 
			
		||||
            GuiElementBuilder guiElement = new GuiElementBuilder(newStack);
 | 
			
		||||
            return DisplayElement.of(guiElement);
 | 
			
		||||
@@ -108,11 +107,11 @@ public class StorageScreen extends PagedGui {
 | 
			
		||||
                int insertCount = canInsertItemIntoInventory(playerInventory, noLoreStack);
 | 
			
		||||
                ItemStack insertingStack = noLoreStack.copy();
 | 
			
		||||
                insertingStack.setCount(insertCount);
 | 
			
		||||
                blockEntity.reindexDrives();
 | 
			
		||||
                blockEntity.refreshTerminals();
 | 
			
		||||
                if (blockEntity.network.canRemove(noLoreStack) && insertCount > 0) {
 | 
			
		||||
                    playerInventory.insertStack(insertingStack.copy());
 | 
			
		||||
                    blockEntity.network.removeItemStack(insertingStack);
 | 
			
		||||
                    blockEntity.reindexDrives();
 | 
			
		||||
                    blockEntity.refreshTerminals();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else if (!cursorStack.isEmpty()) {
 | 
			
		||||
@@ -125,13 +124,13 @@ public class StorageScreen extends PagedGui {
 | 
			
		||||
        int canPutIn = stack.getCount() - blockEntity.network.putItemStackRemainder(stack);
 | 
			
		||||
        if (canPutIn > 0) {
 | 
			
		||||
            removeFromInventory(player.getInventory(), stack, canPutIn);
 | 
			
		||||
            blockEntity.reindexDrives();
 | 
			
		||||
            blockEntity.refreshTerminals();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean insertItem(ItemStack stack, int startIndex, int endIndex, boolean fromLast) {
 | 
			
		||||
        blockEntity.reindexDrives();
 | 
			
		||||
        blockEntity.refreshTerminals();
 | 
			
		||||
        insertItem(stack);
 | 
			
		||||
        return super.insertItem(stack, startIndex, endIndex, fromLast);
 | 
			
		||||
    }
 | 
			
		||||
@@ -167,7 +166,7 @@ public class StorageScreen extends PagedGui {
 | 
			
		||||
                        .setCallback((x, y, z) -> {
 | 
			
		||||
                            this.blockEntity.sortAlphabetically ^= true;
 | 
			
		||||
                            playClickSound(getPlayer());
 | 
			
		||||
                            this.blockEntity.reindexDrives();
 | 
			
		||||
                            this.blockEntity.refreshTerminals();
 | 
			
		||||
                        })
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
@@ -192,9 +191,6 @@ public class StorageScreen extends PagedGui {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected DisplayElement crafting() {
 | 
			
		||||
        if (!this.getPlayer().getWorld().getGameRules().getBoolean(ServerStorage_Crafting_Enable)) {
 | 
			
		||||
            return DisplayElement.filler();
 | 
			
		||||
        }
 | 
			
		||||
        return DisplayElement.of(
 | 
			
		||||
                new GuiElementBuilder(Items.PLAYER_HEAD)
 | 
			
		||||
                        .setName(Text.translatable("container.crafting").formatted(Formatting.WHITE))
 | 
			
		||||
@@ -211,7 +207,7 @@ public class StorageScreen extends PagedGui {
 | 
			
		||||
 | 
			
		||||
    public void doSearch(String query) {
 | 
			
		||||
        this.blockEntity.searchString = query;
 | 
			
		||||
        this.blockEntity.reindexDrives();
 | 
			
		||||
        this.blockEntity.refreshTerminals();
 | 
			
		||||
        this.page = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -226,7 +222,7 @@ public class StorageScreen extends PagedGui {
 | 
			
		||||
                            playClickSound(player);
 | 
			
		||||
                            this.page = 0;
 | 
			
		||||
                            this.blockEntity.searchString = "";
 | 
			
		||||
                            this.blockEntity.reindexDrives();
 | 
			
		||||
                            this.blockEntity.refreshTerminals();
 | 
			
		||||
                        })
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
@@ -235,7 +231,7 @@ public class StorageScreen extends PagedGui {
 | 
			
		||||
    public void onClose() {
 | 
			
		||||
        this.blockEntity.page = page;
 | 
			
		||||
        this.blockEntity.markDirty();
 | 
			
		||||
        this.blockEntity.removeScreen(this);
 | 
			
		||||
        this.blockEntity.openStorageScreens.remove(this);
 | 
			
		||||
        super.onClose();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user