From 4340b2ccb441996b0f482e1bdf619c664c0388c4 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Thu, 15 Oct 2020 04:46:23 +0200 Subject: [PATCH] fixed message propagation for missing items --- .../de/ellpeck/prettypipes/items/IModule.java | 5 +++-- .../ellpeck/prettypipes/items/ModuleItem.java | 5 +++-- .../prettypipes/network/PipeNetwork.java | 11 ++++++----- .../prettypipes/pipe/PipeTileEntity.java | 9 +++++---- .../pipe/modules/craft/CraftingModuleItem.java | 13 ++++++++----- .../terminal/CraftingTerminalBlock.java | 1 + .../terminal/CraftingTerminalTileEntity.java | 6 +++--- .../terminal/ItemTerminalTileEntity.java | 17 +++++++++++------ 8 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/main/java/de/ellpeck/prettypipes/items/IModule.java b/src/main/java/de/ellpeck/prettypipes/items/IModule.java index 13e0c50..d288343 100644 --- a/src/main/java/de/ellpeck/prettypipes/items/IModule.java +++ b/src/main/java/de/ellpeck/prettypipes/items/IModule.java @@ -10,6 +10,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraftforge.items.IItemHandler; import java.util.List; +import java.util.function.Consumer; import java.util.function.Predicate; public interface IModule { @@ -36,7 +37,7 @@ public interface IModule { List getAllCraftables(ItemStack module, PipeTileEntity tile); - int getCraftableAmount(ItemStack module, PipeTileEntity tile, ItemStack stack, ItemEqualityType... equalityTypes); + int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes); - ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, ItemStack stack, ItemEqualityType... equalityTypes); + ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes); } diff --git a/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java b/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java index 0c819de..95b731b 100644 --- a/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java +++ b/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java @@ -20,6 +20,7 @@ import net.minecraftforge.items.IItemHandler; import javax.annotation.Nullable; import java.util.Collections; import java.util.List; +import java.util.function.Consumer; public abstract class ModuleItem extends Item implements IModule { @@ -83,12 +84,12 @@ public abstract class ModuleItem extends Item implements IModule { } @Override - public int getCraftableAmount(ItemStack module, PipeTileEntity tile, ItemStack stack, ItemEqualityType... equalityTypes) { + public int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { return 0; } @Override - public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, ItemStack stack, ItemEqualityType... equalityTypes) { + public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { return stack; } } diff --git a/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java b/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java index 3b1cc20..17eefa5 100644 --- a/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java +++ b/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java @@ -43,6 +43,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.*; import java.util.function.BiFunction; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -193,17 +194,17 @@ public class PipeNetwork implements ICapabilitySerializable, GraphL return remain; } // check craftable items - return this.requestCraftedItem(destPipe, remain, equalityTypes); + return this.requestCraftedItem(destPipe, null, remain, equalityTypes); } - public ItemStack requestCraftedItem(BlockPos destPipe, ItemStack stack, ItemEqualityType... equalityTypes) { + public ItemStack requestCraftedItem(BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { for (Pair craftable : this.getAllCraftables(destPipe)) { if (!ItemEqualityType.compareItems(stack, craftable.getRight(), equalityTypes)) continue; PipeTileEntity pipe = this.getPipe(craftable.getLeft()); if (pipe == null) continue; - stack = pipe.craft(destPipe, stack, equalityTypes); + stack = pipe.craft(destPipe, unavailableConsumer, stack, equalityTypes); if (stack.isEmpty()) break; } @@ -264,7 +265,7 @@ public class PipeNetwork implements ICapabilitySerializable, GraphL return craftables; } - public int getCraftableAmount(BlockPos node, ItemStack stack, ItemEqualityType... equalityTypes) { + public int getCraftableAmount(BlockPos node, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { int total = 0; for (Pair pair : this.getAllCraftables(node)) { if (!ItemEqualityType.compareItems(pair.getRight(), stack, equalityTypes)) @@ -273,7 +274,7 @@ public class PipeNetwork implements ICapabilitySerializable, GraphL continue; PipeTileEntity pipe = this.getPipe(pair.getLeft()); if (pipe != null) - total += pipe.getCraftableAmount(stack, equalityTypes); + total += pipe.getCraftableAmount(unavailableConsumer, stack, equalityTypes); } return total; } diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java b/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java index d0c4ba0..cdad262 100644 --- a/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java @@ -42,6 +42,7 @@ import org.apache.commons.lang3.tuple.Triple; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.*; +import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -264,17 +265,17 @@ public class PipeTileEntity extends TileEntity implements INamedContainerProvide .collect(Collectors.toList()); } - public int getCraftableAmount(ItemStack stack, ItemEqualityType... equalityTypes) { + public int getCraftableAmount(Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { return this.streamModules() - .mapToInt(m -> m.getRight().getCraftableAmount(m.getLeft(), this, stack, equalityTypes)) + .mapToInt(m -> m.getRight().getCraftableAmount(m.getLeft(), this, unavailableConsumer, stack, equalityTypes)) .sum(); } - public ItemStack craft(BlockPos destPipe, ItemStack stack, ItemEqualityType... equalityTypes) { + public ItemStack craft(BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { Iterator> modules = this.streamModules().iterator(); while (modules.hasNext()) { Pair module = modules.next(); - stack = module.getRight().craft(module.getLeft(), this, destPipe, stack, equalityTypes); + stack = module.getRight().craft(module.getLeft(), this, destPipe, unavailableConsumer, stack, equalityTypes); if (stack.isEmpty()) break; } diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java b/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java index edd06d5..d0b9189 100644 --- a/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java +++ b/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java @@ -32,6 +32,7 @@ import org.apache.commons.lang3.tuple.Triple; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; public class CraftingModuleItem extends ModuleItem { @@ -118,6 +119,8 @@ public class CraftingModuleItem extends ModuleItem { } } } + if (dest == null) + continue; for (NetworkLocation item : items) { ItemStack requestRemain = network.requestExistingItem(item, request.getLeft(), dest.getLeft(), null, dest.getRight(), equalityTypes); remain.shrink(dest.getRight().getCount() - requestRemain.getCount()); @@ -149,7 +152,7 @@ public class CraftingModuleItem extends ModuleItem { } @Override - public int getCraftableAmount(ItemStack module, PipeTileEntity tile, ItemStack stack, ItemEqualityType... equalityTypes) { + public int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { PipeNetwork network = PipeNetwork.get(tile.getWorld()); List items = network.getOrderedNetworkItems(tile.getPos()); ItemStackHandler input = this.getInput(module); @@ -160,7 +163,7 @@ public class CraftingModuleItem extends ModuleItem { ItemStack out = output.getStackInSlot(i); if (!out.isEmpty() && ItemEqualityType.compareItems(out, stack, equalityTypes)) { // figure out how many crafting operations we can actually do with the input items we have in the network - int availableCrafts = CraftingTerminalTileEntity.getAvailableCrafts(tile, input.getSlots(), input::getStackInSlot, k -> true, s -> items, null, equalityTypes); + int availableCrafts = CraftingTerminalTileEntity.getAvailableCrafts(tile, input.getSlots(), input::getStackInSlot, k -> true, s -> items, unavailableConsumer, equalityTypes); if (availableCrafts > 0) craftable += out.getCount() * availableCrafts; } @@ -169,9 +172,9 @@ public class CraftingModuleItem extends ModuleItem { } @Override - public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, ItemStack stack, ItemEqualityType... equalityTypes) { + public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { // check if we can craft the required amount of items - int craftableAmount = this.getCraftableAmount(module, tile, stack, equalityTypes); + int craftableAmount = this.getCraftableAmount(module, tile, unavailableConsumer, stack, equalityTypes); if (craftableAmount <= 0) return stack; @@ -189,7 +192,7 @@ public class CraftingModuleItem extends ModuleItem { continue; ItemStack copy = in.copy(); copy.setCount(in.getCount() * toCraft); - Pair, ItemStack> ret = ItemTerminalTileEntity.requestItemLater(tile.getWorld(), tile.getPos(), copy, items, equalityTypes); + Pair, ItemStack> ret = ItemTerminalTileEntity.requestItemLater(tile.getWorld(), tile.getPos(), items, unavailableConsumer, copy, equalityTypes); tile.craftIngredientRequests.addAll(ret.getLeft()); } diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalBlock.java b/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalBlock.java index 43fba1a..7287188 100644 --- a/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalBlock.java +++ b/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalBlock.java @@ -27,6 +27,7 @@ public class CraftingTerminalBlock extends ItemTerminalBlock { BlockPos pos = pipePos.offset(direction); CraftingTerminalTileEntity tile = Utility.getTileEntity(CraftingTerminalTileEntity.class, world, pos); if (tile != null) { + remain = remain.copy(); int lowestSlot = -1; do { for (int i = 0; i < tile.craftItems.getSlots(); i++) { diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java b/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java index 78c7d88..a744d16 100644 --- a/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java @@ -111,7 +111,7 @@ public class CraftingTerminalTileEntity extends ItemTerminalTileEntity { int lowestAvailable = getAvailableCrafts(pipe, this.craftItems.getSlots(), this::getRequestedCraftItem, this::isGhostItem, s -> { NetworkItem item = this.networkItems.get(s); return item != null ? item.getLocations() : Collections.emptyList(); - }, s -> player.sendMessage(new TranslationTextComponent("info." + PrettyPipes.ID + ".not_found", s.getDisplayName()).setStyle(Style.EMPTY.setFormatting(TextFormatting.RED)), UUID.randomUUID()), ItemEqualityType.NBT); + }, onItemUnavailable(player), ItemEqualityType.NBT); if (lowestAvailable > 0) { // if we're limiting the amount, pretend we only have that amount available if (maxAmount < lowestAvailable) @@ -122,7 +122,7 @@ public class CraftingTerminalTileEntity extends ItemTerminalTileEntity { continue; requested = requested.copy(); requested.setCount(lowestAvailable); - this.requestItemImpl(requested); + this.requestItemImpl(requested, onItemUnavailable(player)); } player.sendMessage(new TranslationTextComponent("info." + PrettyPipes.ID + ".sending_ingredients", lowestAvailable).setStyle(Style.EMPTY.setFormatting(TextFormatting.GREEN)), UUID.randomUUID()); } @@ -186,7 +186,7 @@ public class CraftingTerminalTileEntity extends ItemTerminalTileEntity { // check how many craftable items we have and add those on if we need to if (available < lowestAvailable) { - int craftable = network.getCraftableAmount(tile.getPos(), stack.stack, equalityTypes); + int craftable = network.getCraftableAmount(tile.getPos(),unavailableConsumer, stack.stack, equalityTypes); if (craftable > 0) available += craftable / entry.getValue().intValue(); } diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java b/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java index 0cad7c0..42fe70e 100644 --- a/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java @@ -41,6 +41,7 @@ import org.apache.commons.lang3.tuple.Triple; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.*; +import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; @@ -142,19 +143,19 @@ public class ItemTerminalTileEntity extends TileEntity implements INamedContaine PipeNetwork network = PipeNetwork.get(this.world); network.startProfile("terminal_request_item"); this.updateItems(); - int requested = this.requestItemImpl(stack); + int requested = this.requestItemImpl(stack, onItemUnavailable(player)); if (requested > 0) { player.sendMessage(new TranslationTextComponent("info." + PrettyPipes.ID + ".sending", requested, stack.getDisplayName()).setStyle(Style.EMPTY.setFormatting(TextFormatting.GREEN)), UUID.randomUUID()); } else { - player.sendMessage(new TranslationTextComponent("info." + PrettyPipes.ID + ".not_found", stack.getDisplayName()).setStyle(Style.EMPTY.setFormatting(TextFormatting.RED)), UUID.randomUUID()); + onItemUnavailable(player).accept(stack); } network.endProfile(); } - public int requestItemImpl(ItemStack stack) { + public int requestItemImpl(ItemStack stack, Consumer unavailableConsumer) { NetworkItem item = this.networkItems.get(new EquatableItemStack(stack)); Collection locations = item == null ? Collections.emptyList() : item.getLocations(); - Pair, ItemStack> ret = requestItemLater(this.world, this.getConnectedPipe().getPos(), stack, locations, ItemEqualityType.NBT); + Pair, ItemStack> ret = requestItemLater(this.world, this.getConnectedPipe().getPos(), locations, unavailableConsumer, stack, ItemEqualityType.NBT); this.existingRequests.addAll(ret.getLeft()); return stack.getCount() - ret.getRight().getCount(); } @@ -208,7 +209,7 @@ public class ItemTerminalTileEntity extends TileEntity implements INamedContaine return new ItemTerminalContainer(Registry.itemTerminalContainer, window, player, this.pos); } - public static Pair, ItemStack> requestItemLater(World world, BlockPos destPipe, ItemStack stack, Collection locations, ItemEqualityType... equalityTypes) { + public static Pair, ItemStack> requestItemLater(World world, BlockPos destPipe, Collection locations, Consumer unavailableConsumer, ItemStack stack, ItemEqualityType... equalityTypes) { List requests = new ArrayList<>(); ItemStack remain = stack.copy(); PipeNetwork network = PipeNetwork.get(world); @@ -236,7 +237,11 @@ public class ItemTerminalTileEntity extends TileEntity implements INamedContaine } // check for craftable items if (!remain.isEmpty()) - remain = network.requestCraftedItem(destPipe, remain, equalityTypes); + remain = network.requestCraftedItem(destPipe, unavailableConsumer, remain, equalityTypes); return Pair.of(requests, remain); } + + public static Consumer onItemUnavailable(PlayerEntity player) { + return s -> player.sendMessage(new TranslationTextComponent("info." + PrettyPipes.ID + ".not_found", s.getDisplayName()).setStyle(Style.EMPTY.setFormatting(TextFormatting.RED)), UUID.randomUUID()); + } }